diff --git a/docs/code_documentation/2.22.0/.buildinfo b/docs/code_documentation/2.22.0/.buildinfo new file mode 100644 index 00000000..5727ef27 --- /dev/null +++ b/docs/code_documentation/2.22.0/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: e0e190dffa1bb882c7abc054b7772178 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/code_documentation/2.22.0/.doctrees/api.doctree b/docs/code_documentation/2.22.0/.doctrees/api.doctree new file mode 100644 index 00000000..572883d8 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/api.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/aws.doctree b/docs/code_documentation/2.22.0/.doctrees/aws.doctree new file mode 100644 index 00000000..df526559 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/aws.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/data_model.doctree b/docs/code_documentation/2.22.0/.doctrees/data_model.doctree new file mode 100644 index 00000000..bf35dcf4 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/data_model.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/data_quality.doctree b/docs/code_documentation/2.22.0/.doctrees/data_quality.doctree new file mode 100644 index 00000000..19e84b77 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/data_quality.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/deployment.doctree b/docs/code_documentation/2.22.0/.doctrees/deployment.doctree new file mode 100644 index 00000000..1022e318 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/deployment.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/developer_resources.doctree b/docs/code_documentation/2.22.0/.doctrees/developer_resources.doctree new file mode 100644 index 00000000..5b64d31c Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/developer_resources.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/docker.doctree b/docs/code_documentation/2.22.0/.doctrees/docker.doctree new file mode 100644 index 00000000..0bdbc528 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/docker.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/environment.pickle b/docs/code_documentation/2.22.0/.doctrees/environment.pickle new file mode 100644 index 00000000..317cf111 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/environment.pickle differ diff --git a/docs/code_documentation/2.22.0/.doctrees/faq.doctree b/docs/code_documentation/2.22.0/.doctrees/faq.doctree new file mode 100644 index 00000000..7f064dd8 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/faq.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/getting_started.doctree b/docs/code_documentation/2.22.0/.doctrees/getting_started.doctree new file mode 100644 index 00000000..1da9e919 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/getting_started.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/help.doctree b/docs/code_documentation/2.22.0/.doctrees/help.doctree new file mode 100644 index 00000000..ad88a505 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/help.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/index.doctree b/docs/code_documentation/2.22.0/.doctrees/index.doctree new file mode 100644 index 00000000..f2608346 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/index.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/kubernetes_deployment.doctree b/docs/code_documentation/2.22.0/.doctrees/kubernetes_deployment.doctree new file mode 100644 index 00000000..df2c5c02 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/kubernetes_deployment.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/license.doctree b/docs/code_documentation/2.22.0/.doctrees/license.doctree new file mode 100644 index 00000000..4d3a65b9 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/license.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/linux.doctree b/docs/code_documentation/2.22.0/.doctrees/linux.doctree new file mode 100644 index 00000000..3f3a2846 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/linux.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/mapping.doctree b/docs/code_documentation/2.22.0/.doctrees/mapping.doctree new file mode 100644 index 00000000..b224d875 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/mapping.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/matching.doctree b/docs/code_documentation/2.22.0/.doctrees/matching.doctree new file mode 100644 index 00000000..7d078ee3 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/matching.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/migrations.doctree b/docs/code_documentation/2.22.0/.doctrees/migrations.doctree new file mode 100644 index 00000000..7b55d4e2 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/migrations.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules.doctree b/docs/code_documentation/2.22.0/.doctrees/modules.doctree new file mode 100644 index 00000000..d41b263e Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/config.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/config.doctree new file mode 100644 index 00000000..bb3c4f03 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/config.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.cleansing.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.cleansing.doctree new file mode 100644 index 00000000..59b58a14 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.cleansing.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.data.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.data.doctree new file mode 100644 index 00000000..a39e4aab Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.data.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.data_importer.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.data_importer.doctree new file mode 100644 index 00000000..bd58ba3a Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.data_importer.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.doctree new file mode 100644 index 00000000..42d00409 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.features.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.features.doctree new file mode 100644 index 00000000..48e0fb6c Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.features.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.landing.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.landing.doctree new file mode 100644 index 00000000..5825c14a Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.landing.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.landing.management.commands.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.landing.management.commands.doctree new file mode 100644 index 00000000..31bc6398 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.landing.management.commands.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.landing.management.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.landing.management.doctree new file mode 100644 index 00000000..16919a03 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.landing.management.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.lib.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.lib.doctree new file mode 100644 index 00000000..5a20aae5 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.lib.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.lib.mappings.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.lib.mappings.doctree new file mode 100644 index 00000000..de059ed9 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.lib.mappings.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.lib.merging.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.lib.merging.doctree new file mode 100644 index 00000000..64e4c70f Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.lib.merging.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.management.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.management.doctree new file mode 100644 index 00000000..483175a5 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.management.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.managers.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.managers.doctree new file mode 100644 index 00000000..02c82493 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.managers.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.managers.tests.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.managers.tests.doctree new file mode 100644 index 00000000..387f3d6d Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.managers.tests.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.mappings.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.mappings.doctree new file mode 100644 index 00000000..fc03c342 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.mappings.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.models.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.models.doctree new file mode 100644 index 00000000..ee03578e Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.models.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.public.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.public.doctree new file mode 100644 index 00000000..e01d7204 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.public.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.serializers.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.serializers.doctree new file mode 100644 index 00000000..0578644d Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.serializers.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.templatetags.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.templatetags.doctree new file mode 100644 index 00000000..87d91146 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.templatetags.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.test_helpers.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.test_helpers.doctree new file mode 100644 index 00000000..27824c0d Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.test_helpers.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.test_helpers.factory.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.test_helpers.factory.doctree new file mode 100644 index 00000000..74119c35 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.test_helpers.factory.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.test_helpers.factory.lib.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.test_helpers.factory.lib.doctree new file mode 100644 index 00000000..53e13ff9 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.test_helpers.factory.lib.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.tests.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.tests.doctree new file mode 100644 index 00000000..9d25c2dd Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.tests.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.tests.functional.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.tests.functional.doctree new file mode 100644 index 00000000..8728c0e9 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.tests.functional.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.urls.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.urls.doctree new file mode 100644 index 00000000..d75717df Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.urls.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.utils.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.utils.doctree new file mode 100644 index 00000000..2929f451 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.utils.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/modules/seed.views.doctree b/docs/code_documentation/2.22.0/.doctrees/modules/seed.views.doctree new file mode 100644 index 00000000..26ac7ee9 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/modules/seed.views.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/setup_docker.doctree b/docs/code_documentation/2.22.0/.doctrees/setup_docker.doctree new file mode 100644 index 00000000..6aa698f1 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/setup_docker.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/setup_osx.doctree b/docs/code_documentation/2.22.0/.doctrees/setup_osx.doctree new file mode 100644 index 00000000..54f00403 Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/setup_osx.doctree differ diff --git a/docs/code_documentation/2.22.0/.doctrees/translation.doctree b/docs/code_documentation/2.22.0/.doctrees/translation.doctree new file mode 100644 index 00000000..8b7c03ad Binary files /dev/null and b/docs/code_documentation/2.22.0/.doctrees/translation.doctree differ diff --git a/docs/code_documentation/latest/_images/case-a.png b/docs/code_documentation/2.22.0/_images/case-a.png similarity index 100% rename from docs/code_documentation/latest/_images/case-a.png rename to docs/code_documentation/2.22.0/_images/case-a.png diff --git a/docs/code_documentation/latest/_images/case-b.png b/docs/code_documentation/2.22.0/_images/case-b.png similarity index 100% rename from docs/code_documentation/latest/_images/case-b.png rename to docs/code_documentation/2.22.0/_images/case-b.png diff --git a/docs/code_documentation/latest/_images/case-c.png b/docs/code_documentation/2.22.0/_images/case-c.png similarity index 100% rename from docs/code_documentation/latest/_images/case-c.png rename to docs/code_documentation/2.22.0/_images/case-c.png diff --git a/docs/code_documentation/latest/_images/case-d.png b/docs/code_documentation/2.22.0/_images/case-d.png similarity index 100% rename from docs/code_documentation/latest/_images/case-d.png rename to docs/code_documentation/2.22.0/_images/case-d.png diff --git a/docs/code_documentation/latest/_images/data-model.png b/docs/code_documentation/2.22.0/_images/data-model.png similarity index 100% rename from docs/code_documentation/latest/_images/data-model.png rename to docs/code_documentation/2.22.0/_images/data-model.png diff --git a/docs/code_documentation/2.22.0/_sources/api.rst.txt b/docs/code_documentation/2.22.0/_sources/api.rst.txt new file mode 100644 index 00000000..5cfde4e2 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/api.rst.txt @@ -0,0 +1,68 @@ +API +=== + +Authentication +-------------- +Authentication is handled via an encoded authorization token set in a HTTP header. +To request an API token, go to ``/app/#/profile/developer`` and click 'Get a New API Key'. + +Authenticate every API request with your username (email, all lowercase) and the API key via `Basic Auth`_. +The header is sent in the form of ``Authorization: Basic ``, where credentials is the base64 encoding of the email and key joined by a single colon ``:``. + +.. _Basic Auth: https://en.wikipedia.org/wiki/Basic_access_authentication + +Using Python, use the requests library:: + + import requests + + result = requests.get('https://seed-platform.org/api/version/', auth=(user_email, api_key)) + print result.json() + +Using curl, pass the username and API key as follows:: + + curl -u user_email:api_key http://seed-platform.org/api/version/ + +If authentication fails, the response's status code will be 302, redirecting the user to ``/app/login``. + +Payloads +-------- + +Many requests require a JSON-encoded payload and parameters in the query string of the url. A frequent +requirement is including the organization_id of the org you belong to. For example:: + + curl -u user_email:api_key https://seed-platform.org/api/v2/organizations/12/ + +Or in a JSON payload:: + + curl -u user_email:api_key \ + -d '{"organization_id":6, "role": "viewer"}' \ + https://seed-platform.org/api/v2/users/12/update_role/ + +Using Python:: + + params = {'organization_id': 6, 'role': 'viewer'} + result = requests.post('https://seed-platform.org/api/v2/users/12/update_role/', + data=json.dumps(params), + auth=(user_email, api_key)) + print result.json() + +Responses +--------- + +Responses from all requests will be JSON-encoded objects, as specified in each endpoint's documentation. +In the case of an error, most endpoints will return this instead of the expected payload (or an HTTP status code):: + + { + "status": "error", + "message": "explanation of the error here" + } + +API Endpoints +------------- + +A list of interactive endpoints are available by accessing the API menu item on the left navigation +pane within you account on your SEED instance. + +To view a list of non-interactive endpoints without an account, view swagger_ on the development server. + +.. _swagger: https://seed-platform.org/api/swagger/ diff --git a/docs/code_documentation/2.22.0/_sources/aws.rst.txt b/docs/code_documentation/2.22.0/_sources/aws.rst.txt new file mode 100644 index 00000000..eccace1f --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/aws.rst.txt @@ -0,0 +1,183 @@ +========= +AWS Setup +========= + +Amazon Web Services (`AWS`_) provides the preferred hosting for the SEED Platform. + +**seed** is a `Django Project`_ and Django's documentation is an excellent place for general +understanding of this project's layout. + +.. _Django Project: https://www.djangoproject.com/ + +.. _AWS: http://aws.amazon.com/ + +Prerequisites +^^^^^^^^^^^^^ + +Ubuntu server 18.04 LTS + +.. note:: These instructions have not been updated for Ubuntu 18.04. It is recommended to use Docker-based deployments. + +.. code-block:: console + + sudo apt-get update + sudo apt-get upgrade + sudo apt-get install -y libpq-dev python-dev python-pip libatlas-base-dev \ + gfortran build-essential g++ npm libxml2-dev libxslt1-dev git mercurial \ + libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python + + +PostgreSQL and Redis are not included in the above commands. For a quick installation on AWS it +is okay to install PostgreSQL and Redis locally on the AWS instance. If a more permanent and +scalable solution, it is recommended to use AWS's hosted Redis (ElastiCache) and PostgreSQL service. + +.. note:: postgresql ``>=9.4`` is required to support `JSON Type`_ + +.. code-block:: console + + # To install PostgreSQL and Redis locally + sudo apt-get install redis-server + sudo apt-get install postgresql postgresql-contrib + +.. _`JSON Type`: https://www.postgresql.org/docs/9.4/datatype-json.html + +Amazon Web Services (AWS) Dependencies +++++++++++++++++++++++++++++++++++++++ + +The following AWS services can be used for **SEED** but are not required: + +* RDS (PostgreSQL >=9.4) +* ElastiCache (redis) +* SES + + +Python Dependencies +^^^^^^^^^^^^^^^^^^^ + +Clone the **SEED** repository from **github** + +.. code-block:: console + + $ git clone git@github.com:SEED-platform/seed.git + +enter the repo and install the python dependencies from `requirements`_ + +.. _requirements: https://github.com/SEED-platform/seed/blob/main/requirements/aws.txt + +.. code-block:: console + + $ cd seed + $ sudo pip install -r requirements/aws.txt + + +JavaScript Dependencies +^^^^^^^^^^^^^^^^^^^^^^^ + +``npm`` is required to install the JS dependencies. + +.. code-block:: console + + $ sudo apt-get install build-essential + $ sudo apt-get install curl + + +.. code-block:: console + + $ npm install + + +Database Configuration +^^^^^^^^^^^^^^^^^^^^^^ + +Copy the ``local_untracked.py.dist`` file in the ``config/settings`` directory to +``config/settings/local_untracked.py``, and add a ``DATABASES`` configuration with your database username, +password, host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database +instance you have manually installed within your infrastructure. + +.. code-block:: python + + # Database + DATABASES = { + 'default': { + 'ENGINE':'django.db.backends.postgresql_psycopg2', + 'NAME': 'seed', + 'USER': '', + 'PASSWORD': '', + 'HOST': '', + 'PORT': '', + } + } + + +.. note:: + + In the above database configuration, ``seed`` is the database name, this + is arbitrary and any valid name can be used as long as the database exists. + +create the database within the postgres ``psql`` shell: + +.. code-block:: psql + + CREATE DATABASE seed; + +or from the command line: + +.. code-block:: console + + createdb seed + + +create the database tables and migrations: + +.. code-block:: console + + python manage.py syncdb + python manage.py migrate + + +create a superuser to access the system + +.. code-block:: console + + $ python manage.py create_default_user --username=demo@example.com --organization=example --password=demo123 + + +.. note:: + + Every user must be tied to an organization, visit ``/app/#/profile/admin`` + as the superuser to create parent organizations and add users to them. + +Cache and Message Broker +^^^^^^^^^^^^^^^^^^^^^^^^ + +The SEED project relies on `redis`_ for both cache and message brokering, and +is available as an AWS `ElastiCache`_ service. +``local_untracked.py`` should be updated with the ``CACHES`` and ``CELERY_BROKER_URL`` +settings. + +.. _ElastiCache: https://aws.amazon.com/elasticache/ + +.. _redis: http://redis.io/ + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://seed-core-cache.ntmprk.0001.usw2.cache.amazonaws.com:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + +Running Celery the Background Task Worker +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +`Celery`_ is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, ``celery`` +can be started: + +.. code-block:: console + + celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler + +.. _Celery: http://www.celeryproject.org/ diff --git a/docs/code_documentation/2.22.0/_sources/data_model.rst.txt b/docs/code_documentation/2.22.0/_sources/data_model.rst.txt new file mode 100644 index 00000000..c7e2ea1f --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/data_model.rst.txt @@ -0,0 +1,415 @@ +Data Model +========== + +.. image:: images/case-a.png + +.. image:: images/case-b.png + +.. image:: images/case-c.png + +.. image:: images/case-d.png + +.. image:: images/data-model.png + + +.. todo:: Documentation below is out of state and needs updated. + +Our primary data model is based on a tree structure with BuildingSnapshot +instances as nodes of the tree and the tip of the tree referenced by a +CanonicalBuilding. + +Take the following example: a user has loaded a CSV file containing information +about one building and created the first BuildingSnapshot (BS0). At this point +in time, BS0 is linked to the first CanonicalBuilding (CB0), and CB0 is also +linked to BS0. + +.. code-block:: shell + + BS0 <-- CB0 + BS0 --> CB0 + +These relations are represented in the database as foreign keys from the +BuildingSnapshot table to the CanonicalBuilding table, and from the +CanonicalBuilding table to the BuildingSnapshot table. + +The tree structure comes to fruition when a building, BS0 in our case, is +matched with a new building, say BS1, enters the system and is auto-matched. + +Here BS1 entered the system and was matched with BS0. When a match occurs, +a new BuildingSnapshot is created, BS2, with the fields from the existing +BuildingSnapshot, BS0, and the new BuildingSnapshot, BS1, merged +together. If both the existing and new BuildingSnapshot have data for a +given field, the new record's fields are preferred and merged into the child, B3. + +The fields from new snapshot are preferred because that is the newer of the +two records from the perspective of the system. By preferring the most recent fields +this allows for evolving building snapshots over time. For example, if an existing +canonical record has a Site EUI value of 75 and some changes happen to a building +that cause this to change to 80 the user can submit a new record with that change. + +All BuildingSnapshot instances point to a CanonicalBuilding. + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 <-- CB0 + + BS0 --> CB0 + BS1 --> CB0 + BS2 --> CB0 + + +parents and children +^^^^^^^^^^^^^^^^^^^^ + +BuildingSnapshots also have linkage to other BuildingSnapshots in order to +keep track of their *parents* and *children*. This is represented in the +Django model as a many-to-many relation from BuildingSnapshot to BuildingSnapshot. +It is represented in the PostgreSQL database as an additional seed_buildingsnapshot_children +table. + + +In our case here, BS0 and BS1 would both have *children* BS2, and BS2 would +have *parents* BS0 and BS1. + +.. note:: + + throughout most of the application, the ``search_buildings`` endpoint + is used to search or list active building. This is to say, buildings that + are pointed to by an active CanonicalBuilding. + The ``search_mapping_results`` endpoint allows the search of buildings + regardless of whether the BuildingSnapshot is pointed to by an active + CanonicalBuilding or not and this search is needed during the mapping + preview and matching sections of the application. + + + +For illustration purposes let's suppose BS2 and a new building BS3 match to form a child BS4. + ++--------+-------+ +| parent | child | ++========+=======+ +| BS0 | BS2 | ++--------+-------+ +| BS1 | BS2 | ++--------+-------+ +| BS2 | BS4 | ++--------+-------+ +| BS3 | BS4 | ++--------+-------+ + + +And the corresponding tree would look like: + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 BS3 + \ / + BS4 <-- CB0 + + BS0 --> CB0 + BS1 --> CB0 + BS2 --> CB0 + BS3 --> CB0 + BS4 --> CB0 + +matching +-------- + +During the auto-matching process, if a *raw* BuildingSnapshot matches an +existing BuildingSnapshot instance, then it will point to the existing +BuildingSnapshot instance's CanonicalBuilding. In the case where there is no +existing BuildingSnapshot to match, a new CanonicalBuilding will be created, as +happened to B0 and C0 above. + ++-------+--------+--------+-------------+ +| field | BS0 | BS1 | BS2 (child) | ++=======+========+========+=============+ +| id1 | **11** | 11 | 11 | ++-------+--------+--------+-------------+ +| id2 | | **12** | 12 | ++-------+--------+--------+-------------+ +| id3 | **13** | | 13 | ++-------+--------+--------+-------------+ +| id4 | 14 | **15** | 15 | ++-------+--------+--------+-------------+ + + +manual-matching vs auto-matching +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Since BuildingSnapshots can be manually matched, there is the possibility for +two BuildingSnapshots each with an active CanonicalBuilding to match and the +system has to choose to move only one CanonicalBuilding to the tip of the tree +for the primary BuildingSnapshot and *deactivate* the secondary +BuildingSnapshot's CanonicalBuilding. + +Take for example: + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 BS3 + \ / + BS4 <-- CB0 (active: True) BS5 <-- CB1 (active: True) + +If a user decides to manually match BS4 and BS5, the system will take the +primary BuildingSnapshot's CanonicalBuilding and have it point to their +child and deactivate CB1. The deactivation is handled by setting a field +on the CanonicalBuilding instance, *active*, from ``True`` to ``False``. + +Here is what the tree would look like after the manual match of **BS4** and +**BS5**: + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 BS3 + \ / + BS4 BS5 <-- CB1 (active: False) + \ / + BS6 <-- CB0 (active: True) + +Even though BS5 is pointed to by a CanonicalBuilding, CB1, BS5 will not be +returned by the normal ``search_buildings`` endpoint because the +CanonicalBuilding pointing to it has its field ``active`` set to ``False``. + +.. note:: + anytime a match is **unmatched** the system will create a new + CanonicalBuilding or set an existing CanonicalBuilding's active field to + ``True`` for any leaf BuildingSnapshot trees. + +what really happens to the BuildingSnapshot table on import (and when) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The above is conceptually what happens but sometimes the devil is in the details. +Here is what happens to the BuildingSnapshot table in the database when records +are imported. + +Every time a record is added at least two BuildingSnapshot records are created. + +Consider the following simple record: + ++-------------+-------------+---------------------+-----------+--------------+ +| Property Id | Year Ending | Property Floor Area | Address 1 | Release Date | ++=============+=============+=====================+===========+==============+ +| 499045 | 2000 | 1234 | 1 fake st | 12/12/2000 | ++-------------+-------------+---------------------+-----------+--------------+ + +The first thing the user is upload the file. When the user sees the +"Successful Upload!" dialog one record has been added to the +BuildingSnapshot table. + +This new record has an id (73700 in this case) and a created and +modified timestamp. Then there are a lot of empty fields and a +source_type of 0. Then there is the extra_data column which contains +the contents of the record in key-value form: + +:Address 1: "1 fake st" +:Property Id: "499045" +:Year Ending: "2000" +:Release Date: "12/12/2000" +:Property Floor Area: "1234" + +And a corresponding extra_data_sources that looks like + +:Address 1: 73700 +:Property Id: 73700 +:Year Ending: 73700 +:Release Date: 73700 +:Property Floor Area: 73700 + + +All of the fields that look like _source_id are also populated +with 73700 E.G. owner_postal_code_source_id. + +The other fields of interest are the organization field which +is populated with the user's default organization and the import_file_id +field which is populated with a reference to a data_importer_importfile record. + +At this point the record has been created before the user hits the +"Continue to data mapping" button. + +The second record (id = 73701) is created by the time the user gets to the screen +with the "Save Mappings" button. This second record has the following fields populated: + +- id +- created +- modified +- pm_property_id +- year_ending +- gross_floor_area +- address_line_1 +- release_date +- source_type (this is 2 instead of 0 as with the other record) +- import_file_id +- organization_id. + +That is all. All other fields are empty. In this case that is all that happens. + +Now consider the same user uploading a new file from the next year that looks like + ++-------------+-------------+---------------------+-----------+--------------+ +| Property Id | Year Ending | Property Floor Area | Address 1 | Release Date | ++=============+=============+=====================+===========+==============+ +| 499045 | 2000 | 1234 | 1 fake st | 12/12/2001 | ++-------------+-------------+---------------------+-----------+--------------+ + +As before one new record is created on upload. This has id 73702 and follows the same +pattern as 73700. And similarly 73703 is created like 73701 before the "Save Mappings" +button appears. + +However this time the system was able to make a match with an existing record. +After the user clicks the "Confirm mappings & start matching" button a new record +is created with ID 73704. + +73704 is identical to 73703 (in terms of contents of the BuildingSnapshot table only) +with the following exceptions: + +- created and modified timestamps are different +- match type is populated and has a value of 1 +- confidence is populated and has a value of .9 +- source_type is 4 instead of 2 +- canonical_building_id is populated with a value +- import_file_id is NULL +- last_modified_by_id is populated with value 2 (This is a key into the landing_seeduser table) +- address_line_1_source_id is 73701 +- gross_floor_area_source_id is populated with value 73701 +- pm_property_id_source_id is populated with 73701 +- release_date_source_id is populated with 73701 +- year_ending_source_id is populated with 73701 + +what really happens to the CanonicalBuilding table on import (and when) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In addition to the BuildingSnapshot table the CanonicalBuilding table is also updated +during the import process. To summarize the above 5 records were created in the +BuildingSnapshot table: + +1. 73700 is created from the raw 2000 data +2. 73701 is the mapped 2000 data, +3. 73702 is created from the raw 2001 data +4. 73703 is the mapped 2001 data +5. 73704 is the result of merging the 2000 and 2001 data. + +In this process CanonicalBuilding is updated twice. First when the 2000 record is imported the +CanonicalBuilding gets populated with one new row at the end of the matching step. +I.E. when the user sees the "Load More Data" screen. At this point there is a new row that looks like + ++--------+--------+-----------------------+ +| id | active | canonical_building_id | ++========+========+=======================+ +| 20505 | TRUE | 73701 | ++--------+--------+-----------------------+ + +At this point there is one new canonical building and that is the BuildingSnapshot with +id 73701. Next the user uploads the 2001 data. When the "Matching Results" screen +appears the CanonicalBuilding table has been updated. Now it looks like + ++--------+--------+-----------------------+ +| id | active | canonical_building_id | ++========+========+=======================+ +| 20505 | TRUE | 73704 | ++--------+--------+-----------------------+ + +There is still only one canonical building but now it is the BuildingSnapshot record +that is the result of merging the 2000 and 2001 data: id = 73704. + +organization +^^^^^^^^^^^^ + +BuildingSnapshots belong to an Organization field that is a foreign key into the organization +model (orgs_organization in Postgres). + +Many endpoints filter the buildings based on the organizations the requesting user +belongs to. E.G. get_buildings changes which fields are returned based on the +requesting user's membership in the BuildingSnapshot's organization. + +\*_source_id fields +^^^^^^^^^^^^^^^^^^^ + +Any field in the BuildingSnapshot table that is populated with data from a +submitted record will have a corresponding _source_id field. E.G +pm_property_id has pm_property_id_source_id, +address_line_1 has address_line_1_source_id, +etc... + +These are foreign keys into the BuildingSnapshot that is the source of that +value. To extend the above table + ++-------+--------+--------+-------------+------------------------+ +| field | BS0 | BS1 | BS2 (child) | BS2 (child) _source_id | ++=======+========+========+=============+========================+ +| id1 | **11** | | 11 | BS0 | ++-------+--------+--------+-------------+------------------------+ +| id2 | | **12** | 12 | BS1 | ++-------+--------+--------+-------------+------------------------+ + +**NOTE:** The BuildingSnapshot records made from the raw input file have all the +_source_id fields populated with that record's ID. The non-canonical BuildingSnapshot +records created from the mapped data have none set. The canonical BuildingSnapshot +records that are the result of merging two records have only the _source_id fields +set where the record itself has data. E.G. in the above address_line_1 is set to +"1 fake st." so there is a value in the canonical BuildingSnapshot's address_line_1_source_id +field. However there is no block number so block_number_source_id is empty. This +is unlike the two raw BuildingSnapshot records who also have no block_number but +nevertheless have a block_number_source_id populated. + +extra_data +^^^^^^^^^^ + +The BuildingSnapshot model has many "named" fields. Fields like "address_line_1", +"year_built", and "pm_property_id". However the users are allowed to submit files +with arbitrary fields. Some of those arbitrary fields can be mapped to "named" +fields. E.G. "Street Address" can usually be mapped to "Address Line 1". +For all the fields that cannot be mapped like that there is the extra_data field. + +extra_data is Django json field that serves as key-value storage for other +user-submitted fields. As with the other "named" fields there is a corresponding +extra_data_sources field that serves the same role as the other _source_id fields. +E.G. If a BuildingSnapshot has an extra_data field that looks like + +:an_unknown_field: 1 +:something_else: 2 + +It should have an extra_data_sources field that looks like + +:an_unknown_field: some_BuildingSnapshot_id +:something_else: another_BuildingSnapshot_id + +saving and possible data loss +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When saving a Property file some fields that are truncated if too long. +The following are truncated to 255 characters + +- jurisdiction_tax_lot_id +- pm_property_id +- custom_id_1 +- ubid +- lot_number +- block_number +- district +- owner +- owner_email +- owner_telephone +- owner_address +- owner_city_state +- owner_postal_code + +And the following are truncated to 255: + +- property_name +- address_line_1 +- address_line_2 +- city +- postal_code +- state_province +- building_certification + +No truncation happens to any of the fields stored in extra_data. diff --git a/docs/code_documentation/2.22.0/_sources/data_quality.rst.txt b/docs/code_documentation/2.22.0/_sources/data_quality.rst.txt new file mode 100644 index 00000000..49e06799 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/data_quality.rst.txt @@ -0,0 +1,9 @@ +Data Quality +============ + +Data quality checks are run after the data are paired, during import of Properties/TaxLots, or on-demand by selecting rows in the inventory +page and clicking the action button. This checks whether any default or user-defined Rules are broken or satisfied by Property/TaxLot records. + +Notably, in most cases when data quality checks are run, Labels can be applied for any broken Rules that have a Label. +To elaborate, Rules can have an attached Label. When a data quality check is run, records that break one of these "Labeled Rules" +are then given that Label. The case where this Label attachment does not happen is during import due to performance reasons. diff --git a/docs/code_documentation/2.22.0/_sources/deployment.rst.txt b/docs/code_documentation/2.22.0/_sources/deployment.rst.txt new file mode 100644 index 00000000..e2e3d347 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/deployment.rst.txt @@ -0,0 +1,57 @@ +Deployment Guide +================ + +SEED is intended to be installed on Linux instances in the cloud (e.g., AWS), and on local hardware. SEED Platform does not officially support Windows for production deployment. If this is desired, see the Django `notes`_. + +.. _notes: https://docs.djangoproject.com/en/1.7/howto/windows/ + +.. toctree:: + :maxdepth: 2 + + aws + linux + docker + kubernetes_deployment + +Migrations +---------- + +Migrations are handles through Django; however, various versions have customs actions for the migrations. See the :doc:`migrations page ` for more information. + + +Monitoring +---------- + +Sentry +^^^^^^ + +Sentry can monitor your webservers for any issues. To enable sentry add the following to +your local_untracked.py files after setting up your Sentry account on sentry.io. + +The RAVEN_CONFIG is used for the backend and the SENTRY_JS_DSN is used for the frontend. At the moment, +it is recommended to setup two sentry projects, one for backend and one for frontend. + +.. code-block:: python + + import sentry_sdk + from sentry_sdk.integrations.django import DjangoIntegration + from sentry_sdk.integrations.celery import CeleryIntegration + + sentry_sdk.init( + dsn="https://@.ingest.sentry.io/", + integrations=[ + DjangoIntegration(), + CeleryIntegration(), + ], + + # Set traces_sample_rate to 1.0 to capture 100% + # of transactions for performance monitoring. + # We recommend adjusting this value in production. + traces_sample_rate=1.0, + + # If you wish to associate users to errors (assuming you are using + # django.contrib.auth) you may enable sending PII data. + send_default_pii=True + ) + + SENTRY_JS_DSN = 'https://@sentry.io/' diff --git a/docs/code_documentation/2.22.0/_sources/developer_resources.rst.txt b/docs/code_documentation/2.22.0/_sources/developer_resources.rst.txt new file mode 100644 index 00000000..48484641 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/developer_resources.rst.txt @@ -0,0 +1,468 @@ +Developer Resources +=================== + +.. toctree:: + migrations + translation + +General Notes +------------- + +Pre-commit +^^^^^^^^^^ +We use precommit commits for formatting. Set it up locally with + +.. code-block:: bash + + pre-commit install + +Flake Settings +^^^^^^^^^^^^^^ + +Flake is used to statically verify code syntax. If the developer is running +flake from the command line, they should ignore the following checks in order +to emulate the same checks as the CI machine. + ++------+--------------------------------------------------+ +| Code | Description | ++======+==================================================+ +| E402 | module level import not at top of file | ++------+--------------------------------------------------+ +| E501 | line too long (82 characters) or max-line = 100 | ++------+--------------------------------------------------+ +| E731 | do not assign a lambda expression, use a def | ++------+--------------------------------------------------+ +| W503 | line break occurred before a binary operator | ++------+--------------------------------------------------+ +| W504 | line break occurred after a binary operator | ++------+--------------------------------------------------+ + +To run flake locally call: + +.. code-block:: bash + + tox -e flake8 + +Python Type Hints +^^^^^^^^^^^^^^^^^ + +Python type hints are beginning to be added to the SEED codebase. The benefits are +eliminating some accidental typing mistakes to prevent bugs as well as a better IDE +experience. + +Usage +***** + +SEED does not require exhaustive type annotations, but it is recommended you add them if you +create any new functions or refactor any existing code where it might be beneficial (e.g. types +that appear ambiguous or that the IDE can't determine) and not require a ton of additional effort. + +When applicable, we recommend you use `built-in collection types `_ +such as :code:`list`, :code:`dict` or :code:`tuple` instead of the capitalized types +from the :code:`typing` module. You can also use ``TypedDict`` and ``NotRequired`` from the ``typing_extensions`` +package to specify the types of required/optional keys of dictionaries. + +Common gotchas: + +- If trying to annotate a class method with the class itself, import :code:`from __future__ import annotations` +- If you're getting warnings about runtime errors due to a type name, make sure your IDE is set up to point to an environment with python 3.9 +- If you're wasting time trying to please the type checker, feel free to throw :code:`# type: ignore` on the problematic line (or at the top of the file to ignore all issues for that file) + +Type Checking +************* + +CI currently runs static type checking on the codebase using `mypy `_. For +your own IDE, we recommend the following extensions: + +- VSCode: `Pylance `_ (uses Microsoft's Pyright type checking) + +To run the same typechecking applied in CI (i.e., using mypy) you can run the following + +.. code-block:: bash + + tox -e mypy + + +Django Notes +------------ + +Adding New Fields to Database +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Adding new fields to SEED can be complicated since SEED has a mix of typed fields (database fields) and extra data +fields. Follow the steps below to add new fields to the SEED database: + +#. Add the field to the PropertyState or the TaxLotState model. Adding fields to the Property or TaxLot models is more complicated and not documented yet. +#. Add field to list in the following locations: + +- models/columns.py: Column.DATABASE_COLUMNS +- TaxLotState.coparent or PropertyState.coparent: SQL query and keep_fields + +#. Run `./manage.py makemigrations` +#. Add in a Python script in the new migration to add in the new column into every organizations list of columns. Note that the new_db_fields will be the same as the data in the Column.DATABASE_COLUMNS that were added. + + .. code-block:: python + + def forwards(apps, schema_editor): + Column = apps.get_model("seed", "Column") + Organization = apps.get_model("orgs", "Organization") + + new_db_fields = [ + { + 'column_name': 'geocoding_confidence', + 'table_name': 'PropertyState', + 'display_name': 'Geocoding Confidence', + 'column_description': 'Geocoding Confidence', + 'data_type': 'number', + }, { + 'column_name': 'geocoding_confidence', + 'table_name': 'TaxLotState', + 'display_name': 'Geocoding Confidence', + 'column_description': 'Geocoding Confidence', + 'data_type': 'number', + } + ] + + # Go through all the organizations + for org in Organization.objects.all(): + for new_db_field in new_db_fields: + columns = Column.objects.filter( + organization_id=org.id, + table_name=new_db_field['table_name'], + column_name=new_db_field['column_name'], + is_extra_data=False, + ) + + if not columns.count(): + new_db_field['organization_id'] = org.id + Column.objects.create(**new_db_field) + elif columns.count() == 1: + # If the column exists, then update the display_name and data_type if empty + c = columns.first() + if c.display_name is None or c.display_name == '': + c.display_name = new_db_field['display_name'] + if c.data_type is None or c.data_type == '' or c.data_type == 'None': + c.data_type = new_db_field['data_type'] + for col in columns: + # If the column exists, then update the column_description if empty + if c.column_description is None or c.column_description == '': + c.column_description = new_db_field['column_description'] + c.save() + else: + print(" More than one column returned") + + + class Migration(migrations.Migration): + dependencies = [ + ('seed', '0090_auto_20180425_1154'), + ] + + operations = [ + ... existing db migrations ..., + migrations.RunPython(forwards), + ] + + +#. Run migrations `./manage.py migrate` +#. Run unit tests, fix failures. Below is a list of files that need to be fixed (this is not an exhaustive list) + +- test_mapping_data.py:test_keys +- test_columns.py:test_column_retrieve_schema +- test_columns.py:test_column_retrieve_db_fields + +#. (Optional) Update example files to include new fields +#. Test import workflow with mapping to new fields + + +NGINX Notes +----------- + +Toggle *maintenance mode* to display a maintenance page and prevent access to all site resources including API endpoints: + +.. code-block:: bash + + docker exec seed_web ./docker/maintenance.sh on + docker exec seed_web ./docker/maintenance.sh off + + +AngularJS Integration Notes +--------------------------- + +Template Tags +^^^^^^^^^^^^^ + +Angular and Django both use `{{` and `}}` as variable delimiters, and thus the AngularJS variable delimiters are +renamed `{$` and `$}`. + +.. code-block:: JavaScript + + window.BE.apps.seed = angular.module('BE.seed', ['$interpolateProvider', ($interpolateProvider) => { + $interpolateProvider.startSymbol('{$'); + $interpolateProvider.endSymbol('$}'); + }]); + +Django CSRF Token and AJAX Requests +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For ease of making angular `$http` requests, we automatically add the CSRF token to all `$http` requests as +recommended by http://django-angular.readthedocs.io/en/latest/integration.html#xmlhttprequest + +.. code-block:: JavaScript + + window.BE.apps.seed.run(($http, $cookies) => { + $http.defaults.headers.common['X-CSRFToken'] = $cookies['csrftoken']; + }); + + +Routes and Partials or Views +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Routes in `static/seed/js/seed.js` (the normal angularjs `app.js`) + + +.. code-block:: JavaScript + + SEED_app.config(['stateHelperProvider', '$urlRouterProvider', '$locationProvider', (stateHelperProvider, $urlRouterProvider, $locationProvider) => { + stateHelperProvider + .state({ + name: 'home', + url: '/', + templateUrl: static_url + 'seed/partials/home.html' + }) + .state({ + name: 'profile', + url: '/profile', + templateUrl: static_url + 'seed/partials/profile.html', + controller: 'profile_controller', + resolve: { + auth_payload: ['auth_service', '$q', 'user_service', function (auth_service, $q, user_service) { + var organization_id = user_service.get_organization().id; + return auth_service.is_authorized(organization_id, ['requires_superuser']); + }], + user_profile_payload: ['user_service', function (user_service) { + return user_service.get_user_profile(); + }] + } + }); + }]); + +HTML partials in `static/seed/partials/` + +Logging +------- + +Information about error logging can be found here - https://docs.djangoproject.com/en/1.7/topics/logging/ + +Below is a standard set of error messages from Django. + +A logger is configured to have a log level. This log level describes the severity of +the messages that the logger will handle. Python defines the following log levels: + +.. code-block:: bash + + DEBUG: Low level system information for debugging purposes + INFO: General system information + WARNING: Information describing a minor problem that has occurred. + ERROR: Information describing a major problem that has occurred. + CRITICAL: Information describing a critical problem that has occurred. + +Each message that is written to the logger is a Log Record. The log record is stored +in the web server & Celery + + +BEDES Compliance and Managing Columns +------------------------------------- + +Columns that do not represent hardcoded fields in the application are represented using +a Django database model defined in the seed.models module. The goal of adding new columns +to the database is to create seed.models.Column records in the database for each column to +import. Currently, the list of Columns is dynamically populated by importing data. + +There are default mappings for ESPM are located here: + + https://github.com/SEED-platform/seed/blob/develop/seed/lib/mappings/data/pm-mapping.json + + +Resetting the Database +---------------------- + +This is a brief description of how to drop and re-create the database +for the seed application. + +The first two commands below are commands distributed with the +Postgres database, and are not part of the SEED application. The third +command below will create the required database tables for SEED and +setup initial data that the application expects (e.g. initial columns for +BEDES). The last command below (spanning multiple lines) will create a +new superuser and organization that you can use to login to the +application, and from there create any other users or organizations +that you require. + +Below are the commands for resetting the database and creating a new +user: + +.. code-block:: bash + + createuser -U seed seeduser + + psql -d postgres -U seeduser -c 'DROP DATABASE seed;' + psql -d postgres -U seeduser -c 'CREATE DATABASE seed;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;' + + ./manage.py migrate + ./manage.py create_default_user \ + --username=demo@seed-platform.org \ + --password=password \ + --organization=testorg + +Restoring a Database Dump +------------------------- + +.. code-block:: bash + + psql -d postgres -U seeduser -c 'DROP DATABASE seed;' + psql -d postgres -U seeduser -c 'CREATE DATABASE seed;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;' + psql -d seed -U seeduser -c 'SELECT timescaledb_pre_restore();' + + # restore a previous database dump (must be pg_restore 12+) + pg_restore -d seed -U seeduser /backups/prod-backups/prod_20191203_000002.dump + # if any errors appear during the pg_restore process check that the `installed_version` of the timescaledb extension where the database was dumped matches the extension version where it's being restored + # `SELECT default_version, installed_version FROM pg_available_extensions WHERE name = 'timescaledb';` + + psql -d seed -U seeduser -c 'SELECT timescaledb_post_restore();' + + ./manage.py migrate + + # if needed add a user to the database + ./manage.py create_default_user \ + --username=demo@seed-platform.org \ + --password=password \ + --organization=testorg + +If restoring a production backup to a different deployment update the site settings for password reset emails, and disable celerybeat Salesforce updates/emails: + +.. code-block:: bash + + ./manage.py shell + + from django.contrib.sites.models import Site + site = Site.objects.first() + site.domain = 'dev1.seed-platform.org' + site.name = 'SEED Dev1' + site.save() + + from seed.models import Organization + Organization.objects.filter(salesforce_enabled=True).update(salesforce_enabled=False) + + from django_celery_beat.models import PeriodicTask, PeriodicTasks + PeriodicTask.objects.filter(enabled=True, name__startswith='salesforce_sync_org-').update(enabled=False) + PeriodicTasks.update_changed() + + +Migrating the Database +---------------------- + +Migrations are handles through Django; however, various versions have customs actions for the migrations. See the :doc:`migrations page ` for more information based on the version of SEED. + + +Testing +------- + +JS tests can be run with Jasmine at the url `/angular_js_tests/`. + +Python unit tests are run with + +.. code-block:: bash + + python manage.py test --settings=config.settings.test + +Note on geocode-related testing: + Most of these tests use VCR.py and cassettes to capture and reuse recordings of HTTP requests and responses. Given that, unless you want to make changes and/or refresh the cassettes/recordings, there isn't anything needed to run the geocode tests. + + In the case that the geocoding logic/code is changed or you'd like to the verify the MapQuest API is still working as expected, you'll need to run the tests with a small change. Namely, you'll want to provide the tests with an API key via an environment variable called "TESTING_MAPQUEST_API_KEY" or within your local_untracked.py file with that same variable name. + + In order to refresh the actual cassettes, you'll just need to delete or move the old ones which can be found at ".seed/tests/data/vcr_cassettes". The API key should be hidden within the cassettes, so these new cassettes can and should be pushed to GitHub. + +Run coverage using + +.. code-block:: bash + + coverage run manage.py test --settings=config.settings.test + coverage report --fail-under=83 + +Python compliance uses PEP8 with flake8 + +.. code-block:: bash + + flake8 + # or + tox -e flake8 + +JS Compliance uses ESLint + +.. code-block:: bash + + npm run lint + npm run lint:fix + +Building Documentation +---------------------- + +Older versions of the source code documentation are (still) on readthedocs; however, newer versions are built and pushed to the seed-website repository manually. To build the documentation follow the script below: + +.. code-block:: bash + + cd docs + rm -rf htmlout + sphinx-build -b html source htmlout + +For releasing, copy the ``htmlout`` directory into the seed-platform's website repository under ``docs/code_documentation/``. Make sure to add the new documentation to the table in the ``docs/developer_resources.md``. + +Contribution Instructions / Best Practices +------------------------------------------ + +If this is the first time contributing and you are outside of the DOE National Lab system, then you will need to review and fill out the contribution agreement which is found in `SEED's Contribution Agreement in the GitHub repository`_ + +The desired workflow for development and submitting changes is the following: + +#. Fork the repository on GitHub if you do not have access to the repository, otherwise, work within the https://github.com/seed-platform/seed repository. +#. Ensure there is a ticket/issue created for the work you are doing. Verify that the ticket is assigned to you and that it is part of the latest project board on the GitHub site (https://github.com/orgs/SEED-platform/projects). +#. Move the ticket/issue to 'In Progress' in the GitHub project tracker when you begin work +#. Create a branch off of develop (unless it is a hotfix, then branch of the appropriate tag). The recommended naming convention is -short-descriptive-name. +#. Make changes and write a test for the code added. +#. Make sure tests pass locally. Most branches created and pushed to GitHub will be tested automatically. +#. Upon completion of the work, create a pull request (PR) against the develop branch (or hotfix branch if applicable). In the PR description fill out the requested information and include the issue number (e.g., #1234). +#. Assign one label to the PR (not the ticket/issue) in order to auto-populate change logs (e.g., Bug, Feature, Maintenance, Performance, DoNotPublish) This is required and CI will fail if not present. + * **Bug** (these will appear as "Bug Fixes" in the change log) + * **Feature** (features will appear as “New Features” item in the change log) + * **Enhancement** (these will appear as “Improvements" in the change log) + * **Maintenance** (these will appear under “Maintenance" in the change log) + * **Performance** (these will appear under “Maintenance" in the change log) + * **Documentation** (these will appear under “Maintenance" in the change log) + * **Do not publish** (these will no appear in the change log) +#. Ensure all tests pass. +#. Assign a reviewer to the PR. +#. If the reviewer requests changes, then addresses changes and re-assign the reviewer as needed. +#. Once approved, merge the PR! +#. Move the related ticket(s)/issue(s) to the 'Ready to Deploy' column in the GitHub project tracker. + +Release Instructions +-------------------- + +To make a release do the following: + +#. Create a branch from develop to prepare the updates (e.g., 2.21.0-release-prep). +#. Update the root ``package.json`` file with the release version number, and then run ``npm install``. Always use MAJOR.MINOR.RELEASE. +#. Update the ``docs/sources/migrations.rst`` file with any required actions. +#. Commit the changes and push the release prep branch to GitHub, then go to the Releases page to draft a new release which will generate the changelog. +#. Copy the GitHub changelog results into ``CHANGELOG.md``. Cleanup the formatting and items as needed (make sure the spelling is correct, starts with a capital letter, if any PRs were missing the ``Do not publish`` label, etc.) and push the changelog update. +#. Make sure that any new UI needing localization has been tagged for translation, and that any new translation keys exist in the lokalise.com project. (see :doc:`translation documentation `). +#. Create PR for release preparation and merge after tests/reviews pass. +#. Create a new Release using the develop branch and new release number as the tag (https://github.com/SEED-platform/seed/releases). Include list of changes since previous release (e.g., the additions to ``CHANGELOG.md``). +#. Locally, merge the ``develop`` branch into the ``main`` branch and push. +#. Verify that the Docker versions are built and pushed to Docker Hub (https://hub.docker.com/r/seedplatform/seed/tags/). +#. Publish the new documentation in the seed-platform website repository (see instructions above under Building Documentation). + +.. _`SEED's Contribution Agreement in the GitHub repository`: https://github.com/SEED-platform/seed/blob/develop/.github/CONTRIBUTING.md diff --git a/docs/code_documentation/2.22.0/_sources/docker.rst.txt b/docs/code_documentation/2.22.0/_sources/docker.rst.txt new file mode 100644 index 00000000..a0208c34 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/docker.rst.txt @@ -0,0 +1,128 @@ +======================== +Docker Deployment on AWS +======================== + +Amazon Web Services (`AWS`_) provides the preferred hosting for the SEED Platform. + +**seed** is a `Django Project`_ and Django's documentation is an excellent place for general +understanding of this project's layout. + +.. _Django Project: https://www.djangoproject.com/ + +.. _AWS: http://aws.amazon.com/ + +Installation +^^^^^^^^^^^^ + +Ubuntu server 18.04 or newer with a m5ad.xlarge (if using in Production instance) + +* After launching the instance, run the following commands to install docker. + +.. code-block:: console + + # Install any upgrades + sudo apt-get update + sudo apt-get upgrade -y + + # Remove any old docker engines + sudo apt-get remove docker docker-engine docker.io containerd runc + + # Install docker community edition + sudo apt-get update + sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + sudo add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) \ + stable" + + sudo apt-get update + sudo apt-get install -y docker-ce docker-ce-cli containerd.io + # Add your user to the docker group + sudo groupadd docker + sudo usermod -aG docker $USER + newgrp docker + +.. note:: It is okay if the first command fails + +* Verify that the DNS is working correctly. Run the following and verify the response lists IPs (v6 most likely) + +.. code-block:: console + + # verify that the dns resolves + docker run --rm seedplatform/seed getent hosts seed-platform.org + # or + docker run --rm tutum/dnsutils nslookup email.us-west-2.amazonaws.com + +* Install Docker compose + +.. code-block:: console + + sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose + +* Checkout SEED (or install from the releases). + +.. code-block:: console + + git clone + +* Add in the Server setting into profile.d. For example add the content below (appropriately filled out) into /etc/profile.d/seed.sh + +.. code-block:: console + + export POSTGRES_USER=seed + export POSTGRES_DB=seed + export POSTGRES_PASSWORD=GDEus3fasd1askj89QkAldjfX + export POSTGRES_PORT=5432 + export SECRET_KEY="96=7jg%_&1-z9c9qwwu2@w$hb3r322yf3lz@*ekw-1@ly-%+^" + + # The admin user is only valid only until the database is restored + export SEED_ADMIN_USER=user@seed-platform.org + export SEED_ADMIN_PASSWORD="7FeBWal38*&k3jlfa92lakj8ih4" + export SEED_ADMIN_ORG=default + + # For SES + export AWS_ACCESS_KEY_ID= + export AWS_SECRET_ACCESS_KEY= + export AWS_SES_REGION_NAME=us-west-2 + export AWS_SES_REGION_ENDPOINT=email.us-west-2.amazonaws.com + export SERVER_EMAIL=user@seed-platform.org + + +* Before launching the first time, make sure the persistent volumes and the backup directory exist. + +.. code-block:: console + + docker volume create --name=seed_pgdata + docker volume create --name=seed_media + + mkdir -p $HOME/seed-backups + +.. note:: Make sure to have the seed-backups in your path, otherwise the db-postgres container will not launch. + +* Launch the project + +.. code-block:: console + + cd + ./deploy.sh + + +Deploying with Docker +^^^^^^^^^^^^^^^^^^^^^ + +The preferred way to deploy with Docker is using docker swarm and docker stack. +Look at the `deploy.sh script`_ for implementation details. + +The short version is to simply run the command below. Note that the passing of the docker-compose.yml filename is not required if using docker-compose.local.yml. + +```bash +./deploy.sh docker-compose.local.yml +``` + +If deploying using a custom docker-compose yml file, then simple replace the name in the command above. + + +.. _`deploy.sh script`: https://github.com/SEED-platform/seed/blob/develop/deploy.sh +.. _`JSON Type`: https://www.postgresql.org/docs/9.4/datatype-json.html diff --git a/docs/code_documentation/2.22.0/_sources/faq.rst.txt b/docs/code_documentation/2.22.0/_sources/faq.rst.txt new file mode 100644 index 00000000..8c3231be --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/faq.rst.txt @@ -0,0 +1,68 @@ +Frequently Asked Questions +########################## + +Here are some frequently asked questions and/or issues. + +.. contents:: + :local: + :depth: 2 + + + +Questions +========= +.. _whatisseed: + +What is the SEED Platform? +-------------------------- + +The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity. + +The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL. + +The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions. + +Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy. + + +Issues +====== + +.. _domain: + +Why is the domain set to example.com? +------------------------------------- + +If you see example.com in the emails that are sent from your hosted version of SEED then you will +need to update your django sites object in the database. + +.. code-block:: bash + + $ ./manage.py shell + + from django.contrib.sites.models import Site + one = Site.objects.all()[0] + one.domain = 'newdomain.org' + one.name = 'SEED' + one.save() + + +.. _staticfiles: + +Why aren't the static assets being served correctly? +---------------------------------------------------- + +Make sure that your local_untracked.py file does not have STATICFILES_STORAGE set to anything. If so, +then comment out that section and redeploy/recollect/compress your static assets. diff --git a/docs/code_documentation/2.22.0/_sources/getting_started.rst.txt b/docs/code_documentation/2.22.0/_sources/getting_started.rst.txt new file mode 100644 index 00000000..d0ae9497 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/getting_started.rst.txt @@ -0,0 +1,11 @@ +Getting Started +=============== + +Development Setup +----------------- + +.. toctree:: + :maxdepth: 2 + + setup_osx + setup_docker diff --git a/docs/code_documentation/2.22.0/_sources/help.rst.txt b/docs/code_documentation/2.22.0/_sources/help.rst.txt new file mode 100644 index 00000000..add7485b --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/help.rst.txt @@ -0,0 +1,28 @@ +Help +==== + +For SEED Platform Users +^^^^^^^^^^^^^^^^^^^^^^^ + +Please visit our website for information, tutorials, and documentation to help you learn how to use SEED. + +https://seed-platform.org + +The SEED Users Forum is where you can review user announcements, workflow questions, and join to connect with other users. + +https://lists.buildingenergytools.org/g/SEEDusers/topics + +For general inquiries or help on a specific problem, please fill out a request on the building data tools website help desk and select SEED as the relevant tool: + +https://buildingdata.energy.gov/#/help-desk + +For SEED Platform Developers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The open-source code is available on the GitHub organization SEED-Platform and contains various repositories for the different components of the platform such as the main SEED application, a Python SEED client to communicate to SEED's API and various example datasets. + +https://github.com/SEED-platform + +The SEED Developers Forum contains various topics and joining enables you to connect with other developers. It is recommended to join this forum to submit developer questions, features requests, and report issues as needed. Also, submitting issues on GitHub is encouraged. + +https://lists.buildingenergytools.org/g/SEEDdevelopers/topics diff --git a/docs/code_documentation/2.22.0/_sources/index.rst.txt b/docs/code_documentation/2.22.0/_sources/index.rst.txt new file mode 100644 index 00000000..68ea4f7e --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/index.rst.txt @@ -0,0 +1,51 @@ +.. SEED Platform documentation master file, created by + sphinx-quickstart on Tue Mar 1 14:43:22 2016. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Standard Energy Efficiency Data (SEED) Platform +=============================================== + +The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity. + +The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL. + +The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions. + +Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy. + + +.. toctree:: + :maxdepth: 2 + + getting_started + deployment + api + data_model + data_quality + mapping + matching + modules + developer_resources + license + help + faq + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/code_documentation/2.22.0/_sources/kubernetes_deployment.rst.txt b/docs/code_documentation/2.22.0/_sources/kubernetes_deployment.rst.txt new file mode 100644 index 00000000..3f70fdc1 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/kubernetes_deployment.rst.txt @@ -0,0 +1,251 @@ +Kubernetes Deployment Guide with Helm +===================================== + +Kubernetes is a robust container orchestration system for easy application deployment and management. Helm takes that a step further with by packaging up required helm "charts" into one deployment command. + +Setup +----- + +Cluster +^^^^^^^ +In order to deploy the SEED platform on a Kubernetes you will need "cluster" which will be configured by your cloud service of choice. Each installation will be slightly different depending on the service. +Below are links to quick-start guides for provisioning a cluster and connecting. These instructions are specifically for AWS, but after the Kubernetes cluster is launched, the helm commands can be used in +the same way. + +* Amazon Web Services (`AWS`_) +* Google Cloud Platform (`GCP`_) +* Azure (`AKS`_) + +AWS CLI Configuration +~~~~~~~~~~~~~~~~~~~~~ +Download and configure the AWS CLI with instructions: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html + +.. code-block:: console + + aws configure + AWS Access Key ID [None]: (from account) + AWS Secret Access Key [None]: (from account) + Default region name [None]: us-east-1 + Default output format [None]: json + +Kubectl +^^^^^^^ +Download and install Kubectl: + +- `Windows `_ +- Mac (with Homebrew) :code:`brew install kubectl` + ``` + brew install kubectl + ``` + +Kubectl is the main function in which you will be interfacing with your deployed application on your cluster. This CLI is what connects you to your cluster that you have just provisioned. +If your cloud service did not have you configure kubectl in your cluster setup, you can download it `here `_. Once kubectl is installed and configured to your cluster +you can run some simple commands to ensure its working properly: + +.. code-block:: console + + #View the cluster + kubectl cluster-info + + #View pods, services and replicasets (will be empty until deploying an app) + kubectl get all + +All of the common kubectl commands can be found in these `docs `_ + +.. note:: For those unfamiliar with CLIs, there are a number of GUI applications that are able to deploy on your stack with ease. One of which is Kubernetes native application called `Dashboard UI`_ or a third-party application called Octant :code:`brew install octant`. + +Helm +^^^^ +Helm organizes all of your Kubernetes deployment, service, and volume yml files into "charts" that can be deployed, managed, and published with simple commands. +To install Helm: + +* `Windows eksctl `_ +* Mac (with Homebrew) :code:`brew install helm` + +EKS Control (AWS Specific) +^^^^^^^^^^^^^^^^^^^^^^^^^^ +EKSCtl is a command line tool to manage Elastic Kubernetes clusters on AWS. If not using AWS, then disregard this section. + +* `Windows eksctl config `_ +* Mac (with Homebrew) :code:`brew install eksctl` + +To launch a cluster on using EKSCts, run the following command in the terminal (assuming adequate permissions for the user). Also make sure to replace items in the `<>` brackets. + +.. code-block:: yaml + + eksctl create cluster \ + --name \ + --version 1.21 \ + --region us-east-1 \ + --node-type m5.large \ + --nodes 1 \ + --nodes-min 1 \ + --nodes-max 1 \ + --managed \ + --tags environment= + +Charts +^^^^^^ +SEED stores its charts in the `charts directory`_ of the Github Repo. There are two main charts that are deployed when starting SEED on Kubernetes. + +* persistentvolumes - these are the volumes to store SEED media data and SEED Postgres data +* seed - this stores all of the other deployment and service files for the application + +Unlike persistentvolumes, the seed charts must be modified with user environment variables that will be forwarded to the docker container for deployment. +Before deployment, the user **MUST** set these variables to their desired values. + +web-deployment.yaml +******************* +This chart contains the deployment specification for the SEED web container. Replace all the values in <>. + +.. code-block:: yaml + + # Environment variables for the web container + - env: + # AWS Email service variables to send emails to new users - can be removed if not using this functionality. + - name: AWS_ACCESS_KEY_ID + value: + - name: AWS_SECRET_ACCESS_KEY + value: + - name: AWS_SES_REGION_NAME + value: us-west-2 + - name: AWS_SES_REGION_ENDPOINT + value: email.us-west-2.amazonaws.com + - name: SERVER_EMAIL + value: info@seed-platform.org + # Django Variables + - name: DJANGO_SETTINGS_MODULE + value: config.settings.docker + - name: SECRET_KEY + value: + - name: SEED_ADMIN_ORG + value: default + - name: SEED_ADMIN_PASSWORD + value: + - name: SEED_ADMIN_USER + value: + # Postgres variables + - name: POSTGRES_DB + value: seed + - name: POSTGRES_PASSWORD + value: # must match db-postgres-deployment.yaml and web-celery-deployment.yaml + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_USER + value: seeduser + # Bsyncr analysis variables + - name: BSYNCR_SERVER_PORT + value: "5000" + - name: BSYNCR_SERVER_HOST + value: bsyncr + # Sentry monitoring - remove if not applicable + - name: SENTRY_JS_DSN + value: + - name: SENTRY_RAVEN_DSN + value: + # Google self registration security - remove if not applicable + - name: GOOGLE_RECAPTCHA_SITE_KEY + value: + - name: GOOGLE_RECAPTCHA_SECRET_KEY + value: + image: seedplatform/seed: + #versions can be found here https://github.com/SEED-platform/seed/releases/tag/v2.9.3 + +web-celery-deployment.yaml +************************** +This chart contains the deployment specification for the Celery container to connect to Postgres. Replace the Postgres password to match web-deployment. + +.. code-block:: yaml + + - name: POSTGRES_PASSWORD + value: # must match db-postgres-deployment.yaml and web-celery-deployment.yaml + +bsyncr-deployment.yaml +********************** +This chart contains the deployment specification for the bsyncr analysis server. Request a NOAA token from `this website `_. + +.. code-block:: yaml + + - name: NOAA_TOKEN + value: + +Deployment +---------- +Once you are connected to your cluster and have your settings configured with the environment variables of you choice in the charts, you are ready to deploy the app. +First, make sure that the correct context is selected which is needed if there is more than one cluster: + +.. code-block:: bash + + kubectl config get-contexts + kubectl config use-context + +Deploy the site using the helm commands in the root of the charts directory. + +* :code:`helm install --generate-name persistentvolumes` +* :code:`helm install --generate-name seed` + +You will be able to see SEED coming online with statuses like container creating, and running with: + +* :code:`kubectl get all` + +Once all of the pods are running you will be able to hit the external ingress through the URL listed in the web service information. It should look something like + +.. code-block:: bash + + service/web LoadBalancer 10.100.154.227 80:32291/TCP + +Managing Existing Clusters +-------------------------- + +Upgrade/Redeploy the Helm Stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To upgrade or dedeploy a helm chart, first find the helm release that you want to upgrade, then run the upgrade with the selected chart. + +.. code-block:: bash + + helm list + helm upgrade ./seed + +Managing the Kubernetes Cluster (AWS Specific) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Enable kubectl to talk to one of the created clusters by running the following command in the terminal after configuring the AWS credentials and cli. + +.. code-block:: bash + + aws eks --region update-kubeconfig --name + +Logging In +^^^^^^^^^^ +After a successful deployment in order to login you will need to create yourself as a user in the web container. To do this, we will exec into the container and run some Django commands. +* View all deployments and services, :code:`kubectl get all` +* :code:`kubectl get pods` +* :code:`kubectl exec -it -- bash` + +Now that we are in the container, we can make a user. +.. code-block:: bash + + ./manage.py create_default_user --username=admin@my.org --organization=seedorg --password=badpass + +You can now use these credentials to log in to the SEED website. + +Update web and web-celery +^^^^^^^^^^^^^^^^^^^^^^^^^ +The command below will restart the pods and re-pull the docker images. + +.. code-block:: bash + + kubectl rollout restart deployment web && kubectl rollout restart deployment web-celery + + +Other Resources +--------------- +Common kubectl actions can be found `on the kubernetes website `_ + + +.. _AWS: https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html +.. _GCP: https://cloud.google.com/kubernetes-engine/docs/quickstart +.. _AKS: https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough#connect-to-the-cluster + +.. _Dashboard UI: https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/ + +.. _charts directory: https://github.com/SEED-platform/seed/tree/develop/charts diff --git a/docs/code_documentation/2.22.0/_sources/license.rst.txt b/docs/code_documentation/2.22.0/_sources/license.rst.txt new file mode 100644 index 00000000..f29b1ce4 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/license.rst.txt @@ -0,0 +1,5 @@ +============== +License +============== + +.. include:: ../../LICENSE.md diff --git a/docs/code_documentation/2.22.0/_sources/linux.rst.txt b/docs/code_documentation/2.22.0/_sources/linux.rst.txt new file mode 100644 index 00000000..0e922004 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/linux.rst.txt @@ -0,0 +1,334 @@ +General Linux Setup +=================== + +While Amazon Web Services (`AWS`_) provides the preferred hosting for SEED, +running on a bare-bones Linux server follows a similar setup, replacing the +AWS services with their Linux package counterparts, namely: PostgreSQL and +Redis. + +**SEED** is a `Django project`_ and Django's documentation +is an excellent place to general understanding of this project's layout. + +.. _Django project: https://www.djangoproject.com/ + +.. _AWS: http://aws.amazon.com/ + +Prerequisites +^^^^^^^^^^^^^^ + +Ubuntu server/desktop 16.04 or newer (18.04 recommended) + +Install the following base packages to run SEED: + +.. code-block:: console + + sudo add-apt-repository ppa:timescale/timescaledb-ppa + sudo apt update + sudo apt upgrade + sudo apt install libpq-dev python3-dev python3-pip libatlas-base-dev \ + gfortran build-essential nodejs npm libxml2-dev libxslt1-dev git \ + libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python mercurial + sudo apt install gdal-bin postgis + sudo apt install redis-server + sudo apt install timescaledb-postgresql-10 postgresql-contrib + + # For running selenium/protractor + sudo apt install default-jre + +.. note:: postgresql ``>=9.3`` is required to support `JSON Type`_ + +.. _JSON Type: http://www.postgresql.org/docs/9.3/static/datatype-json.html + +Configure PostgreSQL +^^^^^^^^^^^^^^^^^^^^ + +Replace 'seeddb', 'seeduser' with desired db/user. By +default use password `seedpass` when prompted + +.. code-block:: console + + $ sudo timescaledb-tune + $ sudo service postgresql restart + $ sudo su - postgres + $ createuser -P "seeduser" + $ createdb "seeddb" --owner="seeduser" + $ psql + postgres=# GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO "seeduser"; + postgres=# ALTER USER "seeduser" CREATEDB CREATEROLE SUPERUSER; + postgres=# \q + $ exit + + +Python Dependencies +^^^^^^^^^^^^^^^^^^^ + +clone the **seed** repository from **github** + +.. code-block:: console + + $ git clone git@github.com:SEED-platform/seed.git + +enter the repo and install the python dependencies from `requirements`_ + +.. _requirements: https://github.com/SEED-platform/seed/blob/main/requirements/local.txt + +.. code-block:: console + + $ cd seed + $ pip3 install -r requirements/local.txt + + +JavaScript Dependencies +^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: console + + $ npm install + + +Django Database Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Copy the ``local_untracked.py.dist`` file in the ``config/settings`` directory to +``config/settings/local_untracked.py``, and add a ``DATABASES`` configuration with your database username, password, +host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database instance +you have manually installed within your infrastructure. + +.. code-block:: python + + # Database + DATABASES = { + 'default': { + 'ENGINE': 'django.contrib.gis.db.backends.postgis', + 'NAME': 'seeddb', + 'USER': 'seeduser', + 'PASSWORD': '', + 'HOST': 'localhost', + 'PORT': '5432', + } + } + + +.. note:: + + Other databases could be used such as MySQL, but are not supported + due to the postgres-specific `JSON Type`_ + +In in the above database configuration, ``seed`` is the database name, this is arbitrary and any valid name can be +used as long as the database exists. Enter the database name, user, password you set above. + +The database settings can be tested using the Django management command, ``python3 manage.py dbshell`` to connect to the +configured database. + +create the database tables and migrations: + +.. code-block:: console + + $ python3 manage.py migrate + +Cache and Message Broker +^^^^^^^^^^^^^^^^^^^^^^^^ + +The SEED project relies on `redis`_ for both cache and message brokering, and +is available as an AWS `ElastiCache`_ service or with the ``redis-server`` +Linux package. (``sudo apt install redis-server``) + +``local_untracked.py`` should be updated with the ``CACHES`` and ``CELERY_BROKER_URL`` +settings. + +.. _ElastiCache: https://aws.amazon.com/elasticache/ + +.. _redis: http://redis.io/ + + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + + +Creating the initial user +^^^^^^^^^^^^^^^^^^^^^^^^^ + +create a superuser to access the system + +.. code-block:: console + + $ python3 manage.py create_default_user --username=admin@my.org --organization=lbnl --password=badpass + + +.. note:: + + Of course, you need to save this user/password somewhere, since this is what + you will use to login to the SEED website. + + Every user must be tied to an organization, visit ``/app/#/profile/admin`` + as the superuser to create parent organizations and add users to them. + + + +Running celery the background task worker +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +`Celery`_ is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, ``celery`` +can be started: + +.. code-block:: console + + DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler + +.. _Celery: http://www.celeryproject.org/ + + +Running the development web server +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The Django dev server (not for production use) can be a quick and easy way to +get an instance up and running. The dev server runs by default on port 8000 +and can be run on any port. See Django's `runserver documentation`_ for more +options. + +.. _runserver documentation: https://docs.djangoproject.com/en/1.6/ref/django-admin/#django-admin-runserver + +.. code-block:: console + + $ python3 manage.py runserver --settings=config.settings.dev + + +Running a production web server +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Our recommended web server is uwsgi sitting behind nginx. The python package ``uwsgi`` is needed for this, and +should install to ``/usr/local/bin/uwsgi`` We recommend using ``dj-static`` to load static files. + +.. note:: + + The use of the ``dev`` settings file is production ready, and should be + used for non-AWS installs with ``DEBUG`` set to ``False`` for production use. + + +.. code-block:: console + + $ pip3 install uwsgi dj-static + + +Generate static files: + +.. code-block:: console + + $ python3 manage.py collectstatic --settings=config.settings.prod -i package.json -i npm-shrinkwrap.json -i node_modules/openlayers-ext/index.html + +Update ``config/settings/local_untracked.py``: + +.. code-block:: python + + DEBUG = False + # static files + STATIC_ROOT = 'collected_static' + STATIC_URL = '/static/' + +Start the web server (this also starts celery): + +.. code-block:: console + + $ ./bin/start-seed + +.. warning:: + + Note that uwsgi has port set to ``80``. In a production setting, a dedicated web server such as nginx would be + receiving requests on port 80 and passing requests to uwsgi running on a different port, e.g 8000. + + + + +Environment Variables +^^^^^^^^^^^^^^^^^^^^^ + +The following environment variables can be set within the ``~/.bashrc`` file to +override default Django settings. + +.. code-block:: bash + + export SENTRY_DSN=https://xyz@app.getsentry.com/123 + export DEBUG=False + export ONLY_HTTPS=True + + +Mail Services +^^^^^^^^^^^^^ + +AWS SES Service +--------------- + +In the AWS setup, we can use SES to provide an email service for Django. The service is +configured in the config/settings/local_untracked.py: + +.. code-block:: python + + EMAIL_BACKEND = 'django_ses.SESBackend' + + +In general, the following steps are needed to configure SES: + +1. Access Amazon SES Console - `Quickstart `_ +2. Login to Amazon SES Console. Verify which region we are using (e.g., us-east-1) +3. Decide on email address that will be sending the emails and add them to the `SES Verified Emails `_. +4. Test that SES works as expected (while in the SES sandbox). Note that you will need to add the sender and recipient emails to the verified emails while in the sandbox. +5. Update the local_untracked.py file or set the environment variables for the docker file. +6. Once ready, move the SES instance out of the sandbox. Following instructions `here `_ +7. (Optional) Set up Amazon Simple Notification Service (Amazon SNS) to notify you of bounced emails and other issues. +8. (Optional) Use the AWS Management Console to set up Easy DKIM, which is a way to authenticate your emails. Amazon SES console will have the values for SPF and DKIM that you need to put into your DNS. + +SMTP service +------------ + +Many options for setting up your own `SMTP`_ service/server or using other SMTP +third party services are available and compatible including `gmail`_. SMTP is not configured for working within Docker at the moment. + +.. _SMTP: https://docs.djangoproject.com/en/2.0/ref/settings/#email-backend +.. _gmail: http://stackoverflow.com/questions/19264907/python-django-gmail-smtp-setup + +.. code-block:: python + + EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' + +local_untracked.py +^^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + # PostgreSQL DB config + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'seed', + 'USER': 'your-username', + 'PASSWORD': 'your-password', + 'HOST': 'your-host', + 'PORT': 'your-port', + } + } + + # config for local storage backend + DOMAIN_URLCONFS = {'default': 'config.urls'} + + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + + # SMTP config + EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' + + # static files + STATIC_ROOT = 'collected_static' + STATIC_URL = '/static/' diff --git a/docs/code_documentation/2.22.0/_sources/mapping.rst.txt b/docs/code_documentation/2.22.0/_sources/mapping.rst.txt new file mode 100644 index 00000000..077593ec --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/mapping.rst.txt @@ -0,0 +1,42 @@ +========= +Mapping +========= + +This document describes the set of calls that occur from the web client or API +down to the back-end for the process of mapping data into SEED. + +An overview of the process is: + +1. Import - A file is uploaded to the server +2. Save - The file is batched saved into the database as JSON data +3. Mapping - Mapping occurs on that file +4. Matching / Merging +5. Pairing + +Import +------ + +From the web UI, the import process invokes `seed.views.main.save_raw_data` to save the data. When the data is +done uploading, we need to know whether it is a Portfolio Manager file, so we can add metadata to the record in the +database. The end of the upload happens in `seed.data_importer.views.DataImportBackend.upload_complete`. At this +point, the request object has additional attributes for Portfolio Manager files. These are saved in the model +`seed.data_importer.models.ImportFile`. + +Mapping +------- + +Once files are uploaded, file header columns need to be mapped to SEED columns. Mappings can be specified/decided manually for any particular file import, +or mapping profiles can be created and subsequently applied to any file imports. + +When a column mapping profile is applied to an import file, file header columns defined in the profile must match exactly (spaces, lowercase, uppercase, etc.) +in order for the corresponding SEED column information to be used/mapped. + +Matching +-------- + +.. todo:: document + +Pairing +------- + +.. todo:: document diff --git a/docs/code_documentation/2.22.0/_sources/matching.rst.txt b/docs/code_documentation/2.22.0/_sources/matching.rst.txt new file mode 100644 index 00000000..2d28d935 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/matching.rst.txt @@ -0,0 +1,123 @@ +Matching +======== + +What is it? +----------- +Within SEED, matching refers to a possible relationship between at least 2 properties or at least 2 tax lots. +Two properties **match** if they have the same values for some specified field(s). +These specified fields are referred to as **matching criteria**, and each SEED organization has its +own set of matching criteria which is customizable by users. + +Why does it exist? +------------------ +At a high level, matching is used to identify if two or more property records are actually different +representations of the same property (or tax lots representing one tax lot). For example, within the same cycle, +two matching records, so one persists while the other is used and subsequently discarded to update the persisting record +(say if the building owner's phone number changed). Or across different cycles, it's possible that the +two records capture the same property at different times/cycles - this relationship is referred to as a **link**. + +How and when is it used? +------------------------ + +In-Cycle Merging +"""""""""""""""" +(This is different from manual merging.) + +For records within the same cycle, there really shouldn't be more than one +representation of the same property (or tax lot). As much as possible, the program +is set up to prevent this from happening by automatically **merging** matched +records together whenever they might occur in the same cycle. + +Specifically, a merge of matches might need to occur after any of the following events: + +1. The record has been manually edited. +2. The record was just created as a result of a manual merge (via the 'Actions' on the Properties or Tax Lots page). +3. The record has just been imported. + +The actual execution of merges includes a few additional, unrelated steps but, +in the scope of merging, the following occurs. + +The record in the scenarios listed above is the "target" record. Any and all +matches found, excluding the "target", are merged together first. If there are +overlapping values, priority is given to more recently updated records. + +Once these matches (excluding the target) are merged together, the final step is +to merge the "target" record. In all but one case, choosing between overlapping +values gives priority to the "target". That one case is when a record has just been +imported. Here, overlapping values follow merge protection rules set by +the user for an organization in this final step. + +Linking (Across Cycles) +""""""""""""""""""""""" +For records in different cycles, matches between these are considered links. +Links are used to connect snapshots of the same record year-over-year (at different time periods). +This allows for the analysis of how the record has changed over time. + +In the case of properties, these links are used to associate meters to properties. +This means that adding meters to a property in one cycle will make those meters +accessible to that same property's instance in all other cycles. + +This association can be viewed in aggregate; all of the records within some selected cycles are +grouped and displayed with their links. Alternatively, this association can be viewed for particular linked +group; the linked records of this group are displayed by themselves. + +Putting them Together, Match-Merge-Linking +"""""""""""""""""""""""""""""""""""""""""" +As mentioned earlier, there is a rule or assumption that at most one representation of +the same record can exist in any given cycle. + +This avoids unresolvable situations that would prevent year-over-year analysis. +In the most simple case, a record in `Cycle A` matches two records in `Cycle B`. +SEED wouldn't know which of the two records in `Cycle B` should be +the "snapshot" for this time period. + +For this reason, in-cycle match merging always occurs before cross-cycle match linking. +So when searches for links do happen, ambiguous cases have already been resolved. + +For an individual record, these are the following cases in which a +match-merge-link is automatically run: +1. Explicit triggering (from the Property/TaxLot Detail page) +2. After editing (in the Property/TaxLot Detail page) +3. After manual merging (in the Properties/Tax Lots list page). Explicitly +specified merges happen as chosen by the user. Then, if the resulting record has +matches, merges and/or linking happens. +4. When importing a record. If the incoming record has matches, +merges and/or linking happens. + +For a whole organization, a match-merge-link round for all records in that +organization is run in the following cases: +1. During the original deployment of this feature - This happens in order to +initially normalize the existing data and establish all initial links. +2. Whenever a user changes matching criteria - This happens in order to +re-normalize existing data and reestablish links. As of this writing, before +committing matching criteria changes, a user can view a preview of how their +records will be affected as these are difficult to reverse. + +Note on In-Cycle Not-merged Matches +""""""""""""""""""""""""""""""""""" +Even though the application tries it's best to have only one representative record per property +(or tax lot) per Cycle, it's possible for there to exist matches that were not merged. +This can happen if a user manually unmerges a record after a (manual or automatic) merge occurs. +If this happens, and there exists two records that match each other but are not merged, +both records are **completely unlinked**. Without user intervention such as editing +one of the matching criteria values, these will be merged and linked as described +above next time the system finds them during a match search. + +Match Searching in Depth +------------------------ +Though they accomplish the same goal, the process for merging is very different between the last case, importing, +and the first 2 cases, manual edit or manual merge. + +In the case of manual merging or editing, this process accounts for the fact that these are records that already exist. +Specifically, they may have associations such as labels, notes, pairings, and for properties, meters. +So during a subsequent match search leading to a merge of two or more records, all of these "old" associations are +carried over to the final record once merges are complete. + +In the case of importing, considerations must be taken for the fact that, in most cases, multiple records +are being imported together. Also, since this is the entry point for records, it's possible that a user might +accidentally try to import the same record snapshot twice - where all the record values are the same as another +existing record (as opposed to just having the same values for matching criteria fields). So on import, the process is as follows: + +1. Amongst only the incoming records, duplicates (of other incoming or existing) are flagged and ignored. +2. Amongst only the incoming records, matching records are merged together. +3. Amongst all records in the same Cycle, incoming records that match an existing record gets merged with priority to that existing record. If the incoming record has multiple existing matches, the existing matches are merged together in latest updated order first while also combining any other associations (labels, notes, etc.) just as in the manual merge or edit cases. Since the incoming record is new, it doesn't have any of the other associations. diff --git a/docs/code_documentation/2.22.0/_sources/migrations.rst.txt b/docs/code_documentation/2.22.0/_sources/migrations.rst.txt new file mode 100644 index 00000000..4b65db02 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/migrations.rst.txt @@ -0,0 +1,280 @@ +Migrations +========== + +Django handles the migration of the database very well; however, there are various changes to SEED that may require some custom (manual) migrations. The migration documentation includes the required changes based on deployment and development for each release. + +Version Develop +--------------- + +In order to support Redis passwords, the configuration of the Redis/Celery settings changed a bit. +You will need to add the following to your local_untracked.py configuration file. If you are using +Docker then you will not need to do this. + +.. code-block:: python + + CELERY_RESULT_BACKEND = CELERY_BROKER_URL + +If you are using a password, then in your local_untracked.py configuration, add the password to +the CELERY_BROKER_URL. Your final configuration should look like the following in your +local_untracked.py file + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://:password@127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + + CELERY_RESULT_BACKEND = CELERY_BROKER_URL + CELERY_TASK_DEFAULT_QUEUE = 'seed-local' + CELERY_TASK_QUEUES = ( + Queue( + CELERY_TASK_DEFAULT_QUEUE, + Exchange(CELERY_TASK_DEFAULT_QUEUE), + routing_key=CELERY_TASK_DEFAULT_QUEUE + ), + ) + +Version 2.22.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.21.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.20.1 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.20.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There is a single long running migration related to importing census tract disadvantaged community data. This migration should take around 7 minutes to complete. + +Version 2.19.0 +-------------- +- Run `./manage.py migrate`. +- There is a new migration in this release that requires column names to be unique across `organization`, `table_name`, and `is_extra_data`. This migration will fail if there are duplicate column names. If you have duplicate column names, you will need to manually fix them in your database before running the migration. The following steps will help you identify and fix the duplicate column names: + - Check the organization age to gauge the impact of the change. If it is a deprecated org, impact of the change will be low. Often this issue arose in older organizations when units were not part of the columns. The old mapping columns were not upserts with the units, so typically the columns impacted are the ones with units. + - Query the `seed_column` table for the organization and column name displayed on the screen (e.g., `organization_id = 300 and column_name = 'Source EUI (kBtu/ft2)'`). If there is no `table_name` set, it is likely an import file column name and can easily be cleaned up without causing issues. In such cases, there will be two rows, and you want to keep the one with the `units_pint` column set. + - More complex columns may require deleting or updating the `column_id` in the `seed_columnmapping_*` tables. If there is a foreign key constraint with `seed_columnmapping_*`, take note of the ID you want to remove and the ID you want it to be replaced with (preferably keep the one with units_pint). + - If the constraint is on `seed_columnmapping_column_raw`: + - The field should be an import file column (i.e., no `table_name` item). Query for the old column in `seed_columnmapping_column_raw` (e.g., `column_name = `). + - Replace the old ID with the new one. If it errors because it already exists, then the row can be deleted. + - Return to the `seed_column` table and remove the old ID. + - If the constraint is on `seed_columnmapping_column_mapped`: + - The mapped column should have a `table_name` in the field. If not, it is likely an older organization. + - If there is no `table_name`, remove the row from the `seed_columnmapping_column_mapped` table. + - Return to the `seed_column` table and remove the old ID. + +Version 2.18.1 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.18.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.17.4 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.17.3 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.17.2 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.17.1 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.17.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.16.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.15.2 +-------------- +- There are no migrations needed for this version. + +Version 2.15.1 +-------------- +- There are no migrations needed for this version. + +Version 2.15.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.14.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.13.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.12.0 - 2.12.4 +----------------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.11.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.10.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.7.3 to 2.9.0 +---------------------- +- The migrations should work without additional support. Simply run `./manage.py migrate`. + +Version 2.7.2 +------------- +- The migrations should work without additional support. Simply run `./manage.py migrate`. There are no manual migrations needed. +- Note the **Important Note** in Version 2.7.1 migration below which may require the need to run a "fake" migration + +Version 2.7.1 +------------- + +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +**Important Note:** + +If upgrading from `< 2.7.0` to `>= 2.7.1` you may encounter a failed migration with ``0118_match_merge_link_all_orgs``. This is expected if the database is several versions behind, and it effectively reorders migration 118 to run after all other migrations have completed to prepare your database to recognize properties and taxlots across multiple cycles. Run the following code manually to fully migrate: + +#. ``./manage.py migrate --fake seed 0118_match_merge_link_all_orgs`` + +#. ``./manage.py migrate`` + +#. ``./manage.py shell`` + + .. code-block:: python + + from seed.lib.superperms.orgs.models import Organization + from seed.utils.match import whole_org_match_merge_link + + for org in Organization.objects.all(): + whole_org_match_merge_link(org.id, 'PropertyState') + whole_org_match_merge_link(org.id, 'TaxLotState') + +Version 2.7.0 +------------- + +- This migration will run a match/merge/pair/link method upon migration. Make sure to run the migration manually and not inside of the docker container using the ./deploy.sh script. +- Make sure to backup the database before performing the migration. +- Run `./manage.py migrate`. + +Version 2.6.1 +------------- + +- The migrations should work without additional support. Simply run `./manage.py migrate`. There are no manual migrations needed for the 2.6.1 release. + + +Version 2.6.0 +------------- + +Version 2.6.0 includes support for meters and time series data storage. In order to use this release +you must first install `TimescaleDB`_. + +Docker-based Deployment +^^^^^^^^^^^^^^^^^^^^^^^ +Docker-based deployments shouldn't require running any additional commands for installation. The +timescaledb installation will happen automatically when updating the postgres container. Also, +the installation of the extension occurs in a Django migration. + +Ubuntu +^^^^^^ + +.. code-block:: console + + sudo add-apt-repository ppa:timescale/timescaledb-ppa + sudo apt update + sudo apt install timescaledb-postgresql-10 + sudo timescaledb-tune + sudo service postgresql restart + +Max OSX +^^^^^^^ + +.. code-block:: console + + brew tap timescale/tap + brew install timescaledb + /usr/local/bin/timescaledb_move.sh + timescaledb-tune + brew services restart postgresql + +Version 2.5.2 +------------- + +- There are no manual migrations that are needed. The `./manage.py migrate` command may take awhile to run since the migration requires the recalculation of all the normalized addresses to parse bldg correct and to cast the result as a string and not a bytestring. + +Version 2.5.1 +------------- + +- The migrations should work by simply running `./manage.py migrate`. There are no manual migrations needed for the 2.5.1 release. + +Version 2.5.0 +------------- + +Docker-based Deployment +^^^^^^^^^^^^^^^^^^^^^^^ + +- Add the MapQuest API key to your organization. +- On deployment, the error below is indicative that you need to install the extensions in the postgres database. Run `docker exec update-postgis.sh`. + + django.db.utils.OperationalError: could not open extension control file "/usr/share/postgresql/11/extension/postgis.control": No such file or directory + +- If you are using a copied version of the docker-compose.yml file, then you need to change `127.0.0.1:5000/postgres` to `127.0.0.1:5000/postgres-seed` + +Development +^^^^^^^^^^^ + +- **Delete** your bower directory `rm -rf seed/static/vendors`. +- **Delete** your css directory `rm -rf seed/static/seed/css`. +- **Remove** these lines from `local_untracked.py` if you have them. + +.. code-block:: python + + DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' + STATICFILES_STORAGE = DEFAULT_FILE_STORAGE + +- Run `pip3 install -r requirements/local.txt`. +- Run `npm install` from root checkout of SEED. + +- If testing geocoding, then sign up for as a `MapQuest Developer`_ and create a new `MapQuest Key`_. +- Add the key to the organization that you are using in development. + +- **Update** your DATABASES engine to be `django.contrib.gis.db.backends.postgis` + +.. code-block:: python + + DATABASES = { + 'default': { + 'ENGINE': 'django.contrib.gis.db.backends.postgis', + 'NAME': 'seeddb', + 'USER': 'seeduser', + 'PASSWORD': 'seedpass', + 'HOST': 'localhost', + 'PORT': '5432', + } + } + +- Run ``./manage.py migrate`` + +.. _`MapQuest Developer`: https://developer.mapquest.com/plan_purchase/steps/business_edition/business_edition_free/register + +.. _`MapQuest Key`: https://developer.mapquest.com/user/me/apps + +.. _`TimescaleDB`: https://docs.timescale.com/v1.2/getting-started diff --git a/docs/code_documentation/2.22.0/_sources/modules.rst.txt b/docs/code_documentation/2.22.0/_sources/modules.rst.txt new file mode 100644 index 00000000..4c920b9e --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules.rst.txt @@ -0,0 +1,26 @@ +========= +Modules +========= + +.. toctree:: + :maxdepth: 3 + + modules/config + modules/seed.cleansing + modules/seed.data + modules/seed.data_importer + modules/seed.features + modules/seed.landing + modules/seed.lib + modules/seed.lib.mappings + modules/seed.lib.merging + modules/seed.mappings + modules/seed.managers + modules/seed.models + modules/seed.public + modules/seed + modules/seed.serializers + modules/seed.tests + modules/seed.urls + modules/seed.utils + modules/seed.views diff --git a/docs/code_documentation/2.22.0/_sources/modules/config.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/config.rst.txt new file mode 100644 index 00000000..09215b7d --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/config.rst.txt @@ -0,0 +1,45 @@ +Configuration +============= + +Submodules +---------- + +Template Context +---------------- + +.. automodule:: config.template_context + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: config.tests + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: config.utils + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: config.views + :members: + :undoc-members: + :show-inheritance: + +WSGI +---- + +.. automodule:: config.wsgi + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.cleansing.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.cleansing.rst.txt new file mode 100644 index 00000000..e185fd8e --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.cleansing.rst.txt @@ -0,0 +1,35 @@ +Data Quality Package +==================== + +Inheritance +----------- + +.. inheritance-diagram:: seed.data_quality.models + :parts: 2 + +Submodules +---------- + +Models +------ + +.. automodule:: seed.models.data_quality + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: seed.tests.data_quality + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.views.data_quality + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.data.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.data.rst.txt new file mode 100644 index 00000000..cf066173 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.data.rst.txt @@ -0,0 +1,22 @@ +Data Package +============ + +Submodules +---------- + +BEDES +----- + +.. automodule:: seed.data.bedes + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.data + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.data_importer.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.data_importer.rst.txt new file mode 100644 index 00000000..a446d80d --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.data_importer.rst.txt @@ -0,0 +1,55 @@ +Data Importer Package +===================== + +Submodules +---------- + +Managers +-------- + +.. automodule:: seed.data_importer.managers + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. .. automodule:: seed.data_importer.models +.. :members: +.. :undoc-members: +.. :show-inheritance: + +URLs +---- + +.. automodule:: seed.data_importer.urls + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: seed.data_importer.utils + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.data_importer.views + :members: + :undoc-members: + :show-inheritance: + :noindex: + + +Module contents +--------------- + +.. automodule:: seed.data_importer + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.features.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.features.rst.txt new file mode 100644 index 00000000..ce361d2e --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.features.rst.txt @@ -0,0 +1,22 @@ +Features Package +================ + +Submodules +---------- + +.. Steps +.. -------------------------- + +.. .. automodule:: seed.features.steps +.. :members: +.. :undoc-members: +.. :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.features + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.landing.management.commands.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.landing.management.commands.rst.txt new file mode 100644 index 00000000..57da9c38 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.landing.management.commands.rst.txt @@ -0,0 +1,22 @@ +Landing Management Package +========================== + +Submodules +---------- + +Update EULA +----------- + +.. automodule:: seed.landing.management.commands.update_eula + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.landing.management.commands + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.landing.management.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.landing.management.rst.txt new file mode 100644 index 00000000..c17e2852 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.landing.management.rst.txt @@ -0,0 +1,17 @@ +seed.landing.management package +=============================== + +Subpackages +----------- + +.. toctree:: + + seed.landing.management.commands + +Module contents +--------------- + +.. automodule:: seed.landing.management + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.landing.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.landing.rst.txt new file mode 100644 index 00000000..8103b029 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.landing.rst.txt @@ -0,0 +1,61 @@ +Landing Package +=============== + +Subpackages +----------- + +.. toctree:: + + seed.landing.management + +Submodules +---------- + +Forms +----- + +.. automodule:: seed.landing.forms + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. automodule:: seed.landing.models + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: seed.landing.tests + :members: + :undoc-members: + :show-inheritance: + +URLs +---- + +.. automodule:: seed.landing.urls + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.landing.views + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.landing + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.lib.mappings.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.lib.mappings.rst.txt new file mode 100644 index 00000000..f7bbb15c --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.lib.mappings.rst.txt @@ -0,0 +1,62 @@ +seed.lib.mappings package +========================= + +Submodules +---------- + +seed.lib.mappings.mapper module +------------------------------- + +.. automodule:: seed.lib.mappings.mapper + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.mapping_columns module +---------------------------------------- + +.. automodule:: seed.lib.mappings.mapping_columns + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.mapping_data module +------------------------------------- + +.. automodule:: seed.lib.mappings.mapping_data + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.test_mapper module +------------------------------------ + +.. automodule:: seed.lib.mappings.test_mapper + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.test_mapping_columns module +--------------------------------------------- + +.. automodule:: seed.lib.mappings.test_mapping_columns + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.test_mapping_data module +------------------------------------------ + +.. automodule:: seed.lib.mappings.test_mapping_data + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.lib.mappings + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.lib.merging.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.lib.merging.rst.txt new file mode 100644 index 00000000..98b5be8a --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.lib.merging.rst.txt @@ -0,0 +1,22 @@ +seed.lib.merging package +======================== + +Submodules +---------- + +seed.lib.merging.merging module +------------------------------- + +.. automodule:: seed.lib.merging.merging + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.lib.merging + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.lib.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.lib.rst.txt new file mode 100644 index 00000000..8de8e0e6 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.lib.rst.txt @@ -0,0 +1,23 @@ +Library Packages +================ + +Submodules +---------- + +Module contents +--------------- + +.. automodule:: seed.lib + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: seed.lib.mappings + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: seed.lib.merging + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.management.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.management.rst.txt new file mode 100644 index 00000000..9b600793 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.management.rst.txt @@ -0,0 +1,17 @@ +Management Package +================== + +Subpackages +----------- + +.. toctree:: + + seed.management.commands + +Module contents +--------------- + +.. automodule:: seed.management + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.managers.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.managers.rst.txt new file mode 100644 index 00000000..d77c318c --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.managers.rst.txt @@ -0,0 +1,29 @@ +Managers Package +================ + +Subpackages +----------- + +.. toctree:: + + seed.managers.tests + +Submodules +---------- + +JSON +---- + +.. automodule:: seed.managers.json + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.managers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.managers.tests.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.managers.tests.rst.txt new file mode 100644 index 00000000..2ef2cc25 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.managers.tests.rst.txt @@ -0,0 +1,22 @@ +Manager Tests Package +===================== + +Submodules +---------- + +Test JSON Manager +----------------- + +.. automodule:: seed.managers.tests.test_json_manager + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.managers.tests + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.mappings.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.mappings.rst.txt new file mode 100644 index 00000000..e749754f --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.mappings.rst.txt @@ -0,0 +1,38 @@ +Mapping Package +=============== + +Submodules +---------- + +seed.mappings.mapper module +--------------------------- + +.. automodule:: seed.mappings.mapper + :members: + :undoc-members: + :show-inheritance: + +.. seed.mappings.reconcile_mappings module +.. --------------------------------------- + +.. .. automodule:: seed.mappings.reconcile_mappings +.. :members: +.. :undoc-members: +.. :show-inheritance: + +seed.mappings.seed_mappings module +---------------------------------- + +.. automodule:: seed.mappings.seed_mappings + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.mappings + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.models.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.models.rst.txt new file mode 100644 index 00000000..fb0187a3 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.models.rst.txt @@ -0,0 +1,71 @@ +Models +=================== + +Submodules +---------- + +AuditLog +--------------------------- + +.. automodule:: seed.models.auditlog + :members: + :undoc-members: + :show-inheritance: + +Columns +-------------------------- + +.. automodule:: seed.models.columns + :members: + :undoc-members: + :show-inheritance: + +Cycles +------------------------- + +.. automodule:: seed.models.cycles + :members: + :undoc-members: + :show-inheritance: + +Joins +------------------------ + +.. automodule:: seed.models.joins + :members: + :undoc-members: + :show-inheritance: + +Generic Models +------------------------- + +.. automodule:: seed.models.models + :members: + :undoc-members: + :show-inheritance: + + +Properties +----------------------------- + +.. automodule:: seed.models.properties + :members: + :undoc-members: + :show-inheritance: + +TaxLots +--------------------------- + +.. automodule:: seed.models.tax_lots + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.models + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.public.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.public.rst.txt new file mode 100644 index 00000000..8a292bdc --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.public.rst.txt @@ -0,0 +1,22 @@ +Public Package +============== + +Submodules +---------- + +Models +------ + +.. automodule:: seed.public.models + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.public + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.rst.txt new file mode 100644 index 00000000..771c0324 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.rst.txt @@ -0,0 +1,106 @@ +SEED Package +============ + +Subpackages +----------- + +.. toctree:: + + seed.features + seed.management + seed.mappings + seed.templatetags + seed.test_helpers + seed.tests + + +Inheritance +----------- + +.. inheritance-diagram:: seed.models + :parts: 2 + + +Submodules +---------- + +Decorators +---------- + +.. automodule:: seed.decorators + :members: + :undoc-members: + :show-inheritance: + +Factory +------- + +.. automodule:: seed.factory + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. automodule:: seed.models + :members: + :undoc-members: + :show-inheritance: + +.. Reconcile +.. --------- + +.. .. automodule:: seed.reconcile +.. :members: +.. :undoc-members: +.. :show-inheritance: + +Search +------ + +.. automodule:: seed.search + :members: + :undoc-members: + :show-inheritance: + +Tasks +----- + +.. automodule:: seed.tasks + :members: + :undoc-members: + :show-inheritance: + +Token Generator +--------------- + +.. automodule:: seed.token_generators + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: seed.utils + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.views + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.serializers.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.serializers.rst.txt new file mode 100644 index 00000000..5f3a7dcf --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.serializers.rst.txt @@ -0,0 +1,30 @@ +Serializers Package +=================== + +Submodules +---------- + +Serializers +----------- + +.. automodule:: seed.serializers.celery + :members: + :undoc-members: + :show-inheritance: + +Labels +------ + +.. automodule:: seed.serializers.labels + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.serializers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.templatetags.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.templatetags.rst.txt new file mode 100644 index 00000000..5f799d24 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.templatetags.rst.txt @@ -0,0 +1,13 @@ +Templatetags Package +========================= + +Submodules +---------- + +Breadcrumbs +----------- + +.. automodule:: seed.templatetags.breadcrumbs + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.test_helpers.factory.lib.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.test_helpers.factory.lib.rst.txt new file mode 100644 index 00000000..7cbfda51 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.test_helpers.factory.lib.rst.txt @@ -0,0 +1,13 @@ +Test Helper Factory Lib Package +=============================== + +Submodules +---------- + +Chomsky +------- + +.. automodule:: seed.test_helpers.factory.lib.chomsky + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.test_helpers.factory.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.test_helpers.factory.rst.txt new file mode 100644 index 00000000..3b3a5393 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.test_helpers.factory.rst.txt @@ -0,0 +1,20 @@ +Test Helper Factor Package +========================== + +Subpackages +----------- + +.. toctree:: + + seed.test_helpers.factory.lib + +Submodules +---------- + +Helpers +------- + +.. automodule:: seed.test_helpers.factory.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.test_helpers.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.test_helpers.rst.txt new file mode 100644 index 00000000..d0ebe883 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.test_helpers.rst.txt @@ -0,0 +1,17 @@ +Test Helpers Package +==================== + +Subpackages +----------- + +.. toctree:: + + seed.test_helpers.factory + +Module contents +--------------- + +.. automodule:: seed.test_helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.tests.functional.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.tests.functional.rst.txt new file mode 100644 index 00000000..774c5447 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.tests.functional.rst.txt @@ -0,0 +1,21 @@ +Tests (Functional) Package +========================== + +Submodules +---------- + +Base +---- +.. automodule:: seed.functional.tests.base + :members: + +Page +---- +.. automodule:: seed.functional.tests.page + :members: + +Pages +----- +.. automodule:: seed.functional.tests.pages + :members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.tests.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.tests.rst.txt new file mode 100644 index 00000000..dcbf1b28 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.tests.rst.txt @@ -0,0 +1,80 @@ +Tests Package +============= + +Submodules +---------- + +.. toctree:: + :maxdepth: 2 + + seed.test_helpers + seed.tests.functional + +Admin Views +----------- + +.. automodule:: seed.tests.test_admin_views + :members: + :undoc-members: + :show-inheritance: + +Decorators +---------- + +.. automodule:: seed.tests.test_decorators + :members: + :undoc-members: + :show-inheritance: + +Exporters +--------- + +.. automodule:: seed.tests.test_exporters + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. automodule:: seed.tests.test_models + :members: + :undoc-members: + :show-inheritance: + +Tasks +----- + +.. automodule:: seed.tests.test_tasks + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.tests.test_views + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: seed.tests.tests + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: seed.tests.functional + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: seed.tests.util + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.urls.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.urls.rst.txt new file mode 100644 index 00000000..ab11d6be --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.urls.rst.txt @@ -0,0 +1,29 @@ +URLs Package +============ + +Submodules +---------- + +Accounts +-------- + +.. automodule:: seed.urls.accounts + :members: + :undoc-members: + :show-inheritance: + +APIs +---- + +.. automodule:: seed.urls.api + :members: + :undoc-members: + :show-inheritance: + +Main +---- + +.. automodule:: seed.urls.main + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.utils.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.utils.rst.txt new file mode 100644 index 00000000..27fd9b6c --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.utils.rst.txt @@ -0,0 +1,37 @@ +Utilities Package +================= + +Submodules +---------- + +APIs +---- + +.. automodule:: seed.utils.api + :members: + :undoc-members: + :show-inheritance: + +Buildings +--------- + +.. automodule:: seed.utils.buildings + :members: + :undoc-members: + :show-inheritance: + +Organizations +------------- + +.. automodule:: seed.utils.organizations + :members: + :undoc-members: + :show-inheritance: + +Time +---- + +.. automodule:: seed.utils.time + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/modules/seed.views.rst.txt b/docs/code_documentation/2.22.0/_sources/modules/seed.views.rst.txt new file mode 100644 index 00000000..195e1ed6 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/modules/seed.views.rst.txt @@ -0,0 +1,49 @@ +Views Package +============= + +Submodules +---------- + +Accounts +-------------------------- + +.. automodule:: seed.views.accounts + :members: + :undoc-members: + :show-inheritance: + :noindex: + +APIs +---- + +.. automodule:: seed.views.api + :members: + :undoc-members: + :show-inheritance: + :noindex: + +Main +---- + +.. automodule:: seed.views.main + :members: + :undoc-members: + :show-inheritance: + :noindex: + +Meters +------ + +.. automodule:: seed.views.meters + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.views + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/2.22.0/_sources/setup_docker.rst.txt b/docs/code_documentation/2.22.0/_sources/setup_docker.rst.txt new file mode 100644 index 00000000..708d8b52 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/setup_docker.rst.txt @@ -0,0 +1,149 @@ +Installation using Docker +========================= + +Docker works natively on Linux, Mac OSX, and Windows 10. If you are using an older version of +Windows (and some older versions of Mac OSX), you will need to install Docker Toolbox. + +Choose either `Docker Native (Windows/OSX)`_ or `Docker Native (Ubuntu)`_ to +install Docker. + +Docker Native (Ubuntu) +---------------------- + +Follow instructions `here `_. + +* `Install Docker Compose `_ + + +Docker Native (Windows/OSX) +--------------------------- + +Following instructions `for Mac `_ or +`for Windows `_. Note that for OSX you must have docker desktop version `3.0 or later `. + +* `Install Docker Compose `_ + + +Building and Running Containers for Non-Development +------------------------------------------------------- + +* Run Docker Compose + + .. code-block:: bash + + docker-compose build + + `Be Patient`_ ... If the containers build successfully, then start the containers + + .. code-block:: bash + + docker volume create --name=seed_pgdata + docker volume create --name=seed_media + docker-compose up + + **Note that you may need to build the containers a couple times for everything to converge** + +* Login to container + + The docker-compose file creates a default user and password. Below are the defaults but can + be overridden by setting environment variables. + + .. code-block:: bash + + username: user@seed-platform.org + password: super-secret-password + + +.. note:: + + Don't forget that you need to reset your default username and password if you are going + to use these Docker images in production mode! + +Using Docker for Development +---------------------------- + +The development environment is configured for live reloading (i.e., restart webserver when files change) +and debugging. It builds off the base docker-compose.yml, so it's necessary +to specify the files being used in docker-compose commands as seen below. + +Build +^^^^^ + +.. code-block:: bash + + # create volumes for the database and media directory + docker volume create --name=seed_pgdata + docker volume create --name=seed_media + + # build the images + docker-compose -f docker-compose.yml -f docker-compose.dev.yml build + +Running the Server +^^^^^^^^^^^^^^^^^^ + +NOTE: the server config is sourced from config.settings.docker_dev, which will include +your local_untracked.py if it exists. If you have a local_untracked.py, make sure it doesn't +overwrite the database or celery configuration! + +.. code-block:: bash + + docker-compose -f docker-compose.yml -f docker-compose.dev.yml up + +If the server doesn't start successfully, and :code:`docker-compose logs` doesn't help, +the django development server probably failed to start due to an error in your config or code. +Unfortunately docker/django logging doesn't appear to work when the container is first started. +Just try running the server yourself with docker exec, and see what the output is. + +The development docker-compose file has some configurable parameters for specifying volumes to use: + +- SEED_DB_VOLUME: the name of the docker volume to mount for postgres +- SEED_MEDIA_VOLUME: the name of the docker volume to mount for the seed media folder + +Docker will use environment variables from the shell or from a .env file to set these values. + +This is useful if you want to switch between different databases for testing. +For example, if you want to create a separate volume for storing a production backup, you could do the following + +.. code-block:: bash + + docker volume create --name=seed_pgdata_prod + SEED_DB_VOLUME=seed_pgdata_prod docker-compose -f docker-compose.yml -f docker-compose.dev.yml up + +NOTE: you'll need to run :code:`docker-compose down` to remove the containers before you +can restart the containers connecting to different volumes. + +Running Tests +^^^^^^^^^^^^^ + +While the containers are running (i.e., after running the docker-compose up command), use docker exec to run tests in the web container: + +.. code-block:: bash + + docker exec -it seed_web ./manage.py test --settings config.settings.docker_dev + +Add the setting :code:`--nocapture` in order to see :code:`stdout` while running tests. You will need to do this in order to make use of debugging as described below or the output to your debug commands will not display until after the break point has passed and the tests are finished. + +Also worth noting: output from logging (_log.debug, etc) will not display in any situation unless a test fails. + +Debugging +^^^^^^^^^ + +To use pdb on the server, the web container has `remote-pdb `_ installed. +In your code, insert the following + +.. code-block:: bash + + import remote_pdb; remote_pdb.set_trace() + +Once the breakpoint is triggered, you should see the web container log something like "RemotePdb session open at 127.0.0.1:41653, waiting for connection ...". +To connect to the remote session, run netcat from inside the container (using the appropriate port). + +.. code-block:: bash + + docker exec -it seed_web nc 127.0.0.1:41653 + +.. _MacPorts: https://www.macports.org/ +.. _Homebrew: http://brew.sh/ +.. _npm: https://www.npmjs.com/ +.. _nodejs.org: http://nodejs.org/ +.. _Be Patient: https://www.youtube.com/watch?v=f4hkPn0Un_Q diff --git a/docs/code_documentation/2.22.0/_sources/setup_osx.rst.txt b/docs/code_documentation/2.22.0/_sources/setup_osx.rst.txt new file mode 100644 index 00000000..9bc64be9 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/setup_osx.rst.txt @@ -0,0 +1,383 @@ +Installation on OSX +=================== + +.. _virtualenv: https://virtualenv.pypa.io/en/latest/ +.. _pyenv: https://github.com/pyenv/pyenv +.. _virtualenvwrapper: https://virtualenvwrapper.readthedocs.io/en/latest/ +.. _MacPorts: https://www.macports.org/ +.. _Homebrew: http://brew.sh/ +.. _npm: https://www.npmjs.com/ +.. _nodejs.org: http://nodejs.org/ + +These instructions are for installing and running SEED on Mac OSX in +development mode. + +Quick Installation Instructions +------------------------------- + +This section is intended for developers who may already have their machine +ready for general development. If this is not the case, skip to Prerequisites. Note that SEED uses python 3. + +* install Postgres 11.1 and redis for cache and message broker +* install PostGIS 2.5 and enable it on the database using `CREATE EXTENSION postgis;` +* install TimescaleDB 1.5.0 +* use a virtualenv (if desired) +* `git clone git@github.com:seed-platform/seed.git` +* create a `local_untracked.py` in the `config/settings` folder and add CACHE and DB config (example `local_untracked.py.dist`) +* to enable geocoding, get MapQuest API key and attach it to your organization +* `export DJANGO_SETTINGS_MODULE=config.settings.dev` in all terminals used by SEED (celery terminal and runserver terminal) +* `pip install -r requirements/local.txt` + * for condas python, you way need to run this command to get pip install to succeed: `conda install -c conda-forge python-crfsuite` +* npm install +* `./manage.py migrate` +* `./manage.py create_default_user` +* `./manage.py runserver` +* `DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 4 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler` +* navigate to `http://127.0.0.1:8000/app/#/profile/admin` in your browser to add users to organizations +* main app runs at `127.0.0.1:8000/app` + +The `python manage.py create_default_user` will setup a default `superuser` +which must be used to access the system the first time. The management command +can also create other superusers. + +.. code-block:: console + + ./manage.py create_default_user --username=demo@seed-platform.org --organization=lbl --password=demo123 + + +Prerequisites +------------- + +These instructions assume you have MacPorts_ or Homebrew_. Your system +should have the following dependencies already installed: + +* git (`port install git` or `brew install git`) +* graphviz (`brew install graphviz`) +* pyenv_ (Recommended) + + .. note:: + + Although you *could* install Python packages globally, this is the + easiest way to install Python packages. Setting these up first will + help avoid polluting your base Python installation and make it much + easier to switch between different versions of the code. + + .. code-block:: bash + + brew install pyenv + brew install pyenv-virtualenv + pyenv install + pyenv virtualenv seed + pyenv local seed + + +PostgreSQL 11.1 +--------------- + +MacPorts:: + + sudo su - root + port install postgresql94-server postgresql94 postgresql94-doc + # init db + mkdir -p /opt/local/var/db/postgresql94/defaultdb + chown postgres:postgres /opt/local/var/db/postgresql94/defaultdb + su postgres -c '/opt/local/lib/postgresql94/bin/initdb -D /opt/local/var/db/postgresql94/defaultdb' + + # At this point, you may want to add start/stop scripts or aliases to + # ~/.bashrc or your virtualenv ``postactivate`` script + # (in ``~/.virtualenvs/{env-name}/bin/postactivate``). + + alias pg_start='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \ + -D /opt/local/var/db/postgresql94/defaultdb \ + -l /opt/local/var/db/postgresql94/defaultdb/postgresql.log start"' + alias pg_stop='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \ + -D /opt/local/var/db/postgresql94/defaultdb stop"' + + pg_start + + sudo su - postgres + PATH=$PATH:/opt/local/lib/postgresql94/bin/ + +Homebrew:: + + brew install postgres + # follow the post install instructions to add to launchagents or call + # manually with `postgres -D /usr/local/var/postgres` + # Skip the remaining Postgres instructions! + + + +Configure PostgreSQL. Replace 'seeddb', 'seeduser' with desired db/user. By +default use password `seedpass` when prompted. Use the code block below in development only since +the seeduser is a SUPERUSER. + +.. code-block:: bash + + createuser -P seeduser + createdb `whoami` + psql -c 'CREATE DATABASE "seeddb" WITH OWNER = "seeduser";' + psql -c 'GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO seeduser;' + psql -c 'ALTER ROLE seeduser SUPERUSER;' + + + +PostGIS 2.5 +----------- + +MacPorts:: + + # Assuming you're still root from installing PostgreSQL, + port install postgis2 + + + +Homebrew:: + + brew install postgis + + + +Configure PostGIS:: + + psql -d seeddb -c "CREATE EXTENSION postgis;" + + # For testing, give seed user superuser access: + # psql -c 'ALTER USER seeduser CREATEDB;' + + +If upgrading from an existing database or existing local_untracked.py file, make sure to add the +MapQuest API Key and set the database engine to 'ENGINE': 'django.contrib.gis.db.backends.postgis'. + +Now exit any root environments, becoming just yourself (even though it's not +that easy being green), for the remainder of these instructions. + + +TimescaleDB 1.5.0 +----------------- + +Note, as of version 1.5.0, dumping and restoring databases requires that both the source and target +database have the same version of TimescaleDB. + +Downloading From Source:: + + # Note: Installing from source should only be done + # if you have a Postgres installation not maintained by Homebrew. + # This installation requires C compiler (e.g., gcc or clang) and CMake version 3.4 or greater. + + git clone https://github.com/timescale/timescaledb.git + cd timescaledb + git checkout 1.5.0 + + # Bootstrap the build system + ./bootstrap + + # If OpenSSL can't be found by cmake - run the following instead + # ./bootstrap -DOPENSSL_ROOT_DIR= # e.g., -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl + + # To build the extension + cd build && make + + # To install + make install + + # Find postgresql.conf + # Then uncomment the shared_preload_libraries line changing it to the following + # shared_preload_libraries = 'timescaledb' + psql -d postgres -c "SHOW config_file;" + + # Restart PostgreSQL instance + + + +Python Packages +--------------- + +Run these commands as your normal user id. + +Change to a virtualenv (using virtualenvwrapper) or do the following as a +superuser. A virtualenv is usually better for development. Set the virtualenv +to seed. + +.. code-block:: bash + + workon seed + +Make sure PostgreSQL command line scripts are in your PATH (if using MacPorts) + +.. code-block:: bash + + export PATH=$PATH:/opt/local/lib/postgresql94/bin + +Some packages (uWSGI) may need to find your C compiler. Make sure you have +'gcc' on your system, and then also export this to the `CC` environment +variable: + +.. code-block:: bash + + export CC=gcc + +Install requirements with `pip` + +.. code-block:: bash + + pip install -r requirements/local.txt + +NodeJS/npm +---------- + +Install npm_. You can do this by installing from nodejs.org_, MacPorts, or +Homebrew: + +MacPorts:: + + sudo port install npm + +Homebrew:: + + brew install npm + +Configure Django and Databases +------------------------------ + +In the `config/settings` directory, there must be a file called +`local_untracked.py` that sets up databases and a number of other things. +To create and edit this file, start by copying over the template + +.. code-block:: bash + + cd config/settings + cp local_untracked.py.dist local_untracked.py + +Edit `local_untracked.py`. Open the file you created in your favorite editor. The PostgreSQL config section will look something like this: + +.. code-block:: python + + # postgres DB config + DATABASES = { + 'default': { + 'ENGINE': 'django.contrib.gis.db.backends.postgis', + 'NAME': 'seeddb', + 'USER': 'seeduser', + 'PASSWORD': 'seedpass', + 'HOST': 'localhost', + 'PORT': '5432', + } + } + +You may want to comment out the AWS settings. + +For Redis, edit the `CACHES` and `CELERY_BROKER_URL` values to look like this: + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + +MapQuest API Key +---------------- + +Register for a MapQuest API key: +``_ + +Visit the Manage Keys page: +``_ +Either create a new key or use the key initially provided. +Copy the "Consumer Key" into the target organizations MapQuest API Key field under the organization's settings page or directly within the DB. + +Run Django Migrations +--------------------- + +Change back to the root of the repository. Now run the migration script to set +up the database tables + +.. code-block:: bash + + export DJANGO_SETTINGS_MODULE=config.settings.dev + ./manage.py migrate + +Django Admin User +----------------- + +You need a Django admin (super) user. + +.. code-block:: bash + + ./manage.py create_default_user --username=admin@my.org --organization=seedorg --password=badpass + +Of course, you need to save this user/password somewhere, since this is what +you will use to login to the SEED website. + +If you want to do any API testing (and of course you do!), you will need to +add an API KEY for this user. You can do this in postgresql directly: + +.. code-block:: bash + + psql seeddb seeduser + seeddb=> update landing_seeduser set api_key='DEADBEEF' where id=1; + +The 'secret' key DEADBEEF is hard-coded into the test scripts. + +Install Redis +------------- + +You need to manually install Redis for Celery to work. + +MacPorts:: + + sudo port install redis + +Homebrew:: + + brew install redis + # follow the post install instructions to add to launchagents or + # call manually with `redis-server` + +Install JavaScript Dependencies +------------------------------- + +The JS dependencies are installed using node.js package management (npm). + +.. code-block:: bash + + npm install + +Start the Server +---------------- + +You should put the following statement in ~/.bashrc or add it to the +virtualenv post-activation script (e.g., in +`~/.virtualenvs/seed/bin/postactivate`). + +.. code-block:: bash + + export DJANGO_SETTINGS_MODULE=config.settings.dev + +The combination of Redis, Celery, and Django have been encapsulated in a +single shell script, which examines existing processes and does not start +duplicate instances: + +.. code-block:: bash + + ./bin/start-seed.sh + +When this script is done, the Django stand-alone server will be running in +the foreground. + +Login +----- + +Open your browser and navigate to http://127.0.0.1:8000 + +Login with the user/password you created before, e.g., `admin@my.org` and +`badpass`. + +.. note:: + + these steps have been combined into a script called `start-seed.sh`. + The script will also not start Celery or Redis if they already seem + to be running. diff --git a/docs/code_documentation/2.22.0/_sources/translation.rst.txt b/docs/code_documentation/2.22.0/_sources/translation.rst.txt new file mode 100644 index 00000000..b40ae388 --- /dev/null +++ b/docs/code_documentation/2.22.0/_sources/translation.rst.txt @@ -0,0 +1,88 @@ +Translating SEED +================ + +1. Update translations on `lokalise`_. + +2. Copy lokalise.yml.example to lokalise.yml. Update API token. + +3. Install lokalise locally + + .. code:: bash + + brew tap lokalise/cli-2 + brew install lokalise2 + +3. Run scripts if you have Lokalise CLI installed. If not, see scripts for manual steps. + + .. code:: bash + + script/get_python_translations.sh + script/get_angular_translations.sh + +4. Uncomment the ``useMissingTranslationHandlerLog`` line seed.js to log untranslated strings to the console for review + +5. Verify and commit changes + +**Note: The lokalize website is the canonical source of data. If you +change the locale files locally, then you need to push them to +lokalize.** + +TL;DR + +SEED is localized for more than just English, so a little more care is +needed as we add new UI. All translatable strings are held in either +per-language ``.json`` files (for Angular-controlled strings, which are +the majority), or ``.mo`` files (for strings supplied by Django). + +At render time, SEED will sniff out the browser's ``Accept:`` header. +Based on that, we choose the right file. The language files themselves +are key->value mappings from a translation "key" to a translated value. +Either Angular or Django will then swap that value into the DOM wherever +it sees the key. If no translation is available, the key remains in the +DOM. (There are some wrinkles with HTML styling and pluralization that +we'll review below). + +So, the basic flow on top of any new UI features is now: + +1. Tag any user-visible strings in the UI as "translatable." There are + currently 12 (!) ways in which to do this; see below. +2. Create the translation key at `lokalise`_. We're using lokalise + because it can smooth over differences in the file formats that + Angular and Django require, and is a nice tool for managing the + process of getting translations done by a native speaker: we can put + up screenshots to clarify how the translated phrase is used, track + translation progress, etc. +3. Get a translation done. As a placeholder, lokalise can provide an + auto-filled translation from Google Translate or a few other + services, but it's fairly straightforward to order a professional + translation through lokalise. +4. Pull new translation files into the right places in the source tree + and commit them. There are scripts under ``/scripts`` to make this + mostly automatic. +5. Visually check that the containing UI looks OK with the translated + string(s). Some languages (e.g., French, German) can be wordy relative + to English and cause UI elements like buttons to expand oddly. Adjust + the layout or adjust the translation as needed. + +.. _general-philosophies--style: + +General philosophies / style +---------------------------- + +Don't go crazy with indirection and interpolation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +It's probably better to err on the side of too many keys than to get +clever with interpolation or Angular expressions to avoid +near-duplicates of keys. The aim should be that there is at least one +place where a competent translator can see the whole string at once. + +Compare: + +:: + +

{$:: inventory_type == 'taxlots' ? + translations['INCLUDE_SHARED_TAXLOTS'] : + translations['INCLUDE_SHARED'] + +.. _lokalise: https://lokalise.com/project/3537487659ca9b1dce98a7.36378626/?view=multi diff --git a/docs/code_documentation/2.22.0/_static/_sphinx_javascript_frameworks_compat.js b/docs/code_documentation/2.22.0/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/docs/code_documentation/2.22.0/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/docs/code_documentation/2.22.0/_static/basic.css b/docs/code_documentation/2.22.0/_static/basic.css new file mode 100644 index 00000000..30fee9d0 --- /dev/null +++ b/docs/code_documentation/2.22.0/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/_static/css/badge_only.css b/docs/code_documentation/2.22.0/_static/css/badge_only.css new file mode 100644 index 00000000..c718cee4 --- /dev/null +++ b/docs/code_documentation/2.22.0/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/docs/code_documentation/2.22.0/_static/css/fonts/Roboto-Slab-Bold.woff similarity index 100% rename from docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff rename to docs/code_documentation/2.22.0/_static/css/fonts/Roboto-Slab-Bold.woff diff --git a/docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/docs/code_documentation/2.22.0/_static/css/fonts/Roboto-Slab-Bold.woff2 similarity index 100% rename from docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 rename to docs/code_documentation/2.22.0/_static/css/fonts/Roboto-Slab-Bold.woff2 diff --git a/docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/docs/code_documentation/2.22.0/_static/css/fonts/Roboto-Slab-Regular.woff similarity index 100% rename from docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff rename to docs/code_documentation/2.22.0/_static/css/fonts/Roboto-Slab-Regular.woff diff --git a/docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/docs/code_documentation/2.22.0/_static/css/fonts/Roboto-Slab-Regular.woff2 similarity index 100% rename from docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 rename to docs/code_documentation/2.22.0/_static/css/fonts/Roboto-Slab-Regular.woff2 diff --git a/docs/code_documentation/latest/_static/fonts/fontawesome-webfont.eot b/docs/code_documentation/2.22.0/_static/css/fonts/fontawesome-webfont.eot similarity index 100% rename from docs/code_documentation/latest/_static/fonts/fontawesome-webfont.eot rename to docs/code_documentation/2.22.0/_static/css/fonts/fontawesome-webfont.eot diff --git a/docs/code_documentation/latest/_static/fonts/fontawesome-webfont.svg b/docs/code_documentation/2.22.0/_static/css/fonts/fontawesome-webfont.svg similarity index 100% rename from docs/code_documentation/latest/_static/fonts/fontawesome-webfont.svg rename to docs/code_documentation/2.22.0/_static/css/fonts/fontawesome-webfont.svg diff --git a/docs/code_documentation/latest/_static/fonts/fontawesome-webfont.ttf b/docs/code_documentation/2.22.0/_static/css/fonts/fontawesome-webfont.ttf similarity index 100% rename from docs/code_documentation/latest/_static/fonts/fontawesome-webfont.ttf rename to docs/code_documentation/2.22.0/_static/css/fonts/fontawesome-webfont.ttf diff --git a/docs/code_documentation/latest/_static/fonts/fontawesome-webfont.woff b/docs/code_documentation/2.22.0/_static/css/fonts/fontawesome-webfont.woff similarity index 100% rename from docs/code_documentation/latest/_static/fonts/fontawesome-webfont.woff rename to docs/code_documentation/2.22.0/_static/css/fonts/fontawesome-webfont.woff diff --git a/docs/code_documentation/latest/_static/fonts/fontawesome-webfont.woff2 b/docs/code_documentation/2.22.0/_static/css/fonts/fontawesome-webfont.woff2 similarity index 100% rename from docs/code_documentation/latest/_static/fonts/fontawesome-webfont.woff2 rename to docs/code_documentation/2.22.0/_static/css/fonts/fontawesome-webfont.woff2 diff --git a/docs/code_documentation/latest/_static/fonts/Lato/lato-bolditalic.woff b/docs/code_documentation/2.22.0/_static/css/fonts/lato-bold-italic.woff similarity index 100% rename from docs/code_documentation/latest/_static/fonts/Lato/lato-bolditalic.woff rename to docs/code_documentation/2.22.0/_static/css/fonts/lato-bold-italic.woff diff --git a/docs/code_documentation/latest/_static/fonts/Lato/lato-bolditalic.woff2 b/docs/code_documentation/2.22.0/_static/css/fonts/lato-bold-italic.woff2 similarity index 100% rename from docs/code_documentation/latest/_static/fonts/Lato/lato-bolditalic.woff2 rename to docs/code_documentation/2.22.0/_static/css/fonts/lato-bold-italic.woff2 diff --git a/docs/code_documentation/latest/_static/fonts/Lato/lato-bold.woff b/docs/code_documentation/2.22.0/_static/css/fonts/lato-bold.woff similarity index 100% rename from docs/code_documentation/latest/_static/fonts/Lato/lato-bold.woff rename to docs/code_documentation/2.22.0/_static/css/fonts/lato-bold.woff diff --git a/docs/code_documentation/latest/_static/fonts/Lato/lato-bold.woff2 b/docs/code_documentation/2.22.0/_static/css/fonts/lato-bold.woff2 similarity index 100% rename from docs/code_documentation/latest/_static/fonts/Lato/lato-bold.woff2 rename to docs/code_documentation/2.22.0/_static/css/fonts/lato-bold.woff2 diff --git a/docs/code_documentation/latest/_static/fonts/Lato/lato-italic.woff b/docs/code_documentation/2.22.0/_static/css/fonts/lato-normal-italic.woff similarity index 100% rename from docs/code_documentation/latest/_static/fonts/Lato/lato-italic.woff rename to docs/code_documentation/2.22.0/_static/css/fonts/lato-normal-italic.woff diff --git a/docs/code_documentation/latest/_static/fonts/Lato/lato-italic.woff2 b/docs/code_documentation/2.22.0/_static/css/fonts/lato-normal-italic.woff2 similarity index 100% rename from docs/code_documentation/latest/_static/fonts/Lato/lato-italic.woff2 rename to docs/code_documentation/2.22.0/_static/css/fonts/lato-normal-italic.woff2 diff --git a/docs/code_documentation/latest/_static/fonts/Lato/lato-regular.woff b/docs/code_documentation/2.22.0/_static/css/fonts/lato-normal.woff similarity index 100% rename from docs/code_documentation/latest/_static/fonts/Lato/lato-regular.woff rename to docs/code_documentation/2.22.0/_static/css/fonts/lato-normal.woff diff --git a/docs/code_documentation/latest/_static/fonts/Lato/lato-regular.woff2 b/docs/code_documentation/2.22.0/_static/css/fonts/lato-normal.woff2 similarity index 100% rename from docs/code_documentation/latest/_static/fonts/Lato/lato-regular.woff2 rename to docs/code_documentation/2.22.0/_static/css/fonts/lato-normal.woff2 diff --git a/docs/code_documentation/2.22.0/_static/css/theme.css b/docs/code_documentation/2.22.0/_static/css/theme.css new file mode 100644 index 00000000..19a446a0 --- /dev/null +++ b/docs/code_documentation/2.22.0/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/_static/doctools.js b/docs/code_documentation/2.22.0/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/docs/code_documentation/2.22.0/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs/code_documentation/2.22.0/_static/documentation_options.js b/docs/code_documentation/2.22.0/_static/documentation_options.js new file mode 100644 index 00000000..68e02f19 --- /dev/null +++ b/docs/code_documentation/2.22.0/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '2.22.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/_static/file.png b/docs/code_documentation/2.22.0/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/docs/code_documentation/2.22.0/_static/file.png differ diff --git a/docs/code_documentation/2.22.0/_static/graphviz.css b/docs/code_documentation/2.22.0/_static/graphviz.css new file mode 100644 index 00000000..8d81c02e --- /dev/null +++ b/docs/code_documentation/2.22.0/_static/graphviz.css @@ -0,0 +1,19 @@ +/* + * graphviz.css + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- graphviz extension. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +img.graphviz { + border: 0; + max-width: 100%; +} + +object.graphviz { + max-width: 100%; +} diff --git a/docs/code_documentation/2.22.0/_static/jquery.js b/docs/code_documentation/2.22.0/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/docs/code_documentation/2.22.0/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/_static/js/html5shiv.min.js b/docs/code_documentation/2.22.0/_static/js/html5shiv.min.js new file mode 100644 index 00000000..cd1c674f --- /dev/null +++ b/docs/code_documentation/2.22.0/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/_static/js/theme.js b/docs/code_documentation/2.22.0/_static/js/theme.js new file mode 100644 index 00000000..1fddb6ee --- /dev/null +++ b/docs/code_documentation/2.22.0/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/docs/code_documentation/2.22.0/_static/minus.png b/docs/code_documentation/2.22.0/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/docs/code_documentation/2.22.0/_static/minus.png differ diff --git a/docs/code_documentation/2.22.0/_static/plus.png b/docs/code_documentation/2.22.0/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/docs/code_documentation/2.22.0/_static/plus.png differ diff --git a/docs/code_documentation/2.22.0/_static/pygments.css b/docs/code_documentation/2.22.0/_static/pygments.css new file mode 100644 index 00000000..0d49244e --- /dev/null +++ b/docs/code_documentation/2.22.0/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/_static/searchtools.js b/docs/code_documentation/2.22.0/_static/searchtools.js new file mode 100644 index 00000000..7918c3fa --- /dev/null +++ b/docs/code_documentation/2.22.0/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/docs/code_documentation/2.22.0/_static/sphinx_highlight.js b/docs/code_documentation/2.22.0/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/docs/code_documentation/2.22.0/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/docs/code_documentation/2.22.0/api.html b/docs/code_documentation/2.22.0/api.html new file mode 100644 index 00000000..4882ea4d --- /dev/null +++ b/docs/code_documentation/2.22.0/api.html @@ -0,0 +1,185 @@ + + + + + + + API — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

API

+
+

Authentication

+

Authentication is handled via an encoded authorization token set in a HTTP header. +To request an API token, go to /app/#/profile/developer and click ‘Get a New API Key’.

+

Authenticate every API request with your username (email, all lowercase) and the API key via Basic Auth. +The header is sent in the form of Authorization: Basic <credentials>, where credentials is the base64 encoding of the email and key joined by a single colon :.

+

Using Python, use the requests library:

+
import requests
+
+result = requests.get('https://seed-platform.org/api/version/', auth=(user_email, api_key))
+print result.json()
+
+
+

Using curl, pass the username and API key as follows:

+
curl -u user_email:api_key http://seed-platform.org/api/version/
+
+
+

If authentication fails, the response’s status code will be 302, redirecting the user to /app/login.

+
+
+

Payloads

+

Many requests require a JSON-encoded payload and parameters in the query string of the url. A frequent +requirement is including the organization_id of the org you belong to. For example:

+
curl -u user_email:api_key https://seed-platform.org/api/v2/organizations/12/
+
+
+

Or in a JSON payload:

+
curl -u user_email:api_key \
+  -d '{"organization_id":6, "role": "viewer"}' \
+  https://seed-platform.org/api/v2/users/12/update_role/
+
+
+

Using Python:

+
params = {'organization_id': 6, 'role': 'viewer'}
+result = requests.post('https://seed-platform.org/api/v2/users/12/update_role/',
+                       data=json.dumps(params),
+                       auth=(user_email, api_key))
+print result.json()
+
+
+
+
+

Responses

+

Responses from all requests will be JSON-encoded objects, as specified in each endpoint’s documentation. +In the case of an error, most endpoints will return this instead of the expected payload (or an HTTP status code):

+
{
+    "status": "error",
+    "message": "explanation of the error here"
+}
+
+
+
+
+

API Endpoints

+

A list of interactive endpoints are available by accessing the API menu item on the left navigation +pane within you account on your SEED instance.

+

To view a list of non-interactive endpoints without an account, view swagger on the development server.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/aws.html b/docs/code_documentation/2.22.0/aws.html new file mode 100644 index 00000000..a85931f8 --- /dev/null +++ b/docs/code_documentation/2.22.0/aws.html @@ -0,0 +1,275 @@ + + + + + + + AWS Setup — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

AWS Setup

+

Amazon Web Services (AWS) provides the preferred hosting for the SEED Platform.

+

seed is a Django Project and Django’s documentation is an excellent place for general +understanding of this project’s layout.

+
+

Prerequisites

+

Ubuntu server 18.04 LTS

+
+

Note

+

These instructions have not been updated for Ubuntu 18.04. It is recommended to use Docker-based deployments.

+
+
sudo apt-get update
+sudo apt-get upgrade
+sudo apt-get install -y libpq-dev python-dev python-pip libatlas-base-dev \
+gfortran build-essential g++ npm libxml2-dev libxslt1-dev git mercurial \
+libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python
+
+
+

PostgreSQL and Redis are not included in the above commands. For a quick installation on AWS it +is okay to install PostgreSQL and Redis locally on the AWS instance. If a more permanent and +scalable solution, it is recommended to use AWS’s hosted Redis (ElastiCache) and PostgreSQL service.

+
+

Note

+

postgresql >=9.4 is required to support JSON Type

+
+
# To install PostgreSQL and Redis locally
+sudo apt-get install redis-server
+sudo apt-get install postgresql postgresql-contrib
+
+
+
+

Amazon Web Services (AWS) Dependencies

+

The following AWS services can be used for SEED but are not required:

+
    +
  • RDS (PostgreSQL >=9.4)

  • +
  • ElastiCache (redis)

  • +
  • SES

  • +
+
+
+
+

Python Dependencies

+

Clone the SEED repository from github

+
$ git clone git@github.com:SEED-platform/seed.git
+
+
+

enter the repo and install the python dependencies from requirements

+
$ cd seed
+$ sudo pip install -r requirements/aws.txt
+
+
+
+
+

JavaScript Dependencies

+

npm is required to install the JS dependencies.

+
$ sudo apt-get install build-essential
+$ sudo apt-get install curl
+
+
+
$ npm install
+
+
+
+
+

Database Configuration

+

Copy the local_untracked.py.dist file in the config/settings directory to +config/settings/local_untracked.py, and add a DATABASES configuration with your database username, +password, host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database +instance you have manually installed within your infrastructure.

+
# Database
+DATABASES = {
+    'default': {
+        'ENGINE':'django.db.backends.postgresql_psycopg2',
+        'NAME': 'seed',
+        'USER': '',
+        'PASSWORD': '',
+        'HOST': '',
+        'PORT': '',
+    }
+}
+
+
+
+

Note

+

In the above database configuration, seed is the database name, this +is arbitrary and any valid name can be used as long as the database exists.

+
+

create the database within the postgres psql shell:

+
CREATE DATABASE seed;
+
+
+

or from the command line:

+
createdb seed
+
+
+

create the database tables and migrations:

+
python manage.py syncdb
+python manage.py migrate
+
+
+

create a superuser to access the system

+
$ python manage.py create_default_user --username=demo@example.com --organization=example --password=demo123
+
+
+
+

Note

+

Every user must be tied to an organization, visit /app/#/profile/admin +as the superuser to create parent organizations and add users to them.

+
+
+
+

Cache and Message Broker

+

The SEED project relies on redis for both cache and message brokering, and +is available as an AWS ElastiCache service. +local_untracked.py should be updated with the CACHES and CELERY_BROKER_URL +settings.

+
CELERY_BROKER_URL = 'redis://seed-core-cache.ntmprk.0001.usw2.cache.amazonaws.com:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+
+
+
+

Running Celery the Background Task Worker

+

Celery is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, celery +can be started:

+
celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/data_model.html b/docs/code_documentation/2.22.0/data_model.html new file mode 100644 index 00000000..115e75cd --- /dev/null +++ b/docs/code_documentation/2.22.0/data_model.html @@ -0,0 +1,606 @@ + + + + + + + Data Model — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Data Model

+_images/case-a.png +_images/case-b.png +_images/case-c.png +_images/case-d.png +_images/data-model.png +
+

Todo

+

Documentation below is out of state and needs updated.

+
+

Our primary data model is based on a tree structure with BuildingSnapshot +instances as nodes of the tree and the tip of the tree referenced by a +CanonicalBuilding.

+

Take the following example: a user has loaded a CSV file containing information +about one building and created the first BuildingSnapshot (BS0). At this point +in time, BS0 is linked to the first CanonicalBuilding (CB0), and CB0 is also +linked to BS0.

+
BS0 <-- CB0
+BS0 --> CB0
+
+
+

These relations are represented in the database as foreign keys from the +BuildingSnapshot table to the CanonicalBuilding table, and from the +CanonicalBuilding table to the BuildingSnapshot table.

+

The tree structure comes to fruition when a building, BS0 in our case, is +matched with a new building, say BS1, enters the system and is auto-matched.

+

Here BS1 entered the system and was matched with BS0. When a match occurs, +a new BuildingSnapshot is created, BS2, with the fields from the existing +BuildingSnapshot, BS0, and the new BuildingSnapshot, BS1, merged +together. If both the existing and new BuildingSnapshot have data for a +given field, the new record’s fields are preferred and merged into the child, B3.

+

The fields from new snapshot are preferred because that is the newer of the +two records from the perspective of the system. By preferring the most recent fields +this allows for evolving building snapshots over time. For example, if an existing +canonical record has a Site EUI value of 75 and some changes happen to a building +that cause this to change to 80 the user can submit a new record with that change.

+

All BuildingSnapshot instances point to a CanonicalBuilding.

+
BS0  BS1
+  \ /
+  BS2 <-- CB0
+
+BS0 --> CB0
+BS1 --> CB0
+BS2 --> CB0
+
+
+
+

parents and children

+

BuildingSnapshots also have linkage to other BuildingSnapshots in order to +keep track of their parents and children. This is represented in the +Django model as a many-to-many relation from BuildingSnapshot to BuildingSnapshot. +It is represented in the PostgreSQL database as an additional seed_buildingsnapshot_children +table.

+

In our case here, BS0 and BS1 would both have children BS2, and BS2 would +have parents BS0 and BS1.

+
+

Note

+

throughout most of the application, the search_buildings endpoint +is used to search or list active building. This is to say, buildings that +are pointed to by an active CanonicalBuilding. +The search_mapping_results endpoint allows the search of buildings +regardless of whether the BuildingSnapshot is pointed to by an active +CanonicalBuilding or not and this search is needed during the mapping +preview and matching sections of the application.

+
+

For illustration purposes let’s suppose BS2 and a new building BS3 match to form a child BS4.

+ + + + + + + + + + + + + + + + + + + + +

parent

child

BS0

BS2

BS1

BS2

BS2

BS4

BS3

BS4

+

And the corresponding tree would look like:

+
BS0  BS1
+  \ /
+  BS2  BS3
+    \  /
+     BS4 <-- CB0
+
+BS0 --> CB0
+BS1 --> CB0
+BS2 --> CB0
+BS3 --> CB0
+BS4 --> CB0
+
+
+
+

matching

+

During the auto-matching process, if a raw BuildingSnapshot matches an +existing BuildingSnapshot instance, then it will point to the existing +BuildingSnapshot instance’s CanonicalBuilding. In the case where there is no +existing BuildingSnapshot to match, a new CanonicalBuilding will be created, as +happened to B0 and C0 above.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

field

BS0

BS1

BS2 (child)

id1

11

11

11

id2

12

12

id3

13

13

id4

14

15

15

+
+
+
+

manual-matching vs auto-matching

+

Since BuildingSnapshots can be manually matched, there is the possibility for +two BuildingSnapshots each with an active CanonicalBuilding to match and the +system has to choose to move only one CanonicalBuilding to the tip of the tree +for the primary BuildingSnapshot and deactivate the secondary +BuildingSnapshot’s CanonicalBuilding.

+

Take for example:

+
BS0  BS1
+  \ /
+  BS2  BS3
+    \  /
+     BS4 <-- CB0 (active: True)         BS5 <-- CB1 (active: True)
+
+
+

If a user decides to manually match BS4 and BS5, the system will take the +primary BuildingSnapshot’s CanonicalBuilding and have it point to their +child and deactivate CB1. The deactivation is handled by setting a field +on the CanonicalBuilding instance, active, from True to False.

+

Here is what the tree would look like after the manual match of BS4 and +BS5:

+
BS0  BS1
+  \ /
+  BS2  BS3
+    \  /
+     BS4  BS5 <-- CB1 (active: False)
+       \  /
+        BS6 <-- CB0 (active: True)
+
+
+

Even though BS5 is pointed to by a CanonicalBuilding, CB1, BS5 will not be +returned by the normal search_buildings endpoint because the +CanonicalBuilding pointing to it has its field active set to False.

+
+

Note

+

anytime a match is unmatched the system will create a new +CanonicalBuilding or set an existing CanonicalBuilding’s active field to +True for any leaf BuildingSnapshot trees.

+
+
+
+

what really happens to the BuildingSnapshot table on import (and when)

+

The above is conceptually what happens but sometimes the devil is in the details. +Here is what happens to the BuildingSnapshot table in the database when records +are imported.

+

Every time a record is added at least two BuildingSnapshot records are created.

+

Consider the following simple record:

+ + + + + + + + + + + + + + + + + +

Property Id

Year Ending

Property Floor Area

Address 1

Release Date

499045

2000

1234

1 fake st

12/12/2000

+

The first thing the user is upload the file. When the user sees the +“Successful Upload!” dialog one record has been added to the +BuildingSnapshot table.

+

This new record has an id (73700 in this case) and a created and +modified timestamp. Then there are a lot of empty fields and a +source_type of 0. Then there is the extra_data column which contains +the contents of the record in key-value form:

+
+
Address 1:
+

“1 fake st”

+
+
Property Id:
+

“499045”

+
+
Year Ending:
+

“2000”

+
+
Release Date:
+

“12/12/2000”

+
+
Property Floor Area:
+

“1234”

+
+
+

And a corresponding extra_data_sources that looks like

+
+
Address 1:
+

73700

+
+
Property Id:
+

73700

+
+
Year Ending:
+

73700

+
+
Release Date:
+

73700

+
+
Property Floor Area:
+

73700

+
+
+

All of the fields that look like _source_id are also populated +with 73700 E.G. owner_postal_code_source_id.

+

The other fields of interest are the organization field which +is populated with the user’s default organization and the import_file_id +field which is populated with a reference to a data_importer_importfile record.

+

At this point the record has been created before the user hits the +“Continue to data mapping” button.

+

The second record (id = 73701) is created by the time the user gets to the screen +with the “Save Mappings” button. This second record has the following fields populated:

+
    +
  • id

  • +
  • created

  • +
  • modified

  • +
  • pm_property_id

  • +
  • year_ending

  • +
  • gross_floor_area

  • +
  • address_line_1

  • +
  • release_date

  • +
  • source_type (this is 2 instead of 0 as with the other record)

  • +
  • import_file_id

  • +
  • organization_id.

  • +
+

That is all. All other fields are empty. In this case that is all that happens.

+

Now consider the same user uploading a new file from the next year that looks like

+ + + + + + + + + + + + + + + + + +

Property Id

Year Ending

Property Floor Area

Address 1

Release Date

499045

2000

1234

1 fake st

12/12/2001

+

As before one new record is created on upload. This has id 73702 and follows the same +pattern as 73700. And similarly 73703 is created like 73701 before the “Save Mappings” +button appears.

+

However this time the system was able to make a match with an existing record. +After the user clicks the “Confirm mappings & start matching” button a new record +is created with ID 73704.

+

73704 is identical to 73703 (in terms of contents of the BuildingSnapshot table only) +with the following exceptions:

+
    +
  • created and modified timestamps are different

  • +
  • match type is populated and has a value of 1

  • +
  • confidence is populated and has a value of .9

  • +
  • source_type is 4 instead of 2

  • +
  • canonical_building_id is populated with a value

  • +
  • import_file_id is NULL

  • +
  • last_modified_by_id is populated with value 2 (This is a key into the landing_seeduser table)

  • +
  • address_line_1_source_id is 73701

  • +
  • gross_floor_area_source_id is populated with value 73701

  • +
  • pm_property_id_source_id is populated with 73701

  • +
  • release_date_source_id is populated with 73701

  • +
  • year_ending_source_id is populated with 73701

  • +
+
+
+

what really happens to the CanonicalBuilding table on import (and when)

+

In addition to the BuildingSnapshot table the CanonicalBuilding table is also updated +during the import process. To summarize the above 5 records were created in the +BuildingSnapshot table:

+
    +
  1. 73700 is created from the raw 2000 data

  2. +
  3. 73701 is the mapped 2000 data,

  4. +
  5. 73702 is created from the raw 2001 data

  6. +
  7. 73703 is the mapped 2001 data

  8. +
  9. 73704 is the result of merging the 2000 and 2001 data.

  10. +
+

In this process CanonicalBuilding is updated twice. First when the 2000 record is imported the +CanonicalBuilding gets populated with one new row at the end of the matching step. +I.E. when the user sees the “Load More Data” screen. At this point there is a new row that looks like

+ + + + + + + + + + + + + +

id

active

canonical_building_id

20505

TRUE

73701

+

At this point there is one new canonical building and that is the BuildingSnapshot with +id 73701. Next the user uploads the 2001 data. When the “Matching Results” screen +appears the CanonicalBuilding table has been updated. Now it looks like

+ + + + + + + + + + + + + +

id

active

canonical_building_id

20505

TRUE

73704

+

There is still only one canonical building but now it is the BuildingSnapshot record +that is the result of merging the 2000 and 2001 data: id = 73704.

+
+
+

organization

+

BuildingSnapshots belong to an Organization field that is a foreign key into the organization +model (orgs_organization in Postgres).

+

Many endpoints filter the buildings based on the organizations the requesting user +belongs to. E.G. get_buildings changes which fields are returned based on the +requesting user’s membership in the BuildingSnapshot’s organization.

+
+
+

*_source_id fields

+

Any field in the BuildingSnapshot table that is populated with data from a +submitted record will have a corresponding _source_id field. E.G +pm_property_id has pm_property_id_source_id, +address_line_1 has address_line_1_source_id, +etc…

+

These are foreign keys into the BuildingSnapshot that is the source of that +value. To extend the above table

+ + + + + + + + + + + + + + + + + + + + + + + +

field

BS0

BS1

BS2 (child)

BS2 (child) _source_id

id1

11

11

BS0

id2

12

12

BS1

+

NOTE: The BuildingSnapshot records made from the raw input file have all the +_source_id fields populated with that record’s ID. The non-canonical BuildingSnapshot +records created from the mapped data have none set. The canonical BuildingSnapshot +records that are the result of merging two records have only the _source_id fields +set where the record itself has data. E.G. in the above address_line_1 is set to +“1 fake st.” so there is a value in the canonical BuildingSnapshot’s address_line_1_source_id +field. However there is no block number so block_number_source_id is empty. This +is unlike the two raw BuildingSnapshot records who also have no block_number but +nevertheless have a block_number_source_id populated.

+
+
+

extra_data

+

The BuildingSnapshot model has many “named” fields. Fields like “address_line_1”, +“year_built”, and “pm_property_id”. However the users are allowed to submit files +with arbitrary fields. Some of those arbitrary fields can be mapped to “named” +fields. E.G. “Street Address” can usually be mapped to “Address Line 1”. +For all the fields that cannot be mapped like that there is the extra_data field.

+

extra_data is Django json field that serves as key-value storage for other +user-submitted fields. As with the other “named” fields there is a corresponding +extra_data_sources field that serves the same role as the other _source_id fields. +E.G. If a BuildingSnapshot has an extra_data field that looks like

+
+
an_unknown_field:
+

1

+
+
something_else:
+

2

+
+
+

It should have an extra_data_sources field that looks like

+
+
an_unknown_field:
+

some_BuildingSnapshot_id

+
+
something_else:
+

another_BuildingSnapshot_id

+
+
+
+
+

saving and possible data loss

+

When saving a Property file some fields that are truncated if too long. +The following are truncated to 255 characters

+
    +
  • jurisdiction_tax_lot_id

  • +
  • pm_property_id

  • +
  • custom_id_1

  • +
  • ubid

  • +
  • lot_number

  • +
  • block_number

  • +
  • district

  • +
  • owner

  • +
  • owner_email

  • +
  • owner_telephone

  • +
  • owner_address

  • +
  • owner_city_state

  • +
  • owner_postal_code

  • +
+

And the following are truncated to 255:

+
    +
  • property_name

  • +
  • address_line_1

  • +
  • address_line_2

  • +
  • city

  • +
  • postal_code

  • +
  • state_province

  • +
  • building_certification

  • +
+

No truncation happens to any of the fields stored in extra_data.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/data_quality.html b/docs/code_documentation/2.22.0/data_quality.html new file mode 100644 index 00000000..20e2dad9 --- /dev/null +++ b/docs/code_documentation/2.22.0/data_quality.html @@ -0,0 +1,126 @@ + + + + + + + Data Quality — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Data Quality

+

Data quality checks are run after the data are paired, during import of Properties/TaxLots, or on-demand by selecting rows in the inventory +page and clicking the action button. This checks whether any default or user-defined Rules are broken or satisfied by Property/TaxLot records.

+

Notably, in most cases when data quality checks are run, Labels can be applied for any broken Rules that have a Label. +To elaborate, Rules can have an attached Label. When a data quality check is run, records that break one of these “Labeled Rules” +are then given that Label. The case where this Label attachment does not happen is during import due to performance reasons.

+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/deployment.html b/docs/code_documentation/2.22.0/deployment.html new file mode 100644 index 00000000..ef36e29d --- /dev/null +++ b/docs/code_documentation/2.22.0/deployment.html @@ -0,0 +1,212 @@ + + + + + + + Deployment Guide — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Deployment Guide

+

SEED is intended to be installed on Linux instances in the cloud (e.g., AWS), and on local hardware. SEED Platform does not officially support Windows for production deployment. If this is desired, see the Django notes.

+ +
+

Migrations

+

Migrations are handles through Django; however, various versions have customs actions for the migrations. See the migrations page for more information.

+
+
+

Monitoring

+
+

Sentry

+

Sentry can monitor your webservers for any issues. To enable sentry add the following to +your local_untracked.py files after setting up your Sentry account on sentry.io.

+

The RAVEN_CONFIG is used for the backend and the SENTRY_JS_DSN is used for the frontend. At the moment, +it is recommended to setup two sentry projects, one for backend and one for frontend.

+
import sentry_sdk
+from sentry_sdk.integrations.django import DjangoIntegration
+from sentry_sdk.integrations.celery import CeleryIntegration
+
+sentry_sdk.init(
+    dsn="https://<user>@<key>.ingest.sentry.io/<job>",
+    integrations=[
+        DjangoIntegration(),
+        CeleryIntegration(),
+    ],
+
+    # Set traces_sample_rate to 1.0 to capture 100%
+    # of transactions for performance monitoring.
+    # We recommend adjusting this value in production.
+    traces_sample_rate=1.0,
+
+    # If you wish to associate users to errors (assuming you are using
+    # django.contrib.auth) you may enable sending PII data.
+    send_default_pii=True
+)
+
+SENTRY_JS_DSN = 'https://<key>@sentry.io/<job_id>'
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/developer_resources.html b/docs/code_documentation/2.22.0/developer_resources.html new file mode 100644 index 00000000..d3e4e807 --- /dev/null +++ b/docs/code_documentation/2.22.0/developer_resources.html @@ -0,0 +1,634 @@ + + + + + + + Developer Resources — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Developer Resources

+ +
+

General Notes

+
+

Pre-commit

+

We use precommit commits for formatting. Set it up locally with

+
pre-commit install
+
+
+
+
+

Flake Settings

+

Flake is used to statically verify code syntax. If the developer is running +flake from the command line, they should ignore the following checks in order +to emulate the same checks as the CI machine.

+ + + + + + + + + + + + + + + + + + + + + + + +

Code

Description

E402

module level import not at top of file

E501

line too long (82 characters) or max-line = 100

E731

do not assign a lambda expression, use a def

W503

line break occurred before a binary operator

W504

line break occurred after a binary operator

+

To run flake locally call:

+
tox -e flake8
+
+
+
+
+

Python Type Hints

+

Python type hints are beginning to be added to the SEED codebase. The benefits are +eliminating some accidental typing mistakes to prevent bugs as well as a better IDE +experience.

+
+

Usage

+

SEED does not require exhaustive type annotations, but it is recommended you add them if you +create any new functions or refactor any existing code where it might be beneficial (e.g. types +that appear ambiguous or that the IDE can’t determine) and not require a ton of additional effort.

+

When applicable, we recommend you use built-in collection types +such as list, dict or tuple instead of the capitalized types +from the typing module. You can also use TypedDict and NotRequired from the typing_extensions +package to specify the types of required/optional keys of dictionaries.

+

Common gotchas:

+
    +
  • If trying to annotate a class method with the class itself, import from __future__ import annotations

  • +
  • If you’re getting warnings about runtime errors due to a type name, make sure your IDE is set up to point to an environment with python 3.9

  • +
  • If you’re wasting time trying to please the type checker, feel free to throw # type: ignore on the problematic line (or at the top of the file to ignore all issues for that file)

  • +
+
+
+

Type Checking

+

CI currently runs static type checking on the codebase using mypy. For +your own IDE, we recommend the following extensions:

+
    +
  • VSCode: Pylance (uses Microsoft’s Pyright type checking)

  • +
+

To run the same typechecking applied in CI (i.e., using mypy) you can run the following

+
tox -e mypy
+
+
+
+
+
+
+

Django Notes

+
+

Adding New Fields to Database

+

Adding new fields to SEED can be complicated since SEED has a mix of typed fields (database fields) and extra data +fields. Follow the steps below to add new fields to the SEED database:

+
    +
  1. Add the field to the PropertyState or the TaxLotState model. Adding fields to the Property or TaxLot models is more complicated and not documented yet.

  2. +
  3. Add field to list in the following locations:

  4. +
+
    +
  • models/columns.py: Column.DATABASE_COLUMNS

  • +
  • TaxLotState.coparent or PropertyState.coparent: SQL query and keep_fields

  • +
+
    +
  1. Run ./manage.py makemigrations

  2. +
  3. Add in a Python script in the new migration to add in the new column into every organizations list of columns. Note that the new_db_fields will be the same as the data in the Column.DATABASE_COLUMNS that were added.

    +
    +
    def forwards(apps, schema_editor):
    +    Column = apps.get_model("seed", "Column")
    +    Organization = apps.get_model("orgs", "Organization")
    +
    +    new_db_fields = [
    +        {
    +            'column_name': 'geocoding_confidence',
    +            'table_name': 'PropertyState',
    +            'display_name': 'Geocoding Confidence',
    +            'column_description': 'Geocoding Confidence',
    +            'data_type': 'number',
    +        }, {
    +            'column_name': 'geocoding_confidence',
    +            'table_name': 'TaxLotState',
    +            'display_name': 'Geocoding Confidence',
    +            'column_description': 'Geocoding Confidence',
    +            'data_type': 'number',
    +        }
    +    ]
    +
    +    # Go through all the organizations
    +    for org in Organization.objects.all():
    +        for new_db_field in new_db_fields:
    +            columns = Column.objects.filter(
    +                organization_id=org.id,
    +                table_name=new_db_field['table_name'],
    +                column_name=new_db_field['column_name'],
    +                is_extra_data=False,
    +            )
    +
    +            if not columns.count():
    +                new_db_field['organization_id'] = org.id
    +                Column.objects.create(**new_db_field)
    +            elif columns.count() == 1:
    +                # If the column exists, then update the display_name and data_type if empty
    +                c = columns.first()
    +                if c.display_name is None or c.display_name == '':
    +                    c.display_name = new_db_field['display_name']
    +                if c.data_type is None or c.data_type == '' or c.data_type == 'None':
    +                    c.data_type = new_db_field['data_type']
    +                        for col in columns:
    +                # If the column exists, then update the column_description if empty
    +                if c.column_description is None or c.column_description == '':
    +                    c.column_description = new_db_field['column_description']
    +                c.save()
    +            else:
    +                print("  More than one column returned")
    +
    +
    +class Migration(migrations.Migration):
    +    dependencies = [
    +        ('seed', '0090_auto_20180425_1154'),
    +    ]
    +
    +    operations = [
    +        ... existing db migrations ...,
    +        migrations.RunPython(forwards),
    +    ]
    +
    +
    +
    +
  4. +
  5. Run migrations ./manage.py migrate

  6. +
  7. Run unit tests, fix failures. Below is a list of files that need to be fixed (this is not an exhaustive list)

  8. +
+
    +
  • test_mapping_data.py:test_keys

  • +
  • test_columns.py:test_column_retrieve_schema

  • +
  • test_columns.py:test_column_retrieve_db_fields

  • +
+
    +
  1. (Optional) Update example files to include new fields

  2. +
  3. Test import workflow with mapping to new fields

  4. +
+
+
+
+

NGINX Notes

+

Toggle maintenance mode to display a maintenance page and prevent access to all site resources including API endpoints:

+
docker exec seed_web ./docker/maintenance.sh on
+docker exec seed_web ./docker/maintenance.sh off
+
+
+
+
+

AngularJS Integration Notes

+
+

Template Tags

+

Angular and Django both use {{ and }} as variable delimiters, and thus the AngularJS variable delimiters are +renamed {$ and $}.

+
window.BE.apps.seed = angular.module('BE.seed', ['$interpolateProvider', ($interpolateProvider) => {
+  $interpolateProvider.startSymbol('{$');
+  $interpolateProvider.endSymbol('$}');
+}]);
+
+
+
+
+

Django CSRF Token and AJAX Requests

+

For ease of making angular $http requests, we automatically add the CSRF token to all $http requests as +recommended by http://django-angular.readthedocs.io/en/latest/integration.html#xmlhttprequest

+
window.BE.apps.seed.run(($http, $cookies) => {
+  $http.defaults.headers.common['X-CSRFToken'] = $cookies['csrftoken'];
+});
+
+
+
+
+

Routes and Partials or Views

+

Routes in static/seed/js/seed.js (the normal angularjs app.js)

+
SEED_app.config(['stateHelperProvider', '$urlRouterProvider', '$locationProvider', (stateHelperProvider, $urlRouterProvider, $locationProvider) => {
+  stateHelperProvider
+    .state({
+      name: 'home',
+      url: '/',
+      templateUrl: static_url + 'seed/partials/home.html'
+    })
+    .state({
+      name: 'profile',
+      url: '/profile',
+      templateUrl: static_url + 'seed/partials/profile.html',
+      controller: 'profile_controller',
+      resolve: {
+        auth_payload: ['auth_service', '$q', 'user_service', function (auth_service, $q, user_service) {
+          var organization_id = user_service.get_organization().id;
+          return auth_service.is_authorized(organization_id, ['requires_superuser']);
+        }],
+        user_profile_payload: ['user_service', function (user_service) {
+          return user_service.get_user_profile();
+        }]
+      }
+    });
+}]);
+
+
+

HTML partials in static/seed/partials/

+
+
+
+

Logging

+

Information about error logging can be found here - https://docs.djangoproject.com/en/1.7/topics/logging/

+

Below is a standard set of error messages from Django.

+

A logger is configured to have a log level. This log level describes the severity of +the messages that the logger will handle. Python defines the following log levels:

+
DEBUG: Low level system information for debugging purposes
+INFO: General system information
+WARNING: Information describing a minor problem that has occurred.
+ERROR: Information describing a major problem that has occurred.
+CRITICAL: Information describing a critical problem that has occurred.
+
+
+

Each message that is written to the logger is a Log Record. The log record is stored +in the web server & Celery

+
+
+

BEDES Compliance and Managing Columns

+

Columns that do not represent hardcoded fields in the application are represented using +a Django database model defined in the seed.models module. The goal of adding new columns +to the database is to create seed.models.Column records in the database for each column to +import. Currently, the list of Columns is dynamically populated by importing data.

+

There are default mappings for ESPM are located here:

+
+
+
+
+

Resetting the Database

+

This is a brief description of how to drop and re-create the database +for the seed application.

+

The first two commands below are commands distributed with the +Postgres database, and are not part of the SEED application. The third +command below will create the required database tables for SEED and +setup initial data that the application expects (e.g. initial columns for +BEDES). The last command below (spanning multiple lines) will create a +new superuser and organization that you can use to login to the +application, and from there create any other users or organizations +that you require.

+

Below are the commands for resetting the database and creating a new +user:

+
createuser -U seed seeduser
+
+psql -d postgres -U seeduser -c 'DROP DATABASE seed;'
+psql -d postgres -U seeduser -c 'CREATE DATABASE seed;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;'
+
+./manage.py migrate
+./manage.py create_default_user \
+    --username=demo@seed-platform.org \
+    --password=password \
+    --organization=testorg
+
+
+
+
+

Restoring a Database Dump

+
psql -d postgres -U seeduser -c 'DROP DATABASE seed;'
+psql -d postgres -U seeduser -c 'CREATE DATABASE seed;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;'
+psql -d seed -U seeduser -c 'SELECT timescaledb_pre_restore();'
+
+# restore a previous database dump (must be pg_restore 12+)
+pg_restore -d seed -U seeduser /backups/prod-backups/prod_20191203_000002.dump
+# if any errors appear during the pg_restore process check that the `installed_version` of the timescaledb extension where the database was dumped matches the extension version where it's being restored
+# `SELECT default_version, installed_version FROM pg_available_extensions WHERE name = 'timescaledb';`
+
+psql -d seed -U seeduser -c 'SELECT timescaledb_post_restore();'
+
+./manage.py migrate
+
+# if needed add a user to the database
+./manage.py create_default_user \
+    --username=demo@seed-platform.org \
+    --password=password \
+    --organization=testorg
+
+
+

If restoring a production backup to a different deployment update the site settings for password reset emails, and disable celerybeat Salesforce updates/emails:

+
./manage.py shell
+
+from django.contrib.sites.models import Site
+site = Site.objects.first()
+site.domain = 'dev1.seed-platform.org'
+site.name = 'SEED Dev1'
+site.save()
+
+from seed.models import Organization
+Organization.objects.filter(salesforce_enabled=True).update(salesforce_enabled=False)
+
+from django_celery_beat.models import PeriodicTask, PeriodicTasks
+PeriodicTask.objects.filter(enabled=True, name__startswith='salesforce_sync_org-').update(enabled=False)
+PeriodicTasks.update_changed()
+
+
+
+
+

Migrating the Database

+

Migrations are handles through Django; however, various versions have customs actions for the migrations. See the migrations page for more information based on the version of SEED.

+
+
+

Testing

+

JS tests can be run with Jasmine at the url /angular_js_tests/.

+

Python unit tests are run with

+
python manage.py test --settings=config.settings.test
+
+
+
+
Note on geocode-related testing:

Most of these tests use VCR.py and cassettes to capture and reuse recordings of HTTP requests and responses. Given that, unless you want to make changes and/or refresh the cassettes/recordings, there isn’t anything needed to run the geocode tests.

+

In the case that the geocoding logic/code is changed or you’d like to the verify the MapQuest API is still working as expected, you’ll need to run the tests with a small change. Namely, you’ll want to provide the tests with an API key via an environment variable called “TESTING_MAPQUEST_API_KEY” or within your local_untracked.py file with that same variable name.

+

In order to refresh the actual cassettes, you’ll just need to delete or move the old ones which can be found at “.seed/tests/data/vcr_cassettes”. The API key should be hidden within the cassettes, so these new cassettes can and should be pushed to GitHub.

+
+
+

Run coverage using

+
coverage run manage.py test --settings=config.settings.test
+coverage report --fail-under=83
+
+
+

Python compliance uses PEP8 with flake8

+
flake8
+# or
+tox -e flake8
+
+
+

JS Compliance uses ESLint

+
npm run lint
+npm run lint:fix
+
+
+
+
+

Building Documentation

+

Older versions of the source code documentation are (still) on readthedocs; however, newer versions are built and pushed to the seed-website repository manually. To build the documentation follow the script below:

+
cd docs
+rm -rf htmlout
+sphinx-build -b html source htmlout
+
+
+

For releasing, copy the htmlout directory into the seed-platform’s website repository under docs/code_documentation/<new_version>. Make sure to add the new documentation to the table in the docs/developer_resources.md.

+
+
+

Contribution Instructions / Best Practices

+

If this is the first time contributing and you are outside of the DOE National Lab system, then you will need to review and fill out the contribution agreement which is found in SEED’s Contribution Agreement in the GitHub repository

+

The desired workflow for development and submitting changes is the following:

+
    +
  1. Fork the repository on GitHub if you do not have access to the repository, otherwise, work within the https://github.com/seed-platform/seed repository.

  2. +
  3. Ensure there is a ticket/issue created for the work you are doing. Verify that the ticket is assigned to you and that it is part of the latest project board on the GitHub site (https://github.com/orgs/SEED-platform/projects).

  4. +
  5. Move the ticket/issue to ‘In Progress’ in the GitHub project tracker when you begin work

  6. +
  7. Create a branch off of develop (unless it is a hotfix, then branch of the appropriate tag). The recommended naming convention is <issue_id>-short-descriptive-name.

  8. +
  9. Make changes and write a test for the code added.

  10. +
  11. Make sure tests pass locally. Most branches created and pushed to GitHub will be tested automatically.

  12. +
  13. Upon completion of the work, create a pull request (PR) against the develop branch (or hotfix branch if applicable). In the PR description fill out the requested information and include the issue number (e.g., #1234).

  14. +
  15. +
    Assign one label to the PR (not the ticket/issue) in order to auto-populate change logs (e.g., Bug, Feature, Maintenance, Performance, DoNotPublish) This is required and CI will fail if not present.
      +
    • Bug (these will appear as “Bug Fixes” in the change log)

    • +
    • Feature (features will appear as “New Features” item in the change log)

    • +
    • Enhancement (these will appear as “Improvements” in the change log)

    • +
    • Maintenance (these will appear under “Maintenance” in the change log)

    • +
    • Performance (these will appear under “Maintenance” in the change log)

    • +
    • Documentation (these will appear under “Maintenance” in the change log)

    • +
    • Do not publish (these will no appear in the change log)

    • +
    +
    +
    +
  16. +
  17. Ensure all tests pass.

  18. +
  19. Assign a reviewer to the PR.

  20. +
  21. If the reviewer requests changes, then addresses changes and re-assign the reviewer as needed.

  22. +
  23. Once approved, merge the PR!

  24. +
  25. Move the related ticket(s)/issue(s) to the ‘Ready to Deploy’ column in the GitHub project tracker.

  26. +
+
+
+

Release Instructions

+

To make a release do the following:

+
    +
  1. Create a branch from develop to prepare the updates (e.g., 2.21.0-release-prep).

  2. +
  3. Update the root package.json file with the release version number, and then run npm install. Always use MAJOR.MINOR.RELEASE.

  4. +
  5. Update the docs/sources/migrations.rst file with any required actions.

  6. +
  7. Commit the changes and push the release prep branch to GitHub, then go to the Releases page to draft a new release which will generate the changelog.

  8. +
  9. Copy the GitHub changelog results into CHANGELOG.md. Cleanup the formatting and items as needed (make sure the spelling is correct, starts with a capital letter, if any PRs were missing the Do not publish label, etc.) and push the changelog update.

  10. +
  11. Make sure that any new UI needing localization has been tagged for translation, and that any new translation keys exist in the lokalise.com project. (see translation documentation).

  12. +
  13. Create PR for release preparation and merge after tests/reviews pass.

  14. +
  15. Create a new Release using the develop branch and new release number as the tag (https://github.com/SEED-platform/seed/releases). Include list of changes since previous release (e.g., the additions to CHANGELOG.md).

  16. +
  17. Locally, merge the develop branch into the main branch and push.

  18. +
  19. Verify that the Docker versions are built and pushed to Docker Hub (https://hub.docker.com/r/seedplatform/seed/tags/).

  20. +
  21. Publish the new documentation in the seed-platform website repository (see instructions above under Building Documentation).

  22. +
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/docker.html b/docs/code_documentation/2.22.0/docker.html new file mode 100644 index 00000000..0fcc06a2 --- /dev/null +++ b/docs/code_documentation/2.22.0/docker.html @@ -0,0 +1,246 @@ + + + + + + + Docker Deployment on AWS — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Docker Deployment on AWS

+

Amazon Web Services (AWS) provides the preferred hosting for the SEED Platform.

+

seed is a Django Project and Django’s documentation is an excellent place for general +understanding of this project’s layout.

+
+

Installation

+

Ubuntu server 18.04 or newer with a m5ad.xlarge (if using in Production instance)

+
    +
  • After launching the instance, run the following commands to install docker.

  • +
+
# Install any upgrades
+sudo apt-get update
+sudo apt-get upgrade -y
+
+# Remove any old docker engines
+sudo apt-get remove docker docker-engine docker.io containerd runc
+
+# Install docker community edition
+sudo apt-get update
+sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
+curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
+sudo add-apt-repository \
+    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
+    $(lsb_release -cs) \
+    stable"
+
+sudo apt-get update
+sudo apt-get install -y docker-ce docker-ce-cli containerd.io
+# Add your user to the docker group
+sudo groupadd docker
+sudo usermod -aG docker $USER
+newgrp docker
+
+
+
+

Note

+

It is okay if the first command fails

+
+
    +
  • Verify that the DNS is working correctly. Run the following and verify the response lists IPs (v6 most likely)

  • +
+
# verify that the dns resolves
+docker run --rm seedplatform/seed getent hosts seed-platform.org
+# or
+docker run --rm tutum/dnsutils nslookup email.us-west-2.amazonaws.com
+
+
+
    +
  • Install Docker compose

  • +
+
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
+sudo chmod +x /usr/local/bin/docker-compose
+
+
+
    +
  • Checkout SEED (or install from the releases).

  • +
+
git clone
+
+
+
    +
  • Add in the Server setting into profile.d. For example add the content below (appropriately filled out) into /etc/profile.d/seed.sh

  • +
+
export POSTGRES_USER=seed
+export POSTGRES_DB=seed
+export POSTGRES_PASSWORD=GDEus3fasd1askj89QkAldjfX
+export POSTGRES_PORT=5432
+export SECRET_KEY="96=7jg%_&1-z9c9qwwu2@w$hb3r322yf3lz@*ekw-1@ly-%+^"
+
+# The admin user is only valid only until the database is restored
+export SEED_ADMIN_USER=user@seed-platform.org
+export SEED_ADMIN_PASSWORD="7FeBWal38*&k3jlfa92lakj8ih4"
+export SEED_ADMIN_ORG=default
+
+# For SES
+export AWS_ACCESS_KEY_ID=<AWS_ACCESS_KEY>
+export AWS_SECRET_ACCESS_KEY=<AWS_SECRET_KEY>
+export AWS_SES_REGION_NAME=us-west-2
+export AWS_SES_REGION_ENDPOINT=email.us-west-2.amazonaws.com
+export SERVER_EMAIL=user@seed-platform.org
+
+
+
    +
  • Before launching the first time, make sure the persistent volumes and the backup directory exist.

  • +
+
docker volume create --name=seed_pgdata
+docker volume create --name=seed_media
+
+mkdir -p $HOME/seed-backups
+
+
+
+

Note

+

Make sure to have the seed-backups in your path, otherwise the db-postgres container will not launch.

+
+
    +
  • Launch the project

  • +
+
cd <checkout dir>
+./deploy.sh
+
+
+
+
+

Deploying with Docker

+

The preferred way to deploy with Docker is using docker swarm and docker stack. +Look at the deploy.sh script for implementation details.

+

The short version is to simply run the command below. Note that the passing of the docker-compose.yml filename is not required if using docker-compose.local.yml.

+

`bash +./deploy.sh docker-compose.local.yml +`

+

If deploying using a custom docker-compose yml file, then simple replace the name in the command above.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/faq.html b/docs/code_documentation/2.22.0/faq.html new file mode 100644 index 00000000..969891aa --- /dev/null +++ b/docs/code_documentation/2.22.0/faq.html @@ -0,0 +1,190 @@ + + + + + + + Frequently Asked Questions — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Frequently Asked Questions

+

Here are some frequently asked questions and/or issues.

+ +
+

Questions

+
+

What is the SEED Platform?

+

The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity.

+

The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL.

+

The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions.

+

Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy.

+
+
+
+

Issues

+
+

Why is the domain set to example.com?

+

If you see example.com in the emails that are sent from your hosted version of SEED then you will +need to update your django sites object in the database.

+
$ ./manage.py shell
+
+from django.contrib.sites.models import Site
+one = Site.objects.all()[0]
+one.domain = 'newdomain.org'
+one.name = 'SEED'
+one.save()
+
+
+
+
+

Why aren’t the static assets being served correctly?

+

Make sure that your local_untracked.py file does not have STATICFILES_STORAGE set to anything. If so, +then comment out that section and redeploy/recollect/compress your static assets.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/genindex.html b/docs/code_documentation/2.22.0/genindex.html new file mode 100644 index 00000000..f716be4c --- /dev/null +++ b/docs/code_documentation/2.22.0/genindex.html @@ -0,0 +1,2753 @@ + + + + + + Index — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | J + | K + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | U + | V + | W + | X + | Y + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

J

+ + + +
+ +

K

+ + + +
+ +

L

+ + + +
+ +

M

+ + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

Q

+ + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + + +
+ +

X

+ + +
+ +

Y

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/getting_started.html b/docs/code_documentation/2.22.0/getting_started.html new file mode 100644 index 00000000..c41e7606 --- /dev/null +++ b/docs/code_documentation/2.22.0/getting_started.html @@ -0,0 +1,160 @@ + + + + + + + Getting Started — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/help.html b/docs/code_documentation/2.22.0/help.html new file mode 100644 index 00000000..6e8bd8c2 --- /dev/null +++ b/docs/code_documentation/2.22.0/help.html @@ -0,0 +1,141 @@ + + + + + + + Help — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Help

+
+

For SEED Platform Users

+

Please visit our website for information, tutorials, and documentation to help you learn how to use SEED.

+

https://seed-platform.org

+

The SEED Users Forum is where you can review user announcements, workflow questions, and join to connect with other users.

+

https://lists.buildingenergytools.org/g/SEEDusers/topics

+

For general inquiries or help on a specific problem, please fill out a request on the building data tools website help desk and select SEED as the relevant tool:

+

https://buildingdata.energy.gov/#/help-desk

+
+
+

For SEED Platform Developers

+

The open-source code is available on the GitHub organization SEED-Platform and contains various repositories for the different components of the platform such as the main SEED application, a Python SEED client to communicate to SEED’s API and various example datasets.

+

https://github.com/SEED-platform

+

The SEED Developers Forum contains various topics and joining enables you to connect with other developers. It is recommended to join this forum to submit developer questions, features requests, and report issues as needed. Also, submitting issues on GitHub is encouraged.

+

https://lists.buildingenergytools.org/g/SEEDdevelopers/topics

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/index.html b/docs/code_documentation/2.22.0/index.html new file mode 100644 index 00000000..dabf665b --- /dev/null +++ b/docs/code_documentation/2.22.0/index.html @@ -0,0 +1,244 @@ + + + + + + + Standard Energy Efficiency Data (SEED) Platform — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Standard Energy Efficiency Data (SEED) Platform

+

The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity.

+

The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL.

+

The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions.

+

Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy.

+
+ +
+
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/kubernetes_deployment.html b/docs/code_documentation/2.22.0/kubernetes_deployment.html new file mode 100644 index 00000000..c8e79caf --- /dev/null +++ b/docs/code_documentation/2.22.0/kubernetes_deployment.html @@ -0,0 +1,371 @@ + + + + + + + Kubernetes Deployment Guide with Helm — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Kubernetes Deployment Guide with Helm

+

Kubernetes is a robust container orchestration system for easy application deployment and management. Helm takes that a step further with by packaging up required helm “charts” into one deployment command.

+
+

Setup

+
+

Cluster

+

In order to deploy the SEED platform on a Kubernetes you will need “cluster” which will be configured by your cloud service of choice. Each installation will be slightly different depending on the service. +Below are links to quick-start guides for provisioning a cluster and connecting. These instructions are specifically for AWS, but after the Kubernetes cluster is launched, the helm commands can be used in +the same way.

+
    +
  • Amazon Web Services (AWS)

  • +
  • Google Cloud Platform (GCP)

  • +
  • Azure (AKS)

  • +
+
+

AWS CLI Configuration

+

Download and configure the AWS CLI with instructions: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html

+
aws configure
+AWS Access Key ID [None]: <insert key> (from account)
+AWS Secret Access Key [None]: <insert secret key> (from account)
+Default region name [None]: us-east-1
+Default output format [None]: json
+
+
+
+
+
+

Kubectl

+

Download and install Kubectl:

+
    +
  • Windows

  • +
  • +
    Mac (with Homebrew) brew install kubectl

    ` +brew install kubectl +`

    +
    +
    +
  • +
+

Kubectl is the main function in which you will be interfacing with your deployed application on your cluster. This CLI is what connects you to your cluster that you have just provisioned. +If your cloud service did not have you configure kubectl in your cluster setup, you can download it here. Once kubectl is installed and configured to your cluster +you can run some simple commands to ensure its working properly:

+
#View the cluster
+kubectl cluster-info
+
+#View pods, services and replicasets (will be empty until deploying an app)
+kubectl get all
+
+
+

All of the common kubectl commands can be found in these docs

+
+

Note

+

For those unfamiliar with CLIs, there are a number of GUI applications that are able to deploy on your stack with ease. One of which is Kubernetes native application called Dashboard UI or a third-party application called Octant brew install octant.

+
+
+
+

Helm

+

Helm organizes all of your Kubernetes deployment, service, and volume yml files into “charts” that can be deployed, managed, and published with simple commands. +To install Helm:

+ +
+
+

EKS Control (AWS Specific)

+

EKSCtl is a command line tool to manage Elastic Kubernetes clusters on AWS. If not using AWS, then disregard this section.

+ +

To launch a cluster on using EKSCts, run the following command in the terminal (assuming adequate permissions for the user). Also make sure to replace items in the <> brackets.

+
eksctl create cluster \
+--name <cluster-name> \
+--version 1.21 \
+--region us-east-1 \
+--node-type m5.large \
+--nodes 1 \
+--nodes-min 1 \
+--nodes-max 1 \
+--managed \
+--tags environment=<env-type, e.g., dev, prod>
+
+
+
+
+

Charts

+

SEED stores its charts in the charts directory of the Github Repo. There are two main charts that are deployed when starting SEED on Kubernetes.

+
    +
  • persistentvolumes - these are the volumes to store SEED media data and SEED Postgres data

  • +
  • seed - this stores all of the other deployment and service files for the application

  • +
+

Unlike persistentvolumes, the seed charts must be modified with user environment variables that will be forwarded to the docker container for deployment. +Before deployment, the user MUST set these variables to their desired values.

+

This chart contains the deployment specification for the SEED web container. Replace all the values in <>.

+
# Environment variables for the web container
+- env:
+    # AWS Email service variables to send emails to new users - can be removed if not using this functionality.
+    - name: AWS_ACCESS_KEY_ID
+      value: <access_key_id>
+    - name: AWS_SECRET_ACCESS_KEY
+      value: <secret_access_key>
+    - name: AWS_SES_REGION_NAME
+      value: us-west-2
+    - name: AWS_SES_REGION_ENDPOINT
+      value: email.us-west-2.amazonaws.com
+    - name: SERVER_EMAIL
+      value: info@seed-platform.org
+    # Django Variables
+    - name: DJANGO_SETTINGS_MODULE
+      value: config.settings.docker
+    - name: SECRET_KEY
+      value: <replace-secret-key>
+    - name: SEED_ADMIN_ORG
+      value: default
+    - name: SEED_ADMIN_PASSWORD
+      value: <super-secret-password>
+    - name: SEED_ADMIN_USER
+      value: <user@seed-platform.org>
+    # Postgres variables
+    - name: POSTGRES_DB
+      value: seed
+    - name: POSTGRES_PASSWORD
+      value: <super-secret-password> # must match db-postgres-deployment.yaml and web-celery-deployment.yaml
+    - name: POSTGRES_PORT
+      value: "5432"
+    - name: POSTGRES_USER
+      value: seeduser
+    # Bsyncr analysis variables
+    - name: BSYNCR_SERVER_PORT
+      value: "5000"
+    - name: BSYNCR_SERVER_HOST
+      value: bsyncr
+    # Sentry monitoring - remove if not applicable
+    - name: SENTRY_JS_DSN
+      value: <enter-dsn>
+    - name: SENTRY_RAVEN_DSN
+      value: <enter-dsn>
+    # Google self registration security - remove if not applicable
+    - name: GOOGLE_RECAPTCHA_SITE_KEY
+      value: <reCAPTCHA-site-key>
+    - name: GOOGLE_RECAPTCHA_SECRET_KEY
+      value: <reCAPTCHA-key>
+    image: seedplatform/seed:<insert deployment image version>
+    #versions can be found here https://github.com/SEED-platform/seed/releases/tag/v2.9.3
+
+
+

This chart contains the deployment specification for the Celery container to connect to Postgres. Replace the Postgres password to match web-deployment.

+
- name: POSTGRES_PASSWORD
+  value: <super-secret-password>  # must match db-postgres-deployment.yaml and web-celery-deployment.yaml
+
+
+

This chart contains the deployment specification for the bsyncr analysis server. Request a NOAA token from this website.

+
- name: NOAA_TOKEN
+  value: <token>
+
+
+
+
+
+

Deployment

+

Once you are connected to your cluster and have your settings configured with the environment variables of you choice in the charts, you are ready to deploy the app. +First, make sure that the correct context is selected which is needed if there is more than one cluster:

+
kubectl config get-contexts
+kubectl config use-context <context-name>
+
+
+

Deploy the site using the helm commands in the root of the charts directory.

+
    +
  • helm install --generate-name persistentvolumes

  • +
  • helm install --generate-name seed

  • +
+

You will be able to see SEED coming online with statuses like container creating, and running with:

+
    +
  • kubectl get all

  • +
+

Once all of the pods are running you will be able to hit the external ingress through the URL listed in the web service information. It should look something like

+
service/web           LoadBalancer   10.100.154.227   <my-unique-url>   80:32291/TCP
+
+
+
+
+

Managing Existing Clusters

+
+

Upgrade/Redeploy the Helm Stack

+

To upgrade or dedeploy a helm chart, first find the helm release that you want to upgrade, then run the upgrade with the selected chart.

+
helm list
+helm upgrade <cluster-name> ./seed
+
+
+
+
+

Managing the Kubernetes Cluster (AWS Specific)

+

Enable kubectl to talk to one of the created clusters by running the following command in the terminal after configuring the AWS credentials and cli.

+
aws eks --region <aws-region> update-kubeconfig --name <cluster-name>
+
+
+
+
+

Logging In

+

After a successful deployment in order to login you will need to create yourself as a user in the web container. To do this, we will exec into the container and run some Django commands. +* View all deployments and services, kubectl get all +* kubectl get pods +* kubectl exec -it <pod-id> -- bash

+

Now that we are in the container, we can make a user. +.. code-block:: bash

+
+

./manage.py create_default_user –username=admin@my.org –organization=seedorg –password=badpass

+
+

You can now use these credentials to log in to the SEED website.

+
+
+

Update web and web-celery

+

The command below will restart the pods and re-pull the docker images.

+
kubectl rollout restart deployment web && kubectl rollout restart deployment web-celery
+
+
+
+
+
+

Other Resources

+

Common kubectl actions can be found on the kubernetes website

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/license.html b/docs/code_documentation/2.22.0/license.html new file mode 100644 index 00000000..f56b2916 --- /dev/null +++ b/docs/code_documentation/2.22.0/license.html @@ -0,0 +1,187 @@ + + + + + + + License — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

License

+

SEED Platform™, Copyright (c) 2017, 2024 Alliance for Sustainable Energy, LLC, and other contributors. +All rights reserved.

+

Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met:

+

(1) Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer.

+

(2) Redistributions in binary form must reproduce the above copyright notice, this list of +conditions and the following disclaimer in the documentation and/or other materials provided +with the distribution.

+

(3) Neither the name of the copyright holder nor the names of its contributors may be used +to endorse or promote products derived from this software without specific prior written +permission.

+

(4) Other than as required in clauses (1) and (2), distributions in any form of modifications +or other derivative works may not use the “SEED Platform” trademark, “Standard Energy +Efficiency Data Platform”, “Standard Energy Efficiency Data”, “SEED”, or any other confusingly +similar designation without specific prior written permission from the U.S. Department of Energy.

+

(5) The name of the copyright holder(s), any contributors, the United States Government, the +United States Department of Energy, or any of their employees may not be used to endorse or +promote products derived from this software without specific prior written permission from the +respective party.

+

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS “AS IS” AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED STATES +DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE.

+

+

This program also includes the following licenses:

+

Copyright (c) 2014 - 2017 The Regents of the University of California, through +Lawrence Berkeley National Laboratory (subject to receipt of any required approvals +from the U.S. Department of Energy) and contributors. All rights reserved.

+
    +
  1. Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met:

    +
    +

    (1) Redistributions of source code must retain the copyright notice, this +list of conditions and the following disclaimer.

    +

    (2) Redistributions in binary form must reproduce the copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution.

    +

    (3) Neither the name of the University of California, Lawrence Berkeley +National Laboratory, U.S. Dept. of Energy nor the names of its +contributors may be used to endorse or promote products derived from this +software without specific prior written permission.

    +

    (4) Neither the names Standard Energy Efficiency Data Platform, Standard +Energy Efficiency Data, SEED Platform, SEED, derivatives thereof nor +designations containing these names, may be used to endorse or promote +products derived from this software without specific prior written +permission from the U.S. Dept. of Energy.

    +
    +
  2. +
  3. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  4. +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/linux.html b/docs/code_documentation/2.22.0/linux.html new file mode 100644 index 00000000..1af913e6 --- /dev/null +++ b/docs/code_documentation/2.22.0/linux.html @@ -0,0 +1,403 @@ + + + + + + + General Linux Setup — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

General Linux Setup

+

While Amazon Web Services (AWS) provides the preferred hosting for SEED, +running on a bare-bones Linux server follows a similar setup, replacing the +AWS services with their Linux package counterparts, namely: PostgreSQL and +Redis.

+

SEED is a Django project and Django’s documentation +is an excellent place to general understanding of this project’s layout.

+
+

Prerequisites

+

Ubuntu server/desktop 16.04 or newer (18.04 recommended)

+

Install the following base packages to run SEED:

+
sudo add-apt-repository ppa:timescale/timescaledb-ppa
+sudo apt update
+sudo apt upgrade
+sudo apt install libpq-dev python3-dev python3-pip libatlas-base-dev \
+gfortran build-essential nodejs npm libxml2-dev libxslt1-dev git \
+libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python mercurial
+sudo apt install gdal-bin postgis
+sudo apt install redis-server
+sudo apt install timescaledb-postgresql-10 postgresql-contrib
+
+# For running selenium/protractor
+sudo apt install default-jre
+
+
+
+

Note

+

postgresql >=9.3 is required to support JSON Type

+
+
+
+

Configure PostgreSQL

+

Replace ‘seeddb’, ‘seeduser’ with desired db/user. By +default use password seedpass when prompted

+
$ sudo timescaledb-tune
+$ sudo service postgresql restart
+$ sudo su - postgres
+$ createuser -P "seeduser"
+$ createdb "seeddb" --owner="seeduser"
+$ psql
+postgres=# GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO "seeduser";
+postgres=# ALTER USER "seeduser" CREATEDB CREATEROLE SUPERUSER;
+postgres=# \q
+$ exit
+
+
+
+
+

Python Dependencies

+

clone the seed repository from github

+
$ git clone git@github.com:SEED-platform/seed.git
+
+
+

enter the repo and install the python dependencies from requirements

+
$ cd seed
+$ pip3 install -r requirements/local.txt
+
+
+
+
+

JavaScript Dependencies

+
$ npm install
+
+
+
+
+

Django Database Configuration

+

Copy the local_untracked.py.dist file in the config/settings directory to +config/settings/local_untracked.py, and add a DATABASES configuration with your database username, password, +host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database instance +you have manually installed within your infrastructure.

+
# Database
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.contrib.gis.db.backends.postgis',
+        'NAME': 'seeddb',
+        'USER': 'seeduser',
+        'PASSWORD': '<PASSWORD>',
+        'HOST': 'localhost',
+        'PORT': '5432',
+    }
+}
+
+
+
+

Note

+

Other databases could be used such as MySQL, but are not supported +due to the postgres-specific JSON Type

+
+

In in the above database configuration, seed is the database name, this is arbitrary and any valid name can be +used as long as the database exists. Enter the database name, user, password you set above.

+

The database settings can be tested using the Django management command, python3 manage.py dbshell to connect to the +configured database.

+

create the database tables and migrations:

+
$ python3 manage.py migrate
+
+
+
+
+

Cache and Message Broker

+

The SEED project relies on redis for both cache and message brokering, and +is available as an AWS ElastiCache service or with the redis-server +Linux package. (sudo apt install redis-server)

+

local_untracked.py should be updated with the CACHES and CELERY_BROKER_URL +settings.

+
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+
+
+
+

Creating the initial user

+

create a superuser to access the system

+
$ python3 manage.py create_default_user --username=admin@my.org --organization=lbnl --password=badpass
+
+
+
+

Note

+

Of course, you need to save this user/password somewhere, since this is what +you will use to login to the SEED website.

+

Every user must be tied to an organization, visit /app/#/profile/admin +as the superuser to create parent organizations and add users to them.

+
+
+
+

Running celery the background task worker

+

Celery is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, celery +can be started:

+
DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler
+
+
+
+
+

Running the development web server

+

The Django dev server (not for production use) can be a quick and easy way to +get an instance up and running. The dev server runs by default on port 8000 +and can be run on any port. See Django’s runserver documentation for more +options.

+
$ python3 manage.py runserver --settings=config.settings.dev
+
+
+
+
+

Running a production web server

+

Our recommended web server is uwsgi sitting behind nginx. The python package uwsgi is needed for this, and +should install to /usr/local/bin/uwsgi We recommend using dj-static to load static files.

+
+

Note

+

The use of the dev settings file is production ready, and should be +used for non-AWS installs with DEBUG set to False for production use.

+
+
$ pip3 install uwsgi dj-static
+
+
+

Generate static files:

+
$ python3 manage.py collectstatic --settings=config.settings.prod -i package.json -i npm-shrinkwrap.json -i node_modules/openlayers-ext/index.html
+
+
+

Update config/settings/local_untracked.py:

+
DEBUG = False
+# static files
+STATIC_ROOT = 'collected_static'
+STATIC_URL = '/static/'
+
+
+

Start the web server (this also starts celery):

+
$ ./bin/start-seed
+
+
+
+

Warning

+

Note that uwsgi has port set to 80. In a production setting, a dedicated web server such as nginx would be +receiving requests on port 80 and passing requests to uwsgi running on a different port, e.g 8000.

+
+
+
+

Environment Variables

+

The following environment variables can be set within the ~/.bashrc file to +override default Django settings.

+
export SENTRY_DSN=https://xyz@app.getsentry.com/123
+export DEBUG=False
+export ONLY_HTTPS=True
+
+
+
+
+

Mail Services

+
+

AWS SES Service

+

In the AWS setup, we can use SES to provide an email service for Django. The service is +configured in the config/settings/local_untracked.py:

+
EMAIL_BACKEND = 'django_ses.SESBackend'
+
+
+

In general, the following steps are needed to configure SES:

+
    +
  1. Access Amazon SES Console - Quickstart

  2. +
  3. Login to Amazon SES Console. Verify which region we are using (e.g., us-east-1)

  4. +
  5. Decide on email address that will be sending the emails and add them to the SES Verified Emails.

  6. +
  7. Test that SES works as expected (while in the SES sandbox). Note that you will need to add the sender and recipient emails to the verified emails while in the sandbox.

  8. +
  9. Update the local_untracked.py file or set the environment variables for the docker file.

  10. +
  11. Once ready, move the SES instance out of the sandbox. Following instructions here

  12. +
  13. (Optional) Set up Amazon Simple Notification Service (Amazon SNS) to notify you of bounced emails and other issues.

  14. +
  15. (Optional) Use the AWS Management Console to set up Easy DKIM, which is a way to authenticate your emails. Amazon SES console will have the values for SPF and DKIM that you need to put into your DNS.

  16. +
+
+
+

SMTP service

+

Many options for setting up your own SMTP service/server or using other SMTP +third party services are available and compatible including gmail. SMTP is not configured for working within Docker at the moment.

+
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
+
+
+
+
+
+

local_untracked.py

+
# PostgreSQL DB config
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.postgresql_psycopg2',
+        'NAME': 'seed',
+        'USER': 'your-username',
+        'PASSWORD': 'your-password',
+        'HOST': 'your-host',
+        'PORT': 'your-port',
+    }
+}
+
+# config for local storage backend
+DOMAIN_URLCONFS = {'default': 'config.urls'}
+
+CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+# SMTP config
+EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
+
+# static files
+STATIC_ROOT = 'collected_static'
+STATIC_URL = '/static/'
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/mapping.html b/docs/code_documentation/2.22.0/mapping.html new file mode 100644 index 00000000..f2d35072 --- /dev/null +++ b/docs/code_documentation/2.22.0/mapping.html @@ -0,0 +1,166 @@ + + + + + + + Mapping — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Mapping

+

This document describes the set of calls that occur from the web client or API +down to the back-end for the process of mapping data into SEED.

+

An overview of the process is:

+
    +
  1. Import - A file is uploaded to the server

  2. +
  3. Save - The file is batched saved into the database as JSON data

  4. +
  5. Mapping - Mapping occurs on that file

  6. +
  7. Matching / Merging

  8. +
  9. Pairing

  10. +
+
+

Import

+

From the web UI, the import process invokes seed.views.main.save_raw_data to save the data. When the data is +done uploading, we need to know whether it is a Portfolio Manager file, so we can add metadata to the record in the +database. The end of the upload happens in seed.data_importer.views.DataImportBackend.upload_complete. At this +point, the request object has additional attributes for Portfolio Manager files. These are saved in the model +seed.data_importer.models.ImportFile.

+
+
+

Mapping

+

Once files are uploaded, file header columns need to be mapped to SEED columns. Mappings can be specified/decided manually for any particular file import, +or mapping profiles can be created and subsequently applied to any file imports.

+

When a column mapping profile is applied to an import file, file header columns defined in the profile must match exactly (spaces, lowercase, uppercase, etc.) +in order for the corresponding SEED column information to be used/mapped.

+
+
+

Matching

+
+

Todo

+

document

+
+
+
+

Pairing

+
+

Todo

+

document

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/matching.html b/docs/code_documentation/2.22.0/matching.html new file mode 100644 index 00000000..d5d06afe --- /dev/null +++ b/docs/code_documentation/2.22.0/matching.html @@ -0,0 +1,243 @@ + + + + + + + Matching — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Matching

+
+

What is it?

+

Within SEED, matching refers to a possible relationship between at least 2 properties or at least 2 tax lots. +Two properties match if they have the same values for some specified field(s). +These specified fields are referred to as matching criteria, and each SEED organization has its +own set of matching criteria which is customizable by users.

+
+
+

Why does it exist?

+

At a high level, matching is used to identify if two or more property records are actually different +representations of the same property (or tax lots representing one tax lot). For example, within the same cycle, +two matching records, so one persists while the other is used and subsequently discarded to update the persisting record +(say if the building owner’s phone number changed). Or across different cycles, it’s possible that the +two records capture the same property at different times/cycles - this relationship is referred to as a link.

+
+
+

How and when is it used?

+
+

In-Cycle Merging

+

(This is different from manual merging.)

+

For records within the same cycle, there really shouldn’t be more than one +representation of the same property (or tax lot). As much as possible, the program +is set up to prevent this from happening by automatically merging matched +records together whenever they might occur in the same cycle.

+

Specifically, a merge of matches might need to occur after any of the following events:

+
    +
  1. The record has been manually edited.

  2. +
  3. The record was just created as a result of a manual merge (via the ‘Actions’ on the Properties or Tax Lots page).

  4. +
  5. The record has just been imported.

  6. +
+

The actual execution of merges includes a few additional, unrelated steps but, +in the scope of merging, the following occurs.

+

The record in the scenarios listed above is the “target” record. Any and all +matches found, excluding the “target”, are merged together first. If there are +overlapping values, priority is given to more recently updated records.

+

Once these matches (excluding the target) are merged together, the final step is +to merge the “target” record. In all but one case, choosing between overlapping +values gives priority to the “target”. That one case is when a record has just been +imported. Here, overlapping values follow merge protection rules set by +the user for an organization in this final step.

+
+
+

Linking (Across Cycles)

+

For records in different cycles, matches between these are considered links. +Links are used to connect snapshots of the same record year-over-year (at different time periods). +This allows for the analysis of how the record has changed over time.

+

In the case of properties, these links are used to associate meters to properties. +This means that adding meters to a property in one cycle will make those meters +accessible to that same property’s instance in all other cycles.

+

This association can be viewed in aggregate; all of the records within some selected cycles are +grouped and displayed with their links. Alternatively, this association can be viewed for particular linked +group; the linked records of this group are displayed by themselves.

+
+
+

Putting them Together, Match-Merge-Linking

+

As mentioned earlier, there is a rule or assumption that at most one representation of +the same record can exist in any given cycle.

+

This avoids unresolvable situations that would prevent year-over-year analysis. +In the most simple case, a record in Cycle A matches two records in Cycle B. +SEED wouldn’t know which of the two records in Cycle B should be +the “snapshot” for this time period.

+

For this reason, in-cycle match merging always occurs before cross-cycle match linking. +So when searches for links do happen, ambiguous cases have already been resolved.

+

For an individual record, these are the following cases in which a +match-merge-link is automatically run: +1. Explicit triggering (from the Property/TaxLot Detail page) +2. After editing (in the Property/TaxLot Detail page) +3. After manual merging (in the Properties/Tax Lots list page). Explicitly +specified merges happen as chosen by the user. Then, if the resulting record has +matches, merges and/or linking happens. +4. When importing a record. If the incoming record has matches, +merges and/or linking happens.

+

For a whole organization, a match-merge-link round for all records in that +organization is run in the following cases: +1. During the original deployment of this feature - This happens in order to +initially normalize the existing data and establish all initial links. +2. Whenever a user changes matching criteria - This happens in order to +re-normalize existing data and reestablish links. As of this writing, before +committing matching criteria changes, a user can view a preview of how their +records will be affected as these are difficult to reverse.

+
+
+

Note on In-Cycle Not-merged Matches

+

Even though the application tries it’s best to have only one representative record per property +(or tax lot) per Cycle, it’s possible for there to exist matches that were not merged. +This can happen if a user manually unmerges a record after a (manual or automatic) merge occurs. +If this happens, and there exists two records that match each other but are not merged, +both records are completely unlinked. Without user intervention such as editing +one of the matching criteria values, these will be merged and linked as described +above next time the system finds them during a match search.

+
+
+
+

Match Searching in Depth

+

Though they accomplish the same goal, the process for merging is very different between the last case, importing, +and the first 2 cases, manual edit or manual merge.

+

In the case of manual merging or editing, this process accounts for the fact that these are records that already exist. +Specifically, they may have associations such as labels, notes, pairings, and for properties, meters. +So during a subsequent match search leading to a merge of two or more records, all of these “old” associations are +carried over to the final record once merges are complete.

+

In the case of importing, considerations must be taken for the fact that, in most cases, multiple records +are being imported together. Also, since this is the entry point for records, it’s possible that a user might +accidentally try to import the same record snapshot twice - where all the record values are the same as another +existing record (as opposed to just having the same values for matching criteria fields). So on import, the process is as follows:

+
    +
  1. Amongst only the incoming records, duplicates (of other incoming or existing) are flagged and ignored.

  2. +
  3. Amongst only the incoming records, matching records are merged together.

  4. +
  5. Amongst all records in the same Cycle, incoming records that match an existing record gets merged with priority to that existing record. If the incoming record has multiple existing matches, the existing matches are merged together in latest updated order first while also combining any other associations (labels, notes, etc.) just as in the manual merge or edit cases. Since the incoming record is new, it doesn’t have any of the other associations.

  6. +
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/migrations.html b/docs/code_documentation/2.22.0/migrations.html new file mode 100644 index 00000000..7c5e6bad --- /dev/null +++ b/docs/code_documentation/2.22.0/migrations.html @@ -0,0 +1,510 @@ + + + + + + + Migrations — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Migrations

+

Django handles the migration of the database very well; however, there are various changes to SEED that may require some custom (manual) migrations. The migration documentation includes the required changes based on deployment and development for each release.

+
+

Version Develop

+

In order to support Redis passwords, the configuration of the Redis/Celery settings changed a bit. +You will need to add the following to your local_untracked.py configuration file. If you are using +Docker then you will not need to do this.

+
CELERY_RESULT_BACKEND = CELERY_BROKER_URL
+
+
+

If you are using a password, then in your local_untracked.py configuration, add the password to +the CELERY_BROKER_URL. Your final configuration should look like the following in your +local_untracked.py file

+
CELERY_BROKER_URL = 'redis://:password@127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+CELERY_RESULT_BACKEND = CELERY_BROKER_URL
+CELERY_TASK_DEFAULT_QUEUE = 'seed-local'
+CELERY_TASK_QUEUES = (
+    Queue(
+        CELERY_TASK_DEFAULT_QUEUE,
+        Exchange(CELERY_TASK_DEFAULT_QUEUE),
+        routing_key=CELERY_TASK_DEFAULT_QUEUE
+    ),
+)
+
+
+
+
+

Version 2.22.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.21.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.20.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.20.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
  • There is a single long running migration related to importing census tract disadvantaged community data. This migration should take around 7 minutes to complete.

  • +
+
+
+

Version 2.19.0

+
    +
  • Run ./manage.py migrate.

  • +
  • +
    There is a new migration in this release that requires column names to be unique across organization, table_name, and is_extra_data. This migration will fail if there are duplicate column names. If you have duplicate column names, you will need to manually fix them in your database before running the migration. The following steps will help you identify and fix the duplicate column names:
      +
    • Check the organization age to gauge the impact of the change. If it is a deprecated org, impact of the change will be low. Often this issue arose in older organizations when units were not part of the columns. The old mapping columns were not upserts with the units, so typically the columns impacted are the ones with units.

    • +
    • Query the seed_column table for the organization and column name displayed on the screen (e.g., organization_id = 300 and column_name = ‘Source EUI (kBtu/ft2)’). If there is no table_name set, it is likely an import file column name and can easily be cleaned up without causing issues. In such cases, there will be two rows, and you want to keep the one with the units_pint column set.

    • +
    • More complex columns may require deleting or updating the column_id in the seed_columnmapping_* tables. If there is a foreign key constraint with seed_columnmapping_*, take note of the ID you want to remove and the ID you want it to be replaced with (preferably keep the one with units_pint).

    • +
    • +
      If the constraint is on seed_columnmapping_column_raw:
        +
      • The field should be an import file column (i.e., no table_name item). Query for the old column in seed_columnmapping_column_raw (e.g., column_name = <old_id>).

      • +
      • Replace the old ID with the new one. If it errors because it already exists, then the row can be deleted.

      • +
      • Return to the seed_column table and remove the old ID.

      • +
      +
      +
      +
    • +
    • +
      If the constraint is on seed_columnmapping_column_mapped:
        +
      • The mapped column should have a table_name in the field. If not, it is likely an older organization.

      • +
      • If there is no table_name, remove the row from the seed_columnmapping_column_mapped table.

      • +
      • Return to the seed_column table and remove the old ID.

      • +
      +
      +
      +
    • +
    +
    +
    +
  • +
+
+
+

Version 2.18.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.18.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.4

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.3

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.2

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.16.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.15.2

+
    +
  • There are no migrations needed for this version.

  • +
+
+
+

Version 2.15.1

+
    +
  • There are no migrations needed for this version.

  • +
+
+
+

Version 2.15.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.14.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.13.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.12.0 - 2.12.4

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.11.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.10.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.7.3 to 2.9.0

+
    +
  • The migrations should work without additional support. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.7.2

+
    +
  • The migrations should work without additional support. Simply run ./manage.py migrate. There are no manual migrations needed.

  • +
  • Note the Important Note in Version 2.7.1 migration below which may require the need to run a “fake” migration

  • +
+
+
+

Version 2.7.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+

Important Note:

+

If upgrading from < 2.7.0 to >= 2.7.1 you may encounter a failed migration with 0118_match_merge_link_all_orgs. This is expected if the database is several versions behind, and it effectively reorders migration 118 to run after all other migrations have completed to prepare your database to recognize properties and taxlots across multiple cycles. Run the following code manually to fully migrate:

+
    +
  1. ./manage.py migrate --fake seed 0118_match_merge_link_all_orgs

  2. +
  3. ./manage.py migrate

  4. +
  5. ./manage.py shell

    +
    +
    from seed.lib.superperms.orgs.models import Organization
    +from seed.utils.match import whole_org_match_merge_link
    +
    +for org in Organization.objects.all():
    +    whole_org_match_merge_link(org.id, 'PropertyState')
    +    whole_org_match_merge_link(org.id, 'TaxLotState')
    +
    +
    +
    +
  6. +
+
+
+

Version 2.7.0

+
    +
  • This migration will run a match/merge/pair/link method upon migration. Make sure to run the migration manually and not inside of the docker container using the ./deploy.sh script.

  • +
  • Make sure to backup the database before performing the migration.

  • +
  • Run ./manage.py migrate.

  • +
+
+
+

Version 2.6.1

+
    +
  • The migrations should work without additional support. Simply run ./manage.py migrate. There are no manual migrations needed for the 2.6.1 release.

  • +
+
+
+

Version 2.6.0

+

Version 2.6.0 includes support for meters and time series data storage. In order to use this release +you must first install TimescaleDB.

+
+

Docker-based Deployment

+

Docker-based deployments shouldn’t require running any additional commands for installation. The +timescaledb installation will happen automatically when updating the postgres container. Also, +the installation of the extension occurs in a Django migration.

+
+
+

Ubuntu

+
sudo add-apt-repository ppa:timescale/timescaledb-ppa
+sudo apt update
+sudo apt install timescaledb-postgresql-10
+sudo timescaledb-tune
+sudo service postgresql restart
+
+
+
+
+

Max OSX

+
brew tap timescale/tap
+brew install timescaledb
+/usr/local/bin/timescaledb_move.sh
+timescaledb-tune
+brew services restart postgresql
+
+
+
+
+
+

Version 2.5.2

+
    +
  • There are no manual migrations that are needed. The ./manage.py migrate command may take awhile to run since the migration requires the recalculation of all the normalized addresses to parse bldg correct and to cast the result as a string and not a bytestring.

  • +
+
+
+

Version 2.5.1

+
    +
  • The migrations should work by simply running ./manage.py migrate. There are no manual migrations needed for the 2.5.1 release.

  • +
+
+
+

Version 2.5.0

+
+

Docker-based Deployment

+
    +
  • Add the MapQuest API key to your organization.

  • +
  • On deployment, the error below is indicative that you need to install the extensions in the postgres database. Run docker exec <postgres_container_id> update-postgis.sh.

    +
    +

    django.db.utils.OperationalError: could not open extension control file “/usr/share/postgresql/11/extension/postgis.control”: No such file or directory

    +
    +
  • +
  • If you are using a copied version of the docker-compose.yml file, then you need to change 127.0.0.1:5000/postgres to 127.0.0.1:5000/postgres-seed

  • +
+
+
+

Development

+
    +
  • Delete your bower directory rm -rf seed/static/vendors.

  • +
  • Delete your css directory rm -rf seed/static/seed/css.

  • +
  • Remove these lines from local_untracked.py if you have them.

  • +
+
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
+STATICFILES_STORAGE = DEFAULT_FILE_STORAGE
+
+
+
    +
  • Run pip3 install -r requirements/local.txt.

  • +
  • Run npm install from root checkout of SEED.

  • +
  • If testing geocoding, then sign up for as a MapQuest Developer and create a new MapQuest Key.

  • +
  • Add the key to the organization that you are using in development.

  • +
  • Update your DATABASES engine to be django.contrib.gis.db.backends.postgis

  • +
+
DATABASES = {
+    'default': {
+        'ENGINE': 'django.contrib.gis.db.backends.postgis',
+        'NAME': 'seeddb',
+        'USER': 'seeduser',
+        'PASSWORD': 'seedpass',
+        'HOST': 'localhost',
+        'PORT': '5432',
+    }
+}
+
+
+
    +
  • Run ./manage.py migrate

  • +
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules.html b/docs/code_documentation/2.22.0/modules.html new file mode 100644 index 00000000..d3acfe53 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules.html @@ -0,0 +1,515 @@ + + + + + + + Modules — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Modules

+
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/config.html b/docs/code_documentation/2.22.0/modules/config.html new file mode 100644 index 00000000..b8229a95 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/config.html @@ -0,0 +1,217 @@ + + + + + + + Configuration — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Configuration

+
+

Submodules

+
+
+

Template Context

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+config.template_context.sentry_js(request)
+
+ +
+
+config.template_context.session_key(request)
+
+ +
+
+

Tests

+
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+config.utils.de_camel_case(name)
+
+ +
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+config.views.robots_txt(request, allow=False)
+
+ +
+
+

WSGI

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+

:description WSGI config for config project.

+

This module contains the WSGI application used by Django’s development server +and any production WSGI deployments. It should expose a module-level variable +named application. Django’s runserver and runfcgi commands discover +this application via the WSGI_APPLICATION setting.

+

Usually you will have the standard Django WSGI application here, but it also +might make sense to replace the whole Django WSGI application with a custom one +that later delegates to the Django one. For example, you could introduce WSGI +middleware here, or combine a Django application with an application of another +framework.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.cleansing.html b/docs/code_documentation/2.22.0/modules/seed.cleansing.html new file mode 100644 index 00000000..f00a9122 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.cleansing.html @@ -0,0 +1,915 @@ + + + + + + + Data Quality Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Data Quality Package

+
+

Inheritance

+
+
+

Submodules

+
+
+

Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+exception seed.models.data_quality.ComparisonError
+

Bases: Exception

+
+ +
+
+class seed.models.data_quality.DataQualityCheck(*args, **kwargs)
+

Bases: Model

+

Object that stores the high level configuration per organization of the DataQualityCheck

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+REQUIRED_FIELDS = {'PropertyState': ['address_line_1', 'custom_id_1', 'pm_property_id'], 'TaxLotState': ['address_line_1', 'custom_id_1', 'jurisdiction_tax_lot_id']}
+
+ +
+
+add_invalid_geometry_entry_provided(row_id, rule, display_name, value)
+
+ +
+
+add_result_comparison_error(row_id, rule, display_name, value, rule_check)
+
+ +
+
+add_result_dimension_error(row_id, rule, display_name, value)
+
+ +
+
+add_result_is_null(row_id, rule, display_name, value)
+
+ +
+
+add_result_max_error(row_id, rule, display_name, value, rule_max)
+
+ +
+
+add_result_min_error(row_id, rule, display_name, value, rule_min)
+
+ +
+
+add_result_missing_and_none(row_id, rule, display_name, value)
+
+ +
+
+add_result_missing_req(row_id, rule, display_name, value)
+
+ +
+
+add_result_string_error(row_id, rule, display_name, value)
+
+ +
+
+add_result_type_error(row_id, rule, display_name, value)
+
+ +
+
+add_rule(rule)
+

Add a new rule to the Data Quality Checks

+
+
Parameters:
+

rule – dict to be added as a new rule

+
+
Returns:
+

None

+
+
+
+ +
+
+add_rule_if_new(rule)
+

Add a new rule to the Data Quality Checks only if rule does not exist

+
+
Parameters:
+

rule – dict to be added as a new rule

+
+
Returns:
+

None

+
+
+
+ +
+
+static cache_key(identifier, organization_id)
+

Static method to return the location of the data_quality results from redis.

+
+
Parameters:
+

identifier – Import file primary key

+
+
Returns:
+

+
+
+
+ +
+
+check_data(record_type, rows)
+

Send in data as a queryset from the Property/Taxlot ids.

+
+
Parameters:
+
    +
  • record_type – one of PropertyState | TaxLotState

  • +
  • rows – rows of data to be checked for data quality

  • +
+
+
Returns:
+

None

+
+
+
+ +
+
+get_fieldnames(record_type)
+

Get fieldnames to apply to results.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+static initialize_cache(identifier, organization_id)
+

Initialize the cache for storing the results. This is called before the +celery tasks are chunked up.

+

The cache_key is different than the identifier. The cache_key is where all the results are +to be stored for the data quality checks, the identifier, is the random number (or specified +value that is used to identifier both the progress and the data storage

+
+
Parameters:
+

identifier – Identifier for cache, if None, then creates a random one

+
+
Returns:
+

list, [cache_key and the identifier]

+
+
+
+ +
+
+initialize_rules()
+

Initialize the default rules for a DataQualityCheck object

+
+
Returns:
+

None

+
+
+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+remove_all_rules()
+

Removes all the rules associated with this DataQualityCheck instance.

+
+
Returns:
+

None

+
+
+
+ +
+
+remove_status_label(label_class, rule, linked_id)
+

Remove label because it did not match any of the range exceptions

+
+
Parameters:
+
    +
  • label_class – statuslabel object, either property label or taxlot label

  • +
  • rule – rule object

  • +
  • linked_id – id of propertystate or taxlotstate object

  • +
+
+
Returns:
+

boolean, if labeled was applied

+
+
+
+ +
+
+reset_all_rules()
+

Delete all rules and reinitialize the default set of rules

+
+
Returns:
+

None

+
+
+
+ +
+
+reset_default_rules()
+

Reset only the default rules

+
+
Returns:
+

+
+
+
+ +
+
+reset_results()
+
+ +
+
+classmethod retrieve(organization_id)
+

DataQualityCheck was previously a simple object but has been migrated to a django model. +This method ensures that the data quality model will be backwards compatible.

+

This is the preferred method to initialize a new object.

+
+
Parameters:
+

organization – instance of Organization

+
+
Returns:
+

obj, DataQualityCheck

+
+
+
+ +
+
+retrieve_result_by_address(address)
+

Retrieve the results of the data quality checks for a specific address.

+
+
Parameters:
+

address – string, address to find the result for

+
+
Returns:
+

dict, results of data quality check for specific building

+
+
+
+ +
+
+retrieve_result_by_tax_lot_id(tax_lot_id)
+

Retrieve the results of the data quality checks by the jurisdiction ID.

+
+
Parameters:
+

tax_lot_id – string, jurisdiction tax lot id

+
+
Returns:
+

dict, results of data quality check for specific building

+
+
+
+ +
+
+rules
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+save_to_cache(identifier, organization_id)
+

Save the results to the cache database. The data in the cache are +stored as a list of dictionaries. The data in this class are stored as +a dict of dict. This is important to remember because the data from the +cache cannot be simply loaded into the above structure.

+
+
Parameters:
+

identifier – Import file primary key

+
+
Returns:
+

None

+
+
+
+ +
+
+update_status_label(label_class, rule, linked_id, row_id, add_to_results=True)
+
+
Parameters:
+
    +
  • label_class – statuslabel object, either propertyview label or taxlotview label

  • +
  • rule – rule object

  • +
  • linked_id – id of propertyview or taxlotview object

  • +
  • row_id

  • +
  • add_to_results – bool

  • +
+
+
Returns:
+

boolean, if labeled was applied

+
+
+
+ +
+ +
+
+exception seed.models.data_quality.DataQualityTypeCastError
+

Bases: Exception

+
+ +
+
+class seed.models.data_quality.Rule(*args, **kwargs)
+

Bases: Model

+

Rules for DataQualityCheck

+
+
+DATA_TYPES = [(0, 'number'), (1, 'string'), (2, 'date'), (3, 'year'), (4, 'area'), (5, 'eui')]
+
+ +
+
+DEFAULT_RULES = [{'condition': 'not_null', 'data_type': 1, 'field': 'address_line_1', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'not_null', 'data_type': 1, 'field': 'pm_property_id', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'not_null', 'field': 'custom_id_1', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'not_null', 'field': 'jurisdiction_tax_lot_id', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'TaxLotState'}, {'condition': 'not_null', 'data_type': 1, 'field': 'address_line_1', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'TaxLotState'}, {'condition': 'range', 'data_type': 4, 'field': 'conditioned_floor_area', 'max': 7000000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 4, 'field': 'conditioned_floor_area', 'min': 100, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 0, 'field': 'energy_score', 'max': 100, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 0, 'field': 'energy_score', 'min': 10, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 2, 'field': 'generation_date', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 0, 'field': 'gross_floor_area', 'max': 7000000, 'min': 100, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 0, 'field': 'occupied_floor_area', 'max': 7000000, 'min': 100, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 2, 'field': 'recent_sale_date', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 2, 'field': 'release_date', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 5, 'field': 'site_eui', 'max': 1000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'site_eui', 'min': 10, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'site_eui_weather_normalized', 'max': 1000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'source_eui', 'max': 1000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'source_eui', 'min': 10, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'source_eui_weather_normalized', 'max': 1000, 'min': 10, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 3, 'field': 'year_built', 'max': '2024', 'min': 1700, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 2, 'field': 'year_ending', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}]
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+RULE_EXCLUDE = 'exclude'
+
+ +
+
+RULE_INCLUDE = 'include'
+
+ +
+
+RULE_NOT_NULL = 'not_null'
+
+ +
+
+RULE_RANGE = 'range'
+
+ +
+
+RULE_REQUIRED = 'required'
+
+ +
+
+RULE_TYPE = [(0, 'default'), (1, 'custom')]
+
+ +
+
+RULE_TYPE_CUSTOM = 1
+
+ +
+
+RULE_TYPE_DEFAULT = 0
+
+ +
+
+SEVERITY = [(0, 'error'), (1, 'warning'), (2, 'valid')]
+
+ +
+
+SEVERITY_ERROR = 0
+
+ +
+
+SEVERITY_VALID = 2
+
+ +
+
+SEVERITY_WARNING = 1
+
+ +
+
+TYPE_AREA = 4
+
+ +
+
+TYPE_DATE = 2
+
+ +
+
+TYPE_EUI = 5
+
+ +
+
+TYPE_NUMBER = 0
+
+ +
+
+TYPE_STRING = 1
+
+ +
+
+TYPE_YEAR = 3
+
+ +
+
+condition
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_quality_check
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+data_quality_check_id
+
+ +
+
+data_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+enabled
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+field
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+for_derived_column
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+format_strings(value)
+
+ +
+
+get_data_type_display(*, field=<django.db.models.fields.IntegerField: data_type>)
+
+ +
+
+get_rule_type_display(*, field=<django.db.models.fields.IntegerField: rule_type>)
+
+ +
+
+get_severity_display(*, field=<django.db.models.fields.IntegerField: severity>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+max
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+maximum_valid(value)
+

Validate that the value is not greater than the maximum specified by the rule.

+
+
Parameters:
+

value – Value to validate rule against

+
+
Returns:
+

bool, True is valid, False if the value is out of range

+
+
+
+ +
+
+min
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+minimum_valid(value)
+

Validate that the value is not less than the minimum specified by the rule.

+
+
Parameters:
+

value – Value to validate rule against

+
+
Returns:
+

bool, True is valid, False if the value is out of range

+
+
+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+not_null
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+required
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+rule_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+severity
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+status_label
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+status_label_id
+
+ +
+
+str_to_data_type(value)
+

If the check is coming from a field in the database then it will be typed correctly; +however, for extra_data, the values are typically strings or unicode. Therefore, the +values are typed before they are checked using the rule’s data type definition.

+
+
Parameters:
+

value – variant, value to type

+
+
Returns:
+

typed value

+
+
+
+ +
+
+table_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+text_match
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+units
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+valid_text(value)
+

Validate the rule matches the specified text. Text is matched by regex.

+
+
Parameters:
+

value – Value to validate rule against

+
+
Returns:
+

bool, True is valid, False if the value does not match

+
+
+
+ +
+ +
+
+exception seed.models.data_quality.UnitMismatchError
+

Bases: Exception

+
+ +
+
+seed.models.data_quality.format_pint_violation(rule, source_value)
+

Format a pint min, max violation for human readability.

+

:param rule +:param source_value : Quantity - value to format into range +:return (formatted_value, formatted_min, formatted_max) : (String, String, String)

+
+ +
+
+

Tests

+
+
+

Views

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.data.html b/docs/code_documentation/2.22.0/modules/seed.data.html new file mode 100644 index 00000000..225e426b --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.data.html @@ -0,0 +1,157 @@ + + + + + + + Data Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Data Package

+
+

Submodules

+
+
+

BEDES

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.data_importer.html b/docs/code_documentation/2.22.0/modules/seed.data_importer.html new file mode 100644 index 00000000..447e68e3 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.data_importer.html @@ -0,0 +1,233 @@ + + + + + + + Data Importer Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Data Importer Package

+
+

Submodules

+
+
+

Managers

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.data_importer.managers.NotDeletedManager(*args, **kwargs)
+

Bases: Manager

+
+
+get_all(*args, **kwargs)
+

Method to return ALL ImportFiles, including the ones where deleted == True which are normally excluded. +This is used for database/filesystem cleanup.

+
+ +
+
+get_queryset(*args, **kwargs)
+

Return a new QuerySet object. Subclasses can override this method to +customize the behavior of the Manager.

+
+ +
+ +
+ +
+ +
+
+

Models

+
+
+

URLs

+
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+

Utility methods pertaining to data import tasks (save, mapping, matching).

+
+
+seed.data_importer.utils.kbtu_thermal_conversion_factors(country)
+

Returns thermal conversion factors provided by Portfolio Manager. +In the PM app, using NREL’s test account, a property was created for each US +and CAN. All possible Meters of different Type and Units were added. +Readings of value 1 were added to deduce the factors provided below.

+

Consideration was given regarding having the provided ‘country’ value align with +Organizations’ thermal_conversion_assumption enums. Even though these two +should be aligned, the concept and need for these factors are not specific +solely to Orgs. So the ‘country’ value here is expected to be a string. +Specifically, there are instances in the codebase where the factors are +needed irrespective of any Organization’s preferences.

+
+ +
+
+seed.data_importer.utils.usage_point_id(raw_source_id)
+

Extracts and returns the usage point ID of a GreenButton full uri ID.

+
+ +
+
+

Views

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.features.html b/docs/code_documentation/2.22.0/modules/seed.features.html new file mode 100644 index 00000000..3f79c6a7 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.features.html @@ -0,0 +1,175 @@ + + + + + + + Features Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.html b/docs/code_documentation/2.22.0/modules/seed.html new file mode 100644 index 00000000..578604a0 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.html @@ -0,0 +1,814 @@ + + + + + + + SEED Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SEED Package

+
+

Subpackages

+
+ +
+
+
+

Inheritance

+
+
+

Submodules

+
+
+

Decorators

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+seed.decorators.DecoratorMixin(decorator)
+

Converts a decorator written for a function view into a mixin for a class-based view.

+

Example:

+
LoginRequiredMixin = DecoratorMixin(login_required)
+class MyView(LoginRequiredMixin):
+    pass
+
+class SomeView(DecoratorMixin(some_decorator), DecoratorMixin(something_else)):
+    pass
+
+
+
+ +
+
+seed.decorators.ajax_request(func)
+

Copied from django-annoying, with a small modification. Now we also check for ‘status’ or +‘success’ keys and slash return correct status codes

+

If view returned serializable dict, returns response in a format requested +by HTTP_ACCEPT header. Defaults to JSON if none requested or match.

+

Currently supports JSON or YAML (if installed), but can easily be extended.

+

Example:

+
@ajax_request
+def my_view(request):
+    news = News.objects.all()
+    news_titles = [entry.title for entry in news]
+    return { 'news_titles': news_titles }
+
+
+
+ +
+
+seed.decorators.ajax_request_class(func)
+
    +
  • Copied from django-annoying, with a small modification. Now we also check for ‘status’ or

  • +
+

‘success’ keys and return correct status codes

+

If view returned serializable dict, returns response in a format requested +by HTTP_ACCEPT header. Defaults to JSON if none requested or match.

+

Currently supports JSON or YAML (if installed), but can easily be extended.

+

Example:

+
@ajax_request
+def my_view(self, request):
+    news = News.objects.all()
+    news_titles = [entry.title for entry in news]
+    return { 'news_titles': news_titles }
+
+
+
+ +
+
+seed.decorators.get_prog_key(func_name, import_file_pk)
+

Return the progress key for the cache

+
+ +
+
+seed.decorators.lock_and_track(fn, *args, **kwargs)
+

Decorator to lock tasks to single executor and provide progress url.

+
+ +
+
+seed.decorators.require_organization_id(func)
+

Validate that organization_id is in the GET params and it’s an int.

+
+ +
+
+seed.decorators.require_organization_id_class(fn)
+

Validate that organization_id is in the GET params and it’s an int.

+
+ +
+
+seed.decorators.require_organization_membership(fn)
+

Validate that the organization_id passed in GET is valid for request user.

+
+ +
+
+

Factory

+
+
+

Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+

Search

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+

Search methods pertaining to buildings.

+
+
+seed.search.build_shared_buildings_orgs(orgs)
+

returns a list of sibling and parent orgs

+
+ +
+
+seed.search.create_inventory_queryset(inventory_type, orgs, exclude, order_by, other_orgs=None, cycle_id=None)
+

creates a queryset of properties or taxlots within orgs. +If other_orgs, properties/taxlots in both orgs and other_orgs +will be represented in the queryset.

+
+
Parameters:
+
    +
  • inventory_type – property or taxlot.

  • +
  • orgs – queryset of Organization inst.

  • +
  • exclude – django query exclude dict.

  • +
  • order_by – django query order_by str.

  • +
  • other_orgs – list of other orgs to or the query

  • +
+
+
+
+ +
+
+seed.search.get_inventory_fieldnames(inventory_type)
+

returns a list of field names that will be searched against

+
+ +
+
+seed.search.get_orgs_w_public_fields()
+

returns a list of orgs that have publicly shared fields

+
+ +
+
+seed.search.inventory_search_filter_sort(inventory_type, params, user, cycle_id=None)
+

Given a parsed set of params, perform the search, filter, and sort for +Properties or Taxlots

+
+ +
+
+seed.search.parse_body(request)
+

parses the request body for search params, q, etc

+
+
Parameters:
+

request – django wsgi request object

+
+
Returns:
+

dict

+
+
+

Example:

+
{
+    'exclude': dict, exclude dict for django queryset
+    'order_by': str, query order_by, defaults to 'tax_lot_id'
+    'sort_reverse': bool, True if ASC, False if DSC
+    'page': int, pagination page
+    'number_per_page': int, number per pagination page
+    'show_shared_buildings': bool, whether to search across all user's orgs
+    'q': str, global search param
+    'other_search_params': dict, filter params
+    'project_id': str, project id if exists in body
+}
+
+
+
+ +
+
+seed.search.process_search_params(params, user, is_api_request=False)
+

Given a python representation of a search query, process it into the +internal format that is used for searching, filtering, sorting, and pagination.

+
+
Parameters:
+
    +
  • params – a python object representing the search query

  • +
  • user – the user this search is for

  • +
  • is_api_request – bool, boolean whether this search is being done as an api request.

  • +
+
+
Returns:
+

dict

+
+
+

Example:

+
{
+    'exclude': dict, exclude dict for django queryset
+    'order_by': str, query order_by, defaults to 'tax_lot_id'
+    'sort_reverse': bool, True if ASC, False if DSC
+    'page': int, pagination page
+    'number_per_page': int, number per pagination page
+    'show_shared_buildings': bool, whether to search across all user's orgs
+    'q': str, global search param
+    'other_search_params': dict, filter params
+    'project_id': str, project id if exists in body
+}
+
+
+
+ +
+
+seed.search.search_inventory(inventory_type, q, fieldnames=None, queryset=None)
+

returns a queryset for matching Taxlot(View)/Property(View) +:param str or unicode q: search string +:param list fieldnames: list of model fieldnames +:param queryset: optional queryset to filter from +:returns: :queryset: queryset of matching buildings

+
+ +
+
+seed.search.search_properties(q, fieldnames=None, queryset=None)
+
+ +
+
+seed.search.search_taxlots(q, fieldnames=None, queryset=None)
+
+ +
+
+

Tasks

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+seed.tasks.delete_organization(org_pk)
+

delete_organization_buildings

+
+ +
+
+seed.tasks.invite_new_user_to_seed(domain, email_address, token, user_pk, first_name)
+

Send invitation email to newly created user from the landing page. +NOTE: this function is only used on the landing page because the user has not been assigned an organization +domain – The domain name of the running seed instance +email_address – The address to send the invitation to +token – generated by Django’s default_token_generator +user_pk – primary key for this user record +first_name – First name of the new user +new_user

+

Returns: nothing

+
+ +
+
+seed.tasks.send_salesforce_error_log(org_pk, errors)
+

send salesforce error log to logging email when errors are encountered during scheduled sync

+
+ +
+
+

Token Generator

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
author:
+

Aleck Landgraf

+
+
+

token_generator.py - taken from django core master branch

+

needed a token check that would not expire after three days for sending a +signup email

+
+
+class seed.token_generators.SignupTokenGenerator
+

Bases: object

+

Strategy object used to generate and check tokens for the password +reset mechanism.

+
+
+check_token(user, token, token_expires=True)
+

Check that a password reset token is correct for a given user.

+
+ +
+
+make_token(user)
+

Returns a token that can be used once to do a password reset +for the given user.

+
+ +
+ +
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.landing.html b/docs/code_documentation/2.22.0/modules/seed.landing.html new file mode 100644 index 00000000..34f78427 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.landing.html @@ -0,0 +1,842 @@ + + + + + + + Landing Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Landing Package

+
+

Subpackages

+ +
+
+

Submodules

+
+
+

Forms

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.landing.forms.CustomCreateUserForm(*args, **kwargs)
+

Bases: UserCreationForm

+
+
+class Meta
+

Bases: object

+
+
+fields = ['username']
+
+ +
+
+model
+

alias of SEEDUser

+
+ +
+
+widgets = {'username': <django.forms.widgets.EmailInput object>}
+
+ +
+ +
+
+base_fields = {'password1': <django.forms.fields.CharField object>, 'password2': <django.forms.fields.CharField object>, 'username': <django.forms.fields.EmailField object>}
+
+ +
+
+declared_fields = {'password1': <django.forms.fields.CharField object>, 'password2': <django.forms.fields.CharField object>}
+
+ +
+
+property media
+

Return all media required to render the widgets on this form.

+
+ +
+ +
+
+class seed.landing.forms.LoginForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None)
+

Bases: Form

+
+
+base_fields = {'email': <django.forms.fields.EmailField object>, 'password': <django.forms.fields.CharField object>}
+
+ +
+
+declared_fields = {'email': <django.forms.fields.EmailField object>, 'password': <django.forms.fields.CharField object>}
+
+ +
+
+property media
+

Return all media required to render the widgets on this form.

+
+ +
+ +
+
+

Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.landing.models.SEEDUser(*args, **kwargs)
+

Bases: AbstractBaseUser, PermissionsMixin

+

An abstract base class implementing a fully featured User model with +admin-compliant permissions.

+

Username, password and email are required. Other fields are optional.

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+REQUIRED_FIELDS = ['email']
+
+ +
+
+USERNAME_FIELD = 'username'
+
+ +
+
+analysis_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+api_key
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+columnmapping_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+cycle_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+date_joined
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+deactivate_user()
+
+ +
+
+default_building_detail_custom_columns
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+default_custom_columns
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+default_organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+default_organization_id
+
+ +
+
+email
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+email_user(subject, message, from_email=None)
+

Sends an email to this User.

+
+ +
+
+first_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+generate_key()
+

Creates and sets an API key for this user. +Adapted from tastypie:

+

https://github.com/toastdriven/django-tastypie/blob/master/tastypie/models.py#L47

+
+ +
+
+get_absolute_url()
+
+ +
+
+get_full_name()
+

Returns the first_name plus the last_name, with a space in between.

+
+ +
+
+get_next_by_date_joined(*, field=<django.db.models.fields.DateTimeField: date_joined>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_date_joined(*, field=<django.db.models.fields.DateTimeField: date_joined>, is_next=False, **kwargs)
+
+ +
+
+get_short_name()
+

Returns the short name for the user.

+
+ +
+
+greenassessmentpropertyauditlog_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+importrecord_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+is_staff
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+last_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+logentry_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+modified_import_records
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+notes
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+oauth2_provider_accesstoken
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+oauth2_provider_application
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+oauth2_provider_grant
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+oauth2_provider_refreshtoken
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.contrib.auth.models.UserManager object>
+
+ +
+
+organizationuser_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+orgs
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+postofficeemail_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+postofficeemailtemplate_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+classmethod process_header_request(request)
+

Process the header string to return the user if it is a valid user.

+
+
Parameters:
+

request – object, request object with HTTP Authorization

+
+
Returns:
+

User object

+
+
+
+ +
+
+save(*args, **kwargs)
+

Ensure that email and username are synced.

+
+ +
+
+show_shared_buildings
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+user_permissions
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+username
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+

Tests

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.landing.tests.UserLoginTest(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_simple_login()
+

Happy path login

+
+ +
+ +
+
+

URLs

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+seed.landing.views.account_activation_sent(request)
+
+ +
+
+seed.landing.views.activate(request, uidb64, token)
+
+ +
+
+seed.landing.views.create_account(request)
+
+ +
+
+seed.landing.views.landing_page(request)
+
+ +
+
+seed.landing.views.password_reset(request)
+
+ +
+
+seed.landing.views.password_reset_complete(request)
+
+ +
+
+seed.landing.views.password_reset_confirm(request, uidb64=None, token=None)
+
+ +
+
+seed.landing.views.password_reset_done(request)
+
+ +
+
+seed.landing.views.password_set(request, uidb64=None, token=None)
+
+ +
+
+seed.landing.views.signup(request, uidb64=None, token=None)
+
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.landing.management.commands.html b/docs/code_documentation/2.22.0/modules/seed.landing.management.commands.html new file mode 100644 index 00000000..3ae8308d --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.landing.management.commands.html @@ -0,0 +1,190 @@ + + + + + + + Landing Management Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Landing Management Package

+
+

Submodules

+
+
+

Update EULA

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+

Creates a new ToS entry from an html file.

+
+
+class seed.landing.management.commands.update_eula.Command(stdout=None, stderr=None, no_color=False, force_color=False)
+

Bases: BaseCommand

+
+
+handle(*args, **options)
+

The actual logic of the command. Subclasses must implement +this method.

+
+ +
+
+help = 'Update the Terms of Service with a new HTML file'
+
+ +
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.landing.management.html b/docs/code_documentation/2.22.0/modules/seed.landing.management.html new file mode 100644 index 00000000..001ded03 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.landing.management.html @@ -0,0 +1,182 @@ + + + + + + + seed.landing.management package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

seed.landing.management package

+
+

Subpackages

+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.lib.html b/docs/code_documentation/2.22.0/modules/seed.lib.html new file mode 100644 index 00000000..8299416a --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.lib.html @@ -0,0 +1,157 @@ + + + + + + + Library Packages — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Library Packages

+
+

Submodules

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.lib.mappings.html b/docs/code_documentation/2.22.0/modules/seed.lib.mappings.html new file mode 100644 index 00000000..3ebba645 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.lib.mappings.html @@ -0,0 +1,339 @@ + + + + + + + seed.lib.mappings package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

seed.lib.mappings package

+
+

Submodules

+
+
+

seed.lib.mappings.mapper module

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+

:author Dan Gunter <dkgunter@lbl.gov>

+
+
+seed.lib.mappings.mapper.create_column_regexes(raw_columns)
+

Take the columns in the format below and sanitize the keys and add +in the regex.

+
+
Parameters:
+

raw_data – list of strings (columns names from imported file)

+
+
Returns:
+

list of dict

+
+
+
+ +
+
+seed.lib.mappings.mapper.get_pm_mapping(raw_columns, mapping_data=None, resolve_duplicates=True)
+

Create and return Portfolio Manager (PM) mapping for a given version of PM and the given +list of column names.

+

The method will take the raw_columns (from the CSV/XLSX file) and attempt to normalize the +column names so that they can be mapped to the data in the pm-mapping.json[‘from_field’].

+
+ +
+
+

seed.lib.mappings.mapping_columns module

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+

:author Nicholas Long <nicholas.long@nrel.gov>

+
+
+class seed.lib.mappings.mapping_columns.MappingColumns(raw_columns, dest_columns, previous_mapping=None, map_args=None, default_mappings=None, threshold=0)
+

Bases: object

+

This class handles the probabilistic mapping of unknown columns to defined fields. This +is mainly used in the build_column_mapping API endpoint.

+
+
+add_mappings(raw_column, mappings, previous_mapping=False)
+

Add mappings to the data structure for later processing.

+
+
Parameters:
+
    +
  • raw_column – list of strings

  • +
  • mappings – list of tuples of potential mappings and confidences

  • +
  • previous_mapping – boolean, if true these these mappings will take precedence

  • +
+
+
Returns:
+

Bool, whether or not the mapping was added

+
+
+
+ +
+
+apply_threshold(threshold)
+

Remove mapping suggestions that do not meet the defined threshold

+

This method is forced as part of the workflow for now, but could easily be made as a +separate call.

+
+
Parameters:
+

threshold – int, min value to be greater than or equal to.

+
+
Returns:
+

None

+
+
+
+ +
+
+property duplicates
+

Check for duplicate initial mapping results. Duplicates exist if the first suggested mapping +for two different raw_columns are the same. The example below would be one of those cases.

+
+
Returns:
+

List of raw col

+
+
+
+ +
+
+property final_mappings
+

Return the final mappings in a format that can be used downstream from this method +{

+
+

“raw_column_1”: (‘table’, ‘db_column_1’, confidence), +“raw_column_2”: (‘table’, ‘db_column_1’, confidence),

+
+

}

+
+ +
+
+first_suggested_mapping(raw_column)
+

Grab the first suggested mapping for a raw column

+
+
Parameters:
+

raw_column – String

+
+
Returns:
+

tuple of the mapping (‘table’, ‘field’, confidence), or ()

+
+
+
+ +
+
+resolve_duplicate(dup_map_field, raw_columns)
+

If there are duplicates, that is two raw_columns are trying to map to the same suggested +column, then select the next available one on the duplicate column. The one with the highest +confidence will ‘win’ the duplicate battle.

+
+
Parameters:
+
    +
  • dup_map_field – String, name of the field that is a duplicate

  • +
  • raw_columns – list, raw columns that mapped to the same result

  • +
+
+
Returns:
+

None

+
+
+
+ +
+
+set_initial_mapping_cmp(raw_column)
+

Set the initial_mapping_cmp helper item in the self.data hash. This is used to detect +if there are any duplicates. The initial mapping cmp will be the first match in the list +(i.e., the one with the highest confidence).

+
+
Parameters:
+

raw_column – String, name of the raw column to set the initial_mapping_cmp

+
+
Returns:
+

None

+
+
+
+ +
+ +
+
+seed.lib.mappings.mapping_columns.sort_duplicates(a, b)
+

Custom sort for the duplicate hash to decide which raw column will get the mapping suggestion +based on the confidence.

+
+ +
+
+

seed.lib.mappings.mapping_data module

+
+
+

seed.lib.mappings.test_mapper module

+
+
+

seed.lib.mappings.test_mapping_columns module

+
+
+

seed.lib.mappings.test_mapping_data module

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.lib.merging.html b/docs/code_documentation/2.22.0/modules/seed.lib.merging.html new file mode 100644 index 00000000..b0d5bf18 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.lib.merging.html @@ -0,0 +1,226 @@ + + + + + + + seed.lib.merging package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

seed.lib.merging package

+
+

Submodules

+
+
+

seed.lib.merging.merging module

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+

:author Dan Gunter <dkgunter@lbl.gov>

+
+
+seed.lib.merging.merging.get_attrs_with_mapping(data_set_buildings, mapping)
+

Returns a dictionary of attributes from each data_set_building.

+
+
Parameters:
+
    +
  • data_set_buildings – list, instances to merge.

  • +
  • mapping

  • +
+
+
Returns:
+

dict: possible attributes keyed on attr name.

+
+
+
+ +
+
+seed.lib.merging.merging.get_propertystate_attrs(data_set_buildings)
+
+ +
+
+seed.lib.merging.merging.get_state_attrs(state_list)
+

Return a list of state attributes. This does not include any of the extra data columns

+
+ +
+
+seed.lib.merging.merging.get_state_to_state_tuple(inventory)
+

Return the list of the database fields based on the inventory type

+
+ +
+
+seed.lib.merging.merging.get_taxlotstate_attrs(data_set_buildings)
+
+ +
+
+seed.lib.merging.merging.merge_state(merged_state, state1, state2, priorities, ignore_merge_protection=False)
+

Set attributes on our Canonical model, saving differences.

+
+
Parameters:
+
    +
  • merged_state – PropertyState/TaxLotState model inst.

  • +
  • state1 – PropertyState/TaxLotState model inst. Left parent.

  • +
  • state2 – PropertyState/TaxLotState model inst. Right parent.

  • +
  • priorities – dict, column names with favor new or existing

  • +
+
+
Returns:
+

inst(merged_state), updated.

+
+
+
+ +
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.management.html b/docs/code_documentation/2.22.0/modules/seed.management.html new file mode 100644 index 00000000..ad3aa073 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.management.html @@ -0,0 +1,176 @@ + + + + + + + Management Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Management Package

+
+

Subpackages

+
+
+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.managers.html b/docs/code_documentation/2.22.0/modules/seed.managers.html new file mode 100644 index 00000000..dc7321c5 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.managers.html @@ -0,0 +1,174 @@ + + + + + + + Managers Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Managers Package

+
+

Subpackages

+ +
+
+

Submodules

+
+
+

JSON

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.managers.tests.html b/docs/code_documentation/2.22.0/modules/seed.managers.tests.html new file mode 100644 index 00000000..72ad1204 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.managers.tests.html @@ -0,0 +1,162 @@ + + + + + + + Manager Tests Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Manager Tests Package

+
+

Submodules

+
+
+

Test JSON Manager

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.mappings.html b/docs/code_documentation/2.22.0/modules/seed.mappings.html new file mode 100644 index 00000000..b51d740a --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.mappings.html @@ -0,0 +1,183 @@ + + + + + + + Mapping Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.models.html b/docs/code_documentation/2.22.0/modules/seed.models.html new file mode 100644 index 00000000..fc5e4dd8 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.models.html @@ -0,0 +1,4310 @@ + + + + + + + Models — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Models

+
+

Submodules

+
+
+

AuditLog

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+

Columns

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.models.columns.Column(*args, **kwargs)
+

Bases: Model

+

The name of a column for a given organization.

+
+
+COLUMN_EXCLUDE_FIELDS = ['bounding_box', 'centroid', 'created', 'data_state', 'extra_data', 'geocoding_confidence', 'id', 'import_file', 'long_lat', 'merge_state', 'source_type', 'updated', 'hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+COLUMN_MERGE_FAVOR_EXISTING = 1
+
+ +
+
+COLUMN_MERGE_FAVOR_NEW = 0
+
+ +
+
+COLUMN_MERGE_PROTECTION = [(0, 'Favor New'), (1, 'Favor Existing')]
+
+ +
+
+DATABASE_COLUMNS = [{'column_description': 'PM Property ID', 'column_name': 'pm_property_id', 'data_type': 'string', 'display_name': 'PM Property ID', 'table_name': 'PropertyState'}, {'column_description': 'PM Parent Property ID', 'column_name': 'pm_parent_property_id', 'data_type': 'string', 'display_name': 'PM Parent Property ID', 'table_name': 'PropertyState'}, {'column_description': 'Jurisdiction Tax Lot ID', 'column_name': 'jurisdiction_tax_lot_id', 'data_type': 'string', 'display_name': 'Jurisdiction Tax Lot ID', 'table_name': 'TaxLotState'}, {'column_description': 'Jurisdiction Property ID', 'column_name': 'jurisdiction_property_id', 'data_type': 'string', 'display_name': 'Jurisdiction Property ID', 'table_name': 'PropertyState'}, {'column_description': 'UBID', 'column_name': 'ubid', 'data_type': 'string', 'display_name': 'UBID', 'table_name': 'TaxLotState'}, {'column_description': 'UBID', 'column_name': 'ubid', 'data_type': 'string', 'display_name': 'UBID', 'table_name': 'PropertyState'}, {'column_description': 'Custom ID 1', 'column_name': 'custom_id_1', 'data_type': 'string', 'display_name': 'Custom ID 1', 'table_name': 'PropertyState'}, {'column_description': 'Custom ID 1', 'column_name': 'custom_id_1', 'data_type': 'string', 'display_name': 'Custom ID 1', 'table_name': 'TaxLotState'}, {'column_description': 'Audit Template Building ID', 'column_name': 'audit_template_building_id', 'data_type': 'string', 'display_name': 'Audit Template Building ID', 'table_name': 'PropertyState'}, {'column_description': 'Address Line 1', 'column_name': 'address_line_1', 'data_type': 'string', 'display_name': 'Address Line 1', 'table_name': 'PropertyState'}, {'column_description': 'Address Line 1', 'column_name': 'address_line_1', 'data_type': 'string', 'display_name': 'Address Line 1', 'table_name': 'TaxLotState'}, {'column_description': 'Address Line 2', 'column_name': 'address_line_2', 'data_type': 'string', 'display_name': 'Address Line 2', 'table_name': 'PropertyState'}, {'column_description': 'Address Line 2', 'column_name': 'address_line_2', 'data_type': 'string', 'display_name': 'Address Line 2', 'table_name': 'TaxLotState'}, {'column_description': 'City', 'column_name': 'city', 'data_type': 'string', 'display_name': 'City', 'table_name': 'PropertyState'}, {'column_description': 'City', 'column_name': 'city', 'data_type': 'string', 'display_name': 'City', 'table_name': 'TaxLotState'}, {'column_description': 'State', 'column_name': 'state', 'data_type': 'string', 'display_name': 'State', 'table_name': 'PropertyState'}, {'column_description': 'State', 'column_name': 'state', 'data_type': 'string', 'display_name': 'State', 'table_name': 'TaxLotState'}, {'column_description': 'Normalized Address', 'column_name': 'normalized_address', 'data_type': 'string', 'display_name': 'Normalized Address', 'table_name': 'PropertyState'}, {'column_description': 'Normalized Address', 'column_name': 'normalized_address', 'data_type': 'string', 'display_name': 'Normalized Address', 'table_name': 'TaxLotState'}, {'column_description': 'Postal Code', 'column_name': 'postal_code', 'data_type': 'string', 'display_name': 'Postal Code', 'table_name': 'PropertyState'}, {'column_description': 'Postal Code', 'column_name': 'postal_code', 'data_type': 'string', 'display_name': 'Postal Code', 'table_name': 'TaxLotState'}, {'column_description': 'Associated Tax Lot ID', 'column_name': 'lot_number', 'data_type': 'string', 'display_name': 'Associated Tax Lot ID', 'table_name': 'PropertyState'}, {'column_description': 'Property Name', 'column_name': 'property_name', 'data_type': 'string', 'display_name': 'Property Name', 'table_name': 'PropertyState'}, {'column_description': 'Latitude', 'column_name': 'latitude', 'data_type': 'number', 'display_name': 'Latitude', 'table_name': 'PropertyState'}, {'column_description': 'Longitude', 'column_name': 'longitude', 'data_type': 'number', 'display_name': 'Longitude', 'table_name': 'PropertyState'}, {'column_description': 'Latitude', 'column_name': 'latitude', 'data_type': 'number', 'display_name': 'Latitude', 'table_name': 'TaxLotState'}, {'column_description': 'Longitude', 'column_name': 'longitude', 'data_type': 'number', 'display_name': 'Longitude', 'table_name': 'TaxLotState'}, {'column_description': 'Geocoding Confidence', 'column_name': 'geocoding_confidence', 'data_type': 'string', 'display_name': 'Geocoding Confidence', 'table_name': 'PropertyState'}, {'column_description': 'Geocoding Confidence', 'column_name': 'geocoding_confidence', 'data_type': 'string', 'display_name': 'Geocoding Confidence', 'table_name': 'TaxLotState'}, {'column_description': 'Property Footprint', 'column_name': 'property_footprint', 'data_type': 'geometry', 'display_name': 'Property Footprint', 'table_name': 'PropertyState'}, {'column_description': 'Tax Lot Footprint', 'column_name': 'taxlot_footprint', 'data_type': 'geometry', 'display_name': 'Tax Lot Footprint', 'table_name': 'TaxLotState'}, {'column_description': 'Updated', 'column_name': 'updated', 'data_type': 'datetime', 'display_name': 'Updated', 'table_name': 'PropertyState'}, {'column_description': 'Created', 'column_name': 'created', 'data_type': 'datetime', 'display_name': 'Created', 'table_name': 'PropertyState'}, {'column_description': 'Updated', 'column_name': 'updated', 'data_type': 'datetime', 'display_name': 'Updated', 'table_name': 'TaxLotState'}, {'column_description': 'Created', 'column_name': 'created', 'data_type': 'datetime', 'display_name': 'Created', 'table_name': 'TaxLotState'}, {'column_description': 'Gross Floor Area', 'column_name': 'gross_floor_area', 'data_type': 'area', 'display_name': 'Gross Floor Area', 'table_name': 'PropertyState'}, {'column_description': 'Use Description', 'column_name': 'use_description', 'data_type': 'string', 'display_name': 'Use Description', 'table_name': 'PropertyState'}, {'column_description': 'ENERGY STAR Score', 'column_name': 'energy_score', 'data_type': 'integer', 'display_name': 'ENERGY STAR Score', 'table_name': 'PropertyState'}, {'column_description': 'Property Notes', 'column_name': 'property_notes', 'data_type': 'string', 'display_name': 'Property Notes', 'table_name': 'PropertyState'}, {'column_description': 'Property Type', 'column_name': 'property_type', 'data_type': 'string', 'display_name': 'Property Type', 'table_name': 'PropertyState'}, {'column_description': 'Year Ending', 'column_name': 'year_ending', 'data_type': 'date', 'display_name': 'Year Ending', 'table_name': 'PropertyState'}, {'column_description': 'Owner', 'column_name': 'owner', 'data_type': 'string', 'display_name': 'Owner', 'table_name': 'PropertyState'}, {'column_description': 'Owner Email', 'column_name': 'owner_email', 'data_type': 'string', 'display_name': 'Owner Email', 'table_name': 'PropertyState'}, {'column_description': 'Owner Telephone', 'column_name': 'owner_telephone', 'data_type': 'string', 'display_name': 'Owner Telephone', 'table_name': 'PropertyState'}, {'column_description': 'Building Count', 'column_name': 'building_count', 'data_type': 'integer', 'display_name': 'Building Count', 'table_name': 'PropertyState'}, {'column_description': 'Year Built', 'column_name': 'year_built', 'data_type': 'integer', 'display_name': 'Year Built', 'table_name': 'PropertyState'}, {'column_description': 'Recent Sale Date', 'column_name': 'recent_sale_date', 'data_type': 'datetime', 'display_name': 'Recent Sale Date', 'table_name': 'PropertyState'}, {'column_description': 'Conditioned Floor Area', 'column_name': 'conditioned_floor_area', 'data_type': 'area', 'display_name': 'Conditioned Floor Area', 'table_name': 'PropertyState'}, {'column_description': 'Occupied Floor Area', 'column_name': 'occupied_floor_area', 'data_type': 'area', 'display_name': 'Occupied Floor Area', 'table_name': 'PropertyState'}, {'column_description': 'Owner Address', 'column_name': 'owner_address', 'data_type': 'string', 'display_name': 'Owner Address', 'table_name': 'PropertyState'}, {'column_description': 'Owner City/State', 'column_name': 'owner_city_state', 'data_type': 'string', 'display_name': 'Owner City/State', 'table_name': 'PropertyState'}, {'column_description': 'Owner Postal Code', 'column_name': 'owner_postal_code', 'data_type': 'string', 'display_name': 'Owner Postal Code', 'table_name': 'PropertyState'}, {'column_description': 'Home Energy Score ID', 'column_name': 'home_energy_score_id', 'data_type': 'string', 'display_name': 'Home Energy Score ID', 'table_name': 'PropertyState'}, {'column_description': 'PM Generation Date', 'column_name': 'generation_date', 'data_type': 'datetime', 'display_name': 'PM Generation Date', 'table_name': 'PropertyState'}, {'column_description': 'PM Release Date', 'column_name': 'release_date', 'data_type': 'datetime', 'display_name': 'PM Release Date', 'table_name': 'PropertyState'}, {'column_description': 'Site EUI', 'column_name': 'site_eui', 'data_type': 'eui', 'display_name': 'Site EUI', 'table_name': 'PropertyState'}, {'column_description': 'Site EUI Weather Normalized', 'column_name': 'site_eui_weather_normalized', 'data_type': 'eui', 'display_name': 'Site EUI Weather Normalized', 'table_name': 'PropertyState'}, {'column_description': 'Site EUI Modeled', 'column_name': 'site_eui_modeled', 'data_type': 'eui', 'display_name': 'Site EUI Modeled', 'table_name': 'PropertyState'}, {'column_description': 'Source EUI', 'column_name': 'source_eui', 'data_type': 'eui', 'display_name': 'Source EUI', 'table_name': 'PropertyState'}, {'column_description': 'Source EUI Weather Normalized', 'column_name': 'source_eui_weather_normalized', 'data_type': 'eui', 'display_name': 'Source EUI Weather Normalized', 'table_name': 'PropertyState'}, {'column_description': 'Source EUI Modeled', 'column_name': 'source_eui_modeled', 'data_type': 'eui', 'display_name': 'Source EUI Modeled', 'table_name': 'PropertyState'}, {'column_description': 'Energy Alerts', 'column_name': 'energy_alerts', 'data_type': 'string', 'display_name': 'Energy Alerts', 'table_name': 'PropertyState'}, {'column_description': 'Space Alerts', 'column_name': 'space_alerts', 'data_type': 'string', 'display_name': 'Space Alerts', 'table_name': 'PropertyState'}, {'column_description': 'Building Certification', 'column_name': 'building_certification', 'data_type': 'string', 'display_name': 'Building Certification', 'table_name': 'PropertyState'}, {'column_description': 'Number Properties', 'column_name': 'number_properties', 'data_type': 'integer', 'display_name': 'Number Properties', 'table_name': 'TaxLotState'}, {'column_description': 'Block Number', 'column_name': 'block_number', 'data_type': 'string', 'display_name': 'Block Number', 'table_name': 'TaxLotState'}, {'column_description': 'District', 'column_name': 'district', 'data_type': 'string', 'display_name': 'District', 'table_name': 'TaxLotState'}, {'column_description': 'eGRID Subregion Code', 'column_name': 'egrid_subregion_code', 'data_type': 'string', 'display_name': 'eGRID Subregion Code', 'table_name': 'PropertyState'}, {'column_description': 'Total GHG Emissions', 'column_name': 'total_ghg_emissions', 'data_type': 'ghg', 'display_name': 'Total GHG Emissions', 'table_name': 'PropertyState'}, {'column_description': 'Total Marginal GHG Emissions', 'column_name': 'total_marginal_ghg_emissions', 'data_type': 'ghg', 'display_name': 'Total Marginal GHG Emissions', 'table_name': 'PropertyState'}, {'column_description': 'Total GHG Emissions Intensity', 'column_name': 'total_ghg_emissions_intensity', 'data_type': 'ghg_intensity', 'display_name': 'Total GHG Emissions Intensity', 'table_name': 'PropertyState'}, {'column_description': 'Total Marginal GHG Emissions Intensity', 'column_name': 'total_marginal_ghg_emissions_intensity', 'data_type': 'ghg_intensity', 'display_name': 'Total Marginal GHG Emissions Intensity', 'table_name': 'PropertyState'}, {'column_description': 'Time zone of the property', 'column_name': 'property_timezone', 'data_type': 'string', 'display_name': 'Property Time Zone', 'table_name': 'PropertyState'}]
+
+ +
+
+DATA_TYPE_PARSERS: dict[str, Callable] = {'area': <function Column.<lambda>>, 'boolean': <function Column.<lambda>>, 'date': <function Column.<lambda>>, 'datetime': <built-in method fromisoformat of type object>, 'eui': <function Column.<lambda>>, 'float': <function Column.<lambda>>, 'geometry': <class 'str'>, 'ghg': <function Column.<lambda>>, 'ghg_intensity': <function Column.<lambda>>, 'integer': <function Column.<lambda>>, 'number': <function Column.<lambda>>, 'string': <class 'str'>}
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+EXCLUDED_API_FIELDS = ['normalized_address']
+
+ +
+
+EXCLUDED_COLUMN_RETURN_FIELDS = ['hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+EXCLUDED_MAPPING_FIELDS = ['created', 'extra_data', 'lot_number', 'normalized_address', 'geocoded_address', 'geocoded_postal_code', 'geocoded_side_of_street', 'geocoded_country', 'geocoded_state', 'geocoded_county', 'geocoded_city', 'geocoded_neighborhood', 'updated']
+
+ +
+
+EXCLUDED_RENAME_FROM_FIELDS = ['lot_number', 'year_built', 'property_footprint', 'taxlot_footprint', 'bounding_box', 'centroid', 'created', 'data_state', 'extra_data', 'geocoding_confidence', 'id', 'import_file', 'long_lat', 'merge_state', 'source_type', 'updated', 'hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+EXCLUDED_RENAME_TO_FIELDS = ['lot_number', 'latitude', 'longitude', 'year_built', 'property_footprint', 'created', 'updated', 'bounding_box', 'centroid', 'created', 'data_state', 'extra_data', 'geocoding_confidence', 'id', 'import_file', 'long_lat', 'merge_state', 'source_type', 'updated', 'hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+INTERNAL_TYPE_TO_DATA_TYPE = {'BooleanField': 'boolean', 'CharField': 'string', 'DateField': 'date', 'DateTimeField': 'datetime', 'FloatField': 'double', 'IntegerField': 'integer', 'JSONField': 'string', 'PointField': 'geometry', 'PolygonField': 'geometry', 'TextField': 'string'}
+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+PINNED_COLUMNS = [('PropertyState', 'pm_property_id'), ('TaxLotState', 'jurisdiction_tax_lot_id')]
+
+ +
+
+QUANTITY_UNIT_COLUMNS = [('PropertyState', 'gross_floor_area'), ('PropertyState', 'occupied_floor_area'), ('PropertyState', 'conditioned_floor_area'), ('PropertyState', 'site_eui'), ('PropertyState', 'site_eui_modeled'), ('PropertyState', 'site_eui_weather_normalized'), ('PropertyState', 'source_eui'), ('PropertyState', 'source_eui_modeled'), ('PropertyState', 'source_eui_weather_normalized'), ('PropertyState', 'total_ghg_emissions'), ('PropertyState', 'total_marginal_ghg_emissions'), ('PropertyState', 'total_ghg_emissions_intensity'), ('PropertyState', 'total_marginal_ghg_emissions_intensity')]
+
+ +
+
+SHARED_FIELD_TYPES = ((0, 'None'), (1, 'Public'))
+
+ +
+
+SHARED_NONE = 0
+
+ +
+
+SHARED_PUBLIC = 1
+
+ +
+
+UNMAPPABLE_PROPERTY_FIELDS = ['created', 'geocoding_confidence', 'lot_number', 'updated']
+
+ +
+
+UNMAPPABLE_TAXLOT_FIELDS = ['created', 'geocoding_confidence', 'updated']
+
+ +
+
+account_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+actual_emission_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+actual_energy_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+benchmark_id_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+cast(value: Any) Any
+

Cast the value to the correct type for the column.

+
+
Args:

value (Any): Value to cast, typically a string.

+
+
+
+ +
+
+static cast_column_value(column_data_type: str, value: Any, allow_none: bool = True) Any
+

cast a single value from the column data type

+
+
Args:

column_data_type (str): The data type as defined in the column object +value (Any): value to cast. Note the value may already be cast correctly.

+
+
Raises:

Exception: CastException if the value cannot be cast to the correct type

+
+
Returns:

Any: Resulting casted value

+
+
+
+ +
+
+clean()
+

Hook for doing any extra model-wide validation after clean() has been +called on every field by self.clean_fields. Any ValidationError raised +by this method will not be associated with a particular field; it will +have a special-case association with the field defined by NON_FIELD_ERRORS.

+
+ +
+
+column_description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+column_list_profiles
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+column_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+columnlistprofilecolumn_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+comstock_mapping
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+contact_email_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+contact_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+static create_mappings(mappings, organization, user, import_file_id=None)
+

Create the mappings for an organization and a user based on a simple +array of array object.

+
+
Parameters:
+
    +
  • mappings – dict, dictionary containing mapping information

  • +
  • organization – inst, organization object

  • +
  • user – inst, User object

  • +
  • import_file_id – integer, If passed, will cache the column mappings data into the +import_file_id object.

  • +
+
+
+

:return Boolean, True is data are saved in the ColumnMapping table in the database

+
+ +
+
+static create_mappings_from_file(filename, organization, user, import_file_id=None)
+

Load the mappings in from a file in a very specific file format. The columns in the file +must be:

+
+
    +
  1. raw field

  2. +
  3. table name

  4. +
  5. field name

  6. +
  7. field display name

  8. +
  9. field data type

  10. +
  11. field unit type

  12. +
+
+
+
Parameters:
+
    +
  • filename – string, absolute path and name of file to load

  • +
  • organization – id, organization id

  • +
  • user – id, user id

  • +
  • import_file_id – Integer, If passed, will cache the column mappings data into +the import_file_id object.

  • +
+
+
Returns:
+

ColumnMapping, True

+
+
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_admin_account_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+data_admin_email_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+data_admin_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+data_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+dataviewparameter_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+static delete_all(organization)
+

Delete all the columns for an organization. Note that this will invalidate all the +data that is in the extra_data fields of the inventory and is irreversible.

+
+
Parameters:
+

organization – instance, Organization

+
+
Returns:
+

[int, int] Number of columns, column_mappings records that were deleted

+
+
+
+ +
+
+derived_column
+

Accessor to the related object on the forward side of a one-to-one relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Restaurant.place is a ForwardOneToOneDescriptor instance.

+
+ +
+
+derived_column_id
+
+ +
+
+derivedcolumn_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+derivedcolumnparameter_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+display_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+geocoding_order
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_merge_protection_display(*, field=<django.db.models.fields.IntegerField: merge_protection>)
+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_modified(*, field=<django.db.models.fields.DateTimeField: modified>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_modified(*, field=<django.db.models.fields.DateTimeField: modified>, is_next=False, **kwargs)
+
+ +
+
+get_shared_field_type_display(*, field=<django.db.models.fields.IntegerField: shared_field_type>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_file
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+import_file_id
+
+ +
+
+is_extra_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+is_matching_criteria
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+mapped_mappings
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+merge_protection
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+modified
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+raw_mappings
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+recognize_empty
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+rename_column(new_column_name, force=False)
+

Rename the column and move all the data to the new column. This can move the +data from a canonical field to an extra data field or vice versa. By default the +column.

+
+
Parameters:
+
    +
  • new_column_name – string new name of column

  • +
  • force – boolean force the overwrite of data in the column?

  • +
+
+
Returns:
+

+
+
+
+ +
+
+static retrieve_all(org_id: int, inventory_type: Literal['property', 'taxlot'] | None = None, only_used: bool = False, include_related: bool = True, exclude_derived: bool = False, column_ids: list[int] | None = None) list[dict]
+

Retrieve all the columns for an organization. This method will query for all the columns in the +database assigned to the organization. It will then go through and cleanup the names to ensure that +there are no duplicates. The name column is used for uniquely labeling the columns for UI Grid purposes.

+
+
Parameters:
+
    +
  • org_id – Organization ID

  • +
  • inventory_type – Inventory Type (property|taxlot) from the requester. This sets the related columns if requested.

  • +
  • only_used – View only the used columns that exist in the Column’s table

  • +
  • include_related – Include related columns (e.g., if inventory type is Property, include Taxlot columns)

  • +
  • exclude_derived – Exclude derived columns.

  • +
  • column_ids – List of Column ids.

  • +
+
+
+
+ +
+
+static retrieve_all_by_tuple(org_id)
+

Return list of all columns for an organization as a tuple.

+
[
+  ('PropertyState', 'address_line_1'),
+  ('PropertyState', 'address_line_2'),
+  ('PropertyState', 'building_certification'),
+  ('PropertyState', 'building_count'),
+  ('TaxLotState', 'address_line_1'),
+  ('TaxLotState', 'address_line_2'),
+  ('TaxLotState', 'block_number'),
+  ('TaxLotState', 'city'),
+  ('TaxLotState', 'jurisdiction_tax_lot_id'),
+]
+
+
+
+
Parameters:
+

org_id – int, Organization ID

+
+
Returns:
+

list of tuples

+
+
+
+ +
+
+static retrieve_db_field_name_for_hash_comparison()
+

Names only of the columns in the database (fields only, not extra data), independent of inventory type. +These fields are used for generating an MD5 hash to quickly check if the data are the same across +multiple records. Note that this ignores extra_data. The result is a superset of all the fields that are used +in the database across all of the inventory types of interest.

+
+
Returns:
+

list, names of columns, independent of inventory type.

+
+
+
+ +
+
+static retrieve_db_field_table_and_names_from_db_tables()
+

Similar to keys, except it returns a list of tuples of the columns that are in the database

+
[
+  ('PropertyState', 'address_line_1'),
+  ('PropertyState', 'address_line_2'),
+  ('PropertyState', 'building_certification'),
+  ('PropertyState', 'building_count'),
+  ('TaxLotState', 'address_line_1'),
+  ('TaxLotState', 'address_line_2'),
+  ('TaxLotState', 'block_number'),
+  ('TaxLotState', 'city'),
+  ('TaxLotState', 'jurisdiction_tax_lot_id'),
+]
+
+
+

:return:list of tuples

+
+ +
+
+static retrieve_db_fields(org_id)
+

return the fields in the database regardless of properties or taxlots. For example, there is an address_line_1 +in both the TaxLotState and the PropertyState. The command below will take the set to remove the duplicates.

+

[ “address_line_1”, “gross_floor_area”, … ] +:param org_id: int, Organization ID +:return: list

+
+ +
+
+static retrieve_db_fields_from_db_tables()
+

Return the list of database fields that are in the models. This is independent of what are in the +Columns table.

+
+
Returns:
+

+
+
+
+ +
+
+static retrieve_db_types()
+

Return the data types for the database columns in the format of:

+
{
+  "field_name": "data_type",
+  "field_name_2": "data_type_2",
+  "address_line_1": "string",
+}
+
+
+
+
Returns:
+

dict

+
+
+
+ +
+
+static retrieve_mapping_columns(org_id, inventory_type=None)
+

Retrieve all the columns that are for mapping for an organization in a dictionary.

+
+
Parameters:
+
    +
  • org_id – org_id, Organization ID

  • +
  • inventory_type – Inventory Type (property|taxlot) from the requester. This sets the related columns if requested.

  • +
+
+
Returns:
+

list, list of dict

+
+
+
+ +
+
+static retrieve_priorities(org_id)
+

Return the list of priorities for the columns. Result will be in the form of:

+
{
+    'PropertyState': {
+        'lot_number': 'Favor New',
+        'owner_address': 'Favor New',
+        'extra_data': {
+            'data_007': 'Favor New'
+        }
+    'TaxLotState': {
+        'custom_id_1': 'Favor New',
+        'block_number': 'Favor New',
+        'extra_data': {
+            'data_008': 'Favor New'
+        }
+}
+
+
+
+
Parameters:
+

org_id – organization with the columns

+
+
Returns:
+

dict

+
+
+
+ +
+
+salesforce_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+save(*args, **kwargs)
+

Save the current instance. Override this in a subclass if you want to +control the saving process.

+

The ‘force_insert’ and ‘force_update’ parameters can be used to insist +that the “save” must be an SQL insert or update (or equivalent for +non-SQL backends), respectively. Normally, they should not be set.

+
+ +
+
+static save_column_names(model_obj)
+

Save unique column names for extra_data in this organization.

+

This is a record of all the extra_data keys we have ever seen +for a particular organization.

+
+
Parameters:
+

model_obj – model_obj instance (either PropertyState or TaxLotState).

+
+
+
+ +
+
+shared_field_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+table_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+target_emission_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+target_energy_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+unit
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+unit_id
+
+ +
+
+units_pint
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+x_axis_columns
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+exception seed.models.columns.ColumnCastException
+

Bases: Exception

+
+ +
+
+seed.models.columns.validate_model(sender, **kwargs)
+
+ +
+
+

Cycles

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.models.cycles.Cycle(id, organization, user, name, start, end, created)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+analysispropertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+cycles
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+dataview_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+end
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+event_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_end(*, field=<django.db.models.fields.DateField: end>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_start(*, field=<django.db.models.fields.DateField: start>, is_next=True, **kwargs)
+
+ +
+
+classmethod get_or_create_default(organization)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_end(*, field=<django.db.models.fields.DateField: end>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_start(*, field=<django.db.models.fields.DateField: start>, is_next=False, **kwargs)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+importfile_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+propertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+start
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+taxlotproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+user
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+user_id
+
+ +
+ +
+
+

Joins

+
+
+

Generic Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.models.models.StatusLabel(id, created, modified, name, color, super_organization, show_in_list)
+

Bases: TimeStampedModel

+
+
+BLUE_CHOICE = 'blue'
+
+ +
+
+COLOR_CHOICES = (('red', 'red'), ('blue', 'blue'), ('light blue', 'light blue'), ('green', 'green'), ('white', 'white'), ('orange', 'orange'), ('gray', 'gray'))
+
+ +
+
+DEFAULT_LABELS = ['Residential', 'Non-Residential', 'Violation', 'Compliant', 'Missing Data', 'Questionable Report', 'Update Bldg Info', 'Call', 'Email', 'High EUI', 'Low EUI', 'Exempted', 'Extension', 'Change of Ownership']
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+GRAY_CHOICE = 'gray'
+
+ +
+
+GREEN_CHOICE = 'green'
+
+ +
+
+LIGHT_BLUE_CHOICE = 'light blue'
+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+ORANGE_CHOICE = 'orange'
+
+ +
+
+RED_CHOICE = 'red'
+
+ +
+
+WHITE_CHOICE = 'white'
+
+ +
+
+and_filter_groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+color
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+compliance_label
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+exclude_filter_groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_color_display(*, field=<django.db.models.fields.CharField: color>)
+
+ +
+
+get_next_by_created(*, field=<django_extensions.db.fields.CreationDateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_modified(*, field=<django_extensions.db.fields.ModificationDateTimeField: modified>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django_extensions.db.fields.CreationDateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_modified(*, field=<django_extensions.db.fields.ModificationDateTimeField: modified>, is_next=False, **kwargs)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+indication_label
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+or_filter_groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyview_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+rule_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+show_in_list
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+super_organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+super_organization_id
+
+ +
+
+taxlotview_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+to_dict()
+
+ +
+
+violation_label
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.models.Unit(*args, **kwargs)
+

Bases: Model

+

Unit of measure for a Column Value.

+
+
+DATE = 4
+
+ +
+
+DATETIME = 5
+
+ +
+
+DECIMAL = 2
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+FLOAT = 3
+
+ +
+
+INTEGER = 6
+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+STRING = 1
+
+ +
+
+UNIT_TYPES = ((1, 'String'), (6, 'Integer'), (3, 'Float'), (4, 'Date'), (5, 'Datetime'))
+
+ +
+
+column_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_unit_type_display(*, field=<django.db.models.fields.IntegerField: unit_type>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+unit_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+unit_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+

Properties

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.models.properties.Property(*args, **kwargs)
+

Bases: Model

+

The Property is the parent property that ties together all the views of the property. +For example, if a building has multiple changes overtime, then this Property will always +remain the same. The PropertyView will point to the unchanged property as the PropertyState +and Property view are updated.

+

The property can also reference a parent property.

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+analysispropertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+copy_meters(source_property_id, source_persists=True)
+

Copies meters from a source Property to the current Property.

+

It’s most efficient if the persistence of the source Property’s readings +aren’t needed as bulk reassignments can then be used.

+

The cases and logic are described in comments throughout.

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_loggers
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+events
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+inventory_documents
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+meters
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+parent_property
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_property_id
+
+ +
+
+property_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+views
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.properties.PropertyAuditLog(id, organization, parent1, parent2, parent_state1, parent_state2, state, view, name, description, import_filename, record_type, created)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_record_type_display(*, field=<django.db.models.fields.IntegerField: record_type>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_filename
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+parent1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent1_id
+
+ +
+
+parent2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent2_id
+
+ +
+
+parent_state1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state1_id
+
+ +
+
+parent_state2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state2_id
+
+ +
+
+propertyauditlog_parent1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyauditlog_parent2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+record_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+view
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+view_id
+
+ +
+ +
+
+class seed.models.properties.PropertyState(*args, **kwargs)
+

Bases: Model

+

Store a single property. This contains all the state information about the property

+

For property_timezone, use the pytz timezone strings. The US has the following and a full +list can be created by calling pytz.all_timezones in Python:

+
+
    +
  • US/Alaska

  • +
  • US/Aleutian

  • +
  • US/Arizona

  • +
  • US/Central

  • +
  • US/East-Indiana

  • +
  • US/Eastern

  • +
  • US/Hawaii

  • +
  • US/Indiana-Starke

  • +
  • US/Michigan

  • +
  • US/Mountain

  • +
  • US/Pacific

  • +
  • US/Samoa

  • +
+
+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+address_line_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+address_line_2
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+analysispropertyview
+

Accessor to the related object on the reverse side of a one-to-one +relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Place.restaurant is a ReverseOneToOneDescriptor instance.

+
+ +
+
+audit_template_building_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+bounding_box
+
+ +
+
+building_certification
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+building_count
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+building_files
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+centroid
+
+ +
+
+city
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+clean()
+

Hook for doing any extra model-wide validation after clean() has been +called on every field by self.clean_fields. Any ValidationError raised +by this method will not be associated with a particular field; it will +have a special-case association with the field defined by NON_FIELD_ERRORS.

+
+ +
+
+conditioned_floor_area
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+conditioned_floor_area_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+classmethod coparent(state_id)
+

Return the coparent of the PropertyState. This will query the PropertyAuditLog table to +determine if there is a coparent and return it if it is found. The state_id needs to be +the base ID of when the original record was imported

+
+
Parameters:
+

state_id – integer, state id to find coparent.

+
+
Returns:
+

dict

+
+
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+custom_id_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+egrid_subregion_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+energy_alerts
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+energy_score
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+extra_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+generation_date
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+geocoding_confidence
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_data_state_display(*, field=<django.db.models.fields.IntegerField: data_state>)
+
+ +
+
+get_merge_state_display(*, field=<django.db.models.fields.IntegerField: merge_state>)
+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+get_source_type_display(*, field=<django.db.models.fields.IntegerField: source_type>)
+
+ +
+
+gross_floor_area
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+gross_floor_area_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+hash_object
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+history()
+

Return the history of the property state by parsing through the auditlog. Returns only the ids +of the parent states and some descriptions.

+
+

main +/ / parent1 parent2

+
+

In the records, parent2 is most recent, so make sure to navigate parent two first since we +are returning the data in reverse over (that is most recent changes first)

+
+
Returns:
+

list, history as a list, and the main record

+
+
+
+ +
+
+home_energy_score_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_file
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+import_file_id
+
+ +
+
+jurisdiction_property_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+latitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+long_lat
+
+ +
+
+longitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+lot_number
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+measure_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+measures
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+classmethod merge_relationships(merged_state, state1, state2)
+

Merge together the old relationships with the new.

+
+
Parameters:
+
    +
  • merged_state – empty state to fill with merged state

  • +
  • state1*State

  • +
  • state2*State - given priority over state1

  • +
+
+
+
+ +
+
+merge_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+normalized_address
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+occupied_floor_area
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+occupied_floor_area_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+owner
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_address
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_city_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_email
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_postal_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_telephone
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+parent_state1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+parent_state2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+pm_parent_property_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+pm_property_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+postal_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+promote(cycle, property_id=None)
+

Promote the PropertyState to the view table for the given cycle

+
+
Args:

cycle: Cycle to assign the view +property_id: Optional ID of a canonical property model object +to retain instead of creating a new property

+
+
Returns:

The resulting PropertyView (note that it is not returning the +PropertyState)

+
+
+
+ +
+
+property_footprint
+
+ +
+
+property_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property_notes
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property_timezone
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+propertyauditlog_state
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertymeasure_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+recent_sale_date
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+release_date
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+save(*args, **kwargs)
+

Save the current instance. Override this in a subclass if you want to +control the saving process.

+

The ‘force_insert’ and ‘force_update’ parameters can be used to insist +that the “save” must be an SQL insert or update (or equivalent for +non-SQL backends), respectively. Normally, they should not be set.

+
+ +
+
+scenarios
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+simulation
+

Accessor to the related object on the reverse side of a one-to-one +relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Place.restaurant is a ReverseOneToOneDescriptor instance.

+
+ +
+
+site_eui
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_modeled
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_modeled_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_weather_normalized
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_weather_normalized_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_modeled
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_modeled_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_weather_normalized
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_weather_normalized_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+space_alerts
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+to_dict(fields=None, include_related_data=True)
+

Returns a dict version of the PropertyState, either with all fields +or masked to just those requested.

+
+ +
+
+total_ghg_emissions
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+total_ghg_emissions_intensity
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+total_marginal_ghg_emissions
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+total_marginal_ghg_emissions_intensity
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+ubid
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+ubidmodel_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+use_description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+year_built
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+year_ending
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+class seed.models.properties.PropertyView(*args, **kwargs)
+

Bases: Model

+

Similar to the old world of canonical building.

+

A PropertyView contains a reference to a property (which should not change) and to a +cycle (time period), and a state (characteristics).

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+cycle
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+cycle_id
+
+ +
+
+gapauditlog_view
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+greenassessmentproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property import_filename
+

Get the import file name form the audit logs

+
+ +
+
+initialize_audit_logs(**kwargs)
+
+ +
+
+labels
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+notes
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+property
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+property_id
+
+ +
+
+propertyauditlog_view
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+tax_lot_states()
+

Return a list of TaxLotStates associated with this PropertyView and Cycle

+
+
Returns:
+

list of TaxLotStates

+
+
+
+ +
+
+tax_lot_views()
+

Return a list of TaxLotViews that are associated with this PropertyView and Cycle

+
+
Returns:
+

list of TaxLotViews

+
+
+
+ +
+
+taxlotproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+seed.models.properties.post_save_property_state(sender, **kwargs)
+

Generate UbidModels for a PropertyState if the ubid field is present

+
+ +
+
+seed.models.properties.post_save_property_view(sender, **kwargs)
+

When changing/saving the PropertyView, go ahead and touch the Property (if linked) so that the +record receives an updated datetime

+
+ +
+
+seed.models.properties.pre_delete_state(sender, **kwargs)
+
+ +
+
+seed.models.properties.sync_latitude_longitude_and_long_lat(sender, instance, **kwargs)
+
+ +
+
+

TaxLots

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.models.tax_lots.TaxLot(id, organization, created, updated)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+views
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.tax_lots.TaxLotAuditLog(id, organization, parent1, parent2, parent_state1, parent_state2, state, view, name, description, import_filename, record_type, created)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_record_type_display(*, field=<django.db.models.fields.IntegerField: record_type>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_filename
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+parent1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent1_id
+
+ +
+
+parent2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent2_id
+
+ +
+
+parent_state1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state1_id
+
+ +
+
+parent_state2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state2_id
+
+ +
+
+record_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+taxlotauditlog_parent1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotauditlog_parent2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+view
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+view_id
+
+ +
+ +
+
+class seed.models.tax_lots.TaxLotState(id, import_file, organization, data_state, merge_state, custom_id_1, jurisdiction_tax_lot_id, block_number, district, address_line_1, address_line_2, normalized_address, city, state, postal_code, number_properties, extra_data, hash_object, latitude, longitude, long_lat, centroid, bounding_box, taxlot_footprint, ubid, geocoding_confidence, created, updated)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+address_line_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+address_line_2
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+block_number
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+bounding_box
+
+ +
+
+centroid
+
+ +
+
+city
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+classmethod coparent(state_id)
+

Return the coparent of the TaxLotState. This will query the TaxLotAuditLog table to +determine if there is a coparent and return it if it is found. The state_id needs to be +the base ID of when the original record was imported

+
+
Parameters:
+

state_id – integer, state id to find coparent.

+
+
Returns:
+

dict

+
+
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+custom_id_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+district
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+extra_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+geocoding_confidence
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_data_state_display(*, field=<django.db.models.fields.IntegerField: data_state>)
+
+ +
+
+get_merge_state_display(*, field=<django.db.models.fields.IntegerField: merge_state>)
+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+hash_object
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+history()
+

Return the history of the taxlot state by parsing through the auditlog. Returns only the ids +of the parent states and some descriptions.

+
+
+

main

+
+

/ / parent1 parent2

+
+

In the records, parent2 is most recent, so make sure to navigate parent two first since we +are returning the data in reverse over (that is most recent changes first)

+
+
Returns:
+

list, history as a list, and the main record

+
+
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_file
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+import_file_id
+
+ +
+
+jurisdiction_tax_lot_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+latitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+long_lat
+
+ +
+
+longitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+classmethod merge_relationships(merged_state, state1, state2)
+

Stub to implement if merging TaxLotState relationships is needed

+
+ +
+
+merge_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+normalized_address
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+number_properties
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+postal_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+promote(cycle)
+

Promote the TaxLotState to the view table for the given cycle

+
+
Args:

cycle: Cycle to assign the view

+
+
Returns:

The resulting TaxLotView (note that it is not returning the +TaxLotState)

+
+
+
+ +
+
+save(*args, **kwargs)
+

Save the current instance. Override this in a subclass if you want to +control the saving process.

+

The ‘force_insert’ and ‘force_update’ parameters can be used to insist +that the “save” must be an SQL insert or update (or equivalent for +non-SQL backends), respectively. Normally, they should not be set.

+
+ +
+
+state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+taxlot_footprint
+
+ +
+
+taxlotauditlog_parent_state1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotauditlog_parent_state2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotauditlog_state
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+to_dict(fields=None, include_related_data=True)
+

Returns a dict version of the TaxLotState, either with all fields +or masked to just those requested.

+
+ +
+
+ubid
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+ubidmodel_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+class seed.models.tax_lots.TaxLotView(id, taxlot, state, cycle)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+cycle
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+cycle_id
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property import_filename
+

Get the import file name form the audit logs

+
+ +
+
+initialize_audit_logs(**kwargs)
+
+ +
+
+labels
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+notes
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+property_states()
+

Return a list of PropertyStates associated with this TaxLotView and Cycle

+
+
Returns:
+

list of PropertyStates

+
+
+
+ +
+
+property_views()
+

Return a list of PropertyViews that are associated with this TaxLotView and Cycle

+
+
Returns:
+

list of PropertyViews

+
+
+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+taxlot
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+taxlot_id
+
+ +
+
+taxlotauditlog_view
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+seed.models.tax_lots.post_save_taxlot_state(sender, **kwargs)
+

Generate UbidModels for a TaxLotState if the ubid field is present

+
+ +
+
+seed.models.tax_lots.post_save_taxlot_view(sender, **kwargs)
+

When changing/saving the TaxLotView, go ahead and touch the TaxLot (if linked) so that the record +receives an updated datetime

+
+ +
+
+seed.models.tax_lots.sync_latitude_longitude_and_long_lat(sender, instance, **kwargs)
+
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.public.html b/docs/code_documentation/2.22.0/modules/seed.public.html new file mode 100644 index 00000000..461b37d8 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.public.html @@ -0,0 +1,159 @@ + + + + + + + Public Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Public Package

+
+

Submodules

+
+
+

Models

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.serializers.html b/docs/code_documentation/2.22.0/modules/seed.serializers.html new file mode 100644 index 00000000..e252315b --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.serializers.html @@ -0,0 +1,254 @@ + + + + + + + Serializers Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Serializers Package

+
+

Submodules

+
+
+

Serializers

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.serializers.celery.CeleryDatetimeSerializer(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)
+

Bases: JSONEncoder

+
+
+default(obj)
+

Implement this method in a subclass such that it returns +a serializable object for o, or calls the base implementation +(to raise a TypeError).

+

For example, to support arbitrary iterators, you could +implement default like this:

+
def default(self, o):
+    try:
+        iterable = iter(o)
+    except TypeError:
+        pass
+    else:
+        return list(iterable)
+    # Let the base class default method raise the TypeError
+    return JSONEncoder.default(self, o)
+
+
+
+ +
+
+static seed_decoder(obj)
+
+ +
+
+static seed_dumps(obj)
+
+ +
+
+static seed_loads(obj)
+
+ +
+ +
+
+

Labels

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.serializers.labels.LabelSerializer(*args, **kwargs)
+

Bases: ModelSerializer

+
+
+class Meta
+

Bases: object

+
+
+extra_kwargs = {'super_organization': {'write_only': True}}
+
+ +
+
+fields = ('id', 'name', 'color', 'organization_id', 'super_organization', 'is_applied', 'show_in_list')
+
+ +
+
+model
+

alias of StatusLabel

+
+ +
+ +
+
+get_is_applied(obj)
+
+ +
+
+to_representation(instance)
+

Object instance -> Dict of primitive datatypes.

+
+ +
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.templatetags.html b/docs/code_documentation/2.22.0/modules/seed.templatetags.html new file mode 100644 index 00000000..cbb00b01 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.templatetags.html @@ -0,0 +1,277 @@ + + + + + + + Templatetags Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Templatetags Package

+
+

Submodules

+
+
+

Breadcrumbs

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+

breadcrumbs.py, https://bitbucket.org/Mathiasdm/django-simple-breadcrumbs/

+
+
+class seed.templatetags.breadcrumbs.BreadcrumbNode(vars, render_func=<function create_crumb>)
+

Bases: Node

+
+
+render(context)
+

Return the node rendered as a string.

+
+ +
+ +
+
+class seed.templatetags.breadcrumbs.UrlBreadcrumbNode(title, url_node, render_func=<function create_crumb>)
+

Bases: Node

+
+
+render(context)
+

Return the node rendered as a string.

+
+ +
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb(parser, token)
+

Section author: Andriy Drozdyuk

+

Renders the breadcrumb.

+

Example:

+
{% breadcrumb "Title of breadcrumb" url_var %}
+{% breadcrumb context_var  url_var %}
+{% breadcrumb "Just the title" %}
+{% breadcrumb just_context_var %}
+
+
+

Parameters:

+
First parameter is the title of the crumb
+Second (optional) parameter is the url variable to link to, produced by url tag, i.e.:
+    {% url "person_detail" object.id as person_url %}
+    then:
+    {% breadcrumb person.name person_url %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb_root(parser, token)
+

Section author: Andriy Drozdyuk

+

Renders the breadcrumb.

+

Examples:

+
{% breadcrumb "Title of breadcrumb" url_var %}
+{% breadcrumb context_var  url_var %}
+{% breadcrumb "Just the title" %}
+{% breadcrumb just_context_var %}
+
+
+

Parameters:

+
First parameter is the title of the crumb,
+Second (optional) parameter is the url variable to link to, produced by url tag, i.e.:
+    {% url "person_detail/" object.id as person_url %}
+    then:
+    {% breadcrumb person.name person_url %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb_url(parser, token)
+

Same as breadcrumb but instead of url context variable takes in all the +arguments URL tag takes.

+
{% breadcrumb "Title of breadcrumb" person_detail person.id %}
+{% breadcrumb person.name person_detail person.id %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb_url_root(parser, token)
+

Same as breadcrumb but instead of url context variable takes in all the +arguments URL tag takes.

+
{% breadcrumb "Title of breadcrumb" person_detail person.id %}
+{% breadcrumb person.name person_detail person.id %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.create_crumb(title, url=None)
+

Helper function

+
+ +
+
+seed.templatetags.breadcrumbs.create_crumb_first(title, url=None)
+

Helper function

+
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.test_helpers.factory.html b/docs/code_documentation/2.22.0/modules/seed.test_helpers.factory.html new file mode 100644 index 00000000..1f411dc3 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.test_helpers.factory.html @@ -0,0 +1,298 @@ + + + + + + + Test Helper Factor Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Test Helper Factor Package

+
+

Subpackages

+ +
+
+

Submodules

+
+
+

Helpers

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.test_helpers.factory.helpers.DjangoFunctionalFactory
+

Bases: object

+
+
+classmethod invalid_test_cc_number()
+
+ +
+
+classmethod rand_bool()
+
+ +
+
+classmethod rand_city()
+
+ +
+
+classmethod rand_city_suffix()
+
+ +
+
+classmethod rand_currency(start=0, end=100)
+
+ +
+
+classmethod rand_date(start_year=1900, end_year=2011)
+
+ +
+
+classmethod rand_domain()
+
+ +
+
+classmethod rand_email()
+
+ +
+
+classmethod rand_float(start=0, end=100)
+
+ +
+
+classmethod rand_int(start=0, end=100)
+
+ +
+
+classmethod rand_name()
+
+ +
+
+classmethod rand_phone()
+
+ +
+
+classmethod rand_plant_name()
+
+ +
+
+classmethod rand_str(length=None)
+
+ +
+
+classmethod rand_street_address()
+
+ +
+
+classmethod rand_street_suffix()
+
+ +
+
+classmethod test_cc_number(valid=True)
+
+ +
+
+classmethod valid_test_cc_number()
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.test_helpers.factory.lib.html b/docs/code_documentation/2.22.0/modules/seed.test_helpers.factory.lib.html new file mode 100644 index 00000000..4c3e19f0 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.test_helpers.factory.lib.html @@ -0,0 +1,189 @@ + + + + + + + Test Helper Factory Lib Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.test_helpers.html b/docs/code_documentation/2.22.0/modules/seed.test_helpers.html new file mode 100644 index 00000000..5ad8e419 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.test_helpers.html @@ -0,0 +1,229 @@ + + + + + + + Test Helpers Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.tests.functional.html b/docs/code_documentation/2.22.0/modules/seed.tests.functional.html new file mode 100644 index 00000000..9ae07d25 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.tests.functional.html @@ -0,0 +1,194 @@ + + + + + + + Tests (Functional) Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.tests.html b/docs/code_documentation/2.22.0/modules/seed.tests.html new file mode 100644 index 00000000..62aaaa06 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.tests.html @@ -0,0 +1,878 @@ + + + + + + + Tests Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tests Package

+
+

Submodules

+ +
+
+

Admin Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.tests.test_admin_views.AdminViewsTest(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_add_org()
+

Happy path test for creating a new org.

+
+ +
+
+test_add_org_dupe()
+

Trying to create an org with a dupe name fails.

+
+ +
+
+test_add_user_existing_org()
+

Test creating a new user, adding them to an existing org +in the process.

+
+ +
+
+test_add_user_new_org()
+

Create a new user and a new org at the same time.

+
+ +
+
+test_add_user_no_org()
+

Should not be able to create a new user without either +selecting or creating an org at the same time.

+
+ +
+
+test_signup_process()
+

Simulates the entire new user signup process, from initial +account creation by an admin to receiving the signup email +to confirming the account and setting a password.

+
+ +
+
+test_signup_process_force_lowercase_email()
+

Simulates the signup and login forcing login username to lowercase

+
+ +
+ +
+
+

Decorators

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.tests.test_decorators.ClassDecoratorTests(methodName='runTest')
+

Bases: TestCase

+
+
+test_ajax_request_class_dict()
+
+ +
+
+test_ajax_request_class_dict_status_error()
+
+ +
+
+test_ajax_request_class_dict_status_false()
+
+ +
+
+test_ajax_request_class_format_type()
+
+ +
+
+test_require_organization_id_class_no_org_id()
+
+ +
+
+test_require_organization_id_class_org_id()
+
+ +
+
+test_require_organization_id_class_org_id_not_int()
+
+ +
+ +
+
+class seed.tests.test_decorators.RequireOrganizationIDTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_require_organization_id_fail_no_key()
+
+ +
+
+test_require_organization_id_fail_not_numeric()
+
+ +
+
+test_require_organization_id_success_integer()
+
+ +
+
+test_require_organization_id_success_string()
+
+ +
+ +
+
+class seed.tests.test_decorators.TestDecorators(methodName='runTest')
+

Bases: TestCase

+

Tests for locking tasks and reporting progress.

+
+
+locked = 1
+
+ +
+
+pk = 34
+
+ +
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_get_prog_key()
+

We format our cache key properly.

+
+ +
+
+test_increment_cache()
+

Sum our progress by increments properly.

+
+ +
+
+test_locking()
+

Make sure we indicate we’re locked if and only if we’re inside the function.

+
+ +
+
+test_locking_w_exception()
+

Make sure we release our lock if we have had an exception.

+
+ +
+
+test_progress()
+

When a task finishes, it increments the progress counter properly.

+
+ +
+
+unlocked = 0
+
+ +
+ +
+
+exception seed.tests.test_decorators.TestException
+

Bases: Exception

+
+ +
+
+

Exporters

+
+
+

Models

+
+
+

Tasks

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.tests.test_tasks.TestTasks(methodName='runTest')
+

Bases: TestCase

+

Tests for dealing with SEED related tasks.

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_delete_organization()
+
+ +
+ +
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.tests.test_views.GetDatasetsViewsTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_delete_dataset()
+
+ +
+
+test_get_dataset()
+
+ +
+
+test_get_datasets()
+
+ +
+
+test_get_datasets_count()
+
+ +
+
+test_get_datasets_count_invalid()
+
+ +
+
+test_update_dataset()
+
+ +
+ +
+
+class seed.tests.test_views.ImportFileViewsTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_delete_file()
+
+ +
+
+test_get_import_file()
+
+ +
+
+test_get_matching_and_geocoding_results()
+
+ +
+ +
+
+class seed.tests.test_views.InventoryViewTests(methodName='runTest')
+

Bases: AssertDictSubsetMixin, DeleteModelsTestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_get_cycles()
+
+ +
+
+test_get_properties()
+
+ +
+
+test_get_properties_cycle_id()
+
+ +
+
+test_get_properties_empty_page()
+
+ +
+
+test_get_properties_page_not_an_integer()
+
+ +
+
+test_get_properties_pint_fields()
+
+ +
+
+test_get_properties_profile_id()
+
+ +
+
+test_get_properties_property_extra_data()
+
+ +
+
+test_get_properties_select_all()
+
+ +
+
+test_get_properties_taxlot_extra_data()
+
+ +
+
+test_get_properties_with_taxlots()
+
+ +
+
+test_get_properties_with_taxlots_with_footprints()
+
+ +
+
+test_get_properties_wrong_query_params()
+
+ +
+
+test_get_property()
+
+ +
+
+test_get_property_columns()
+
+ +
+
+test_get_property_multiple_taxlots()
+
+ +
+
+test_get_taxlot()
+
+ +
+
+test_get_taxlot_columns()
+
+ +
+
+test_get_taxlots()
+
+ +
+
+test_get_taxlots_empty_page()
+
+ +
+
+test_get_taxlots_extra_data()
+
+ +
+
+test_get_taxlots_multiple_taxlots()
+
+ +
+
+test_get_taxlots_no_cycle_id()
+
+ +
+
+test_get_taxlots_page_not_an_integer()
+
+ +
+
+test_get_taxlots_profile_id()
+
+ +
+
+test_postoffice()
+
+ +
+
+test_update_pint_fields_with_modified_display_settings()
+
+ +
+ +
+
+class seed.tests.test_views.MainViewTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_home()
+
+ +
+ +
+
+class seed.tests.test_views.TestMCMViews(methodName='runTest')
+

Bases: TestCase

+
+
+assert_expected_mappings(actual, expected)
+

For each k,v pair of form column_name: [dest_col, confidence] +in actual, assert that expected contains the same column_name +and dest_col mapping.

+
+ +
+
+expected_mappings = {'address': ['owner_address', 70], 'building id': ['Building air leakage', 64], 'name': ['Name of Audit Certification Holder', 47], 'year built': ['year_built', 50]}
+
+ +
+
+raw_columns_expected = {'raw_columns': ['name', 'address', 'year built', 'building id'], 'status': 'success'}
+
+ +
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_create_dataset()
+

tests the create_dataset view, allows duplicate dataset names

+
+ +
+
+test_get_column_mapping_suggestions()
+
+ +
+
+test_get_column_mapping_suggestions_pm_file()
+
+ +
+
+test_get_column_mapping_suggestions_with_columns()
+
+ +
+
+test_get_raw_column_names()
+

Good case for get_raw_column_names.

+
+ +
+
+test_progress()
+

Make sure we retrieve data from cache properly.

+
+ +
+
+test_save_column_mappings()
+
+ +
+
+test_save_column_mappings_idempotent()
+

We need to make successive calls to save_column_mappings.

+
+ +
+ +
+
+

Tests

+
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.tests.util.AssertDictSubsetMixin
+

Bases: object

+
+
+assertDictContainsSubset(subset, dictionary)
+

Checks whether dictionary is a superset of subset

+

This is a necessary polyfill b/c assertDictContainsSubset was deprecated +and I believe it’s much more readable compared to the implementation below

+
+ +
+ +
+
+class seed.tests.util.DataMappingBaseTestCase(methodName='runTest')
+

Bases: DeleteModelsTestCase

+

Base Test Case Class to handle data import

+
+
+create_import_file(user, org, cycle, source_type=0, data_state=1)
+
+ +
+
+set_up(import_file_source_type, user_name='test_user@demo.com', user_password='test_pass')
+
+ +
+ +
+
+class seed.tests.util.DeleteModelsTestCase(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+tearDown()
+

Hook method for deconstructing the test fixture after testing it.

+
+ +
+ +
+
+class seed.tests.util.FakeClient
+

Bases: object

+

An extremely light-weight test client.

+
+
+get(view_func, data, headers=None, **kwargs)
+
+ +
+
+post(view_func, data, headers=None, **kwargs)
+
+ +
+ +
+
+class seed.tests.util.FakeRequest(data=None, headers=None, user=None, method='POST', **kwargs)
+

Bases: object

+

A simple request stub.

+
+
+GET = {}
+
+ +
+
+META = {'REMOTE_ADDR': '127.0.0.1'}
+
+ +
+
+POST = {}
+
+ +
+
+body = None
+
+ +
+
+path = 'fake_login_path'
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.urls.html b/docs/code_documentation/2.22.0/modules/seed.urls.html new file mode 100644 index 00000000..65309d06 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.urls.html @@ -0,0 +1,161 @@ + + + + + + + URLs Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

URLs Package

+
+

Submodules

+
+
+

Accounts

+
+
+

APIs

+
+
+

Main

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.utils.html b/docs/code_documentation/2.22.0/modules/seed.utils.html new file mode 100644 index 00000000..6cfc7922 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.utils.html @@ -0,0 +1,555 @@ + + + + + + + Utilities Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Utilities Package

+
+

Submodules

+
+
+

APIs

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+class seed.utils.api.APIBypassCSRFMiddleware(get_response)
+

Bases: object

+

This middleware turns off CSRF protection for API clients.

+

It must come before CsrfViewMiddleware in settings.MIDDLEWARE.

+
+ +
+
+class seed.utils.api.OrgCreateMixin
+

Bases: OrgMixin

+

Mixin to add organization when creating model instance

+
+
+perform_create(serializer)
+

Override to add org

+
+ +
+ +
+
+class seed.utils.api.OrgCreateUpdateMixin
+

Bases: OrgCreateMixin, OrgUpdateMixin

+

Mixin to add organization when creating/updating model instance

+
+ +
+
+class seed.utils.api.OrgMixin
+

Bases: object

+

Provides get_organization and get_parent_org method

+
+
+get_organization(request, return_obj=False)
+

Get org from query param or request.user.

+
+
Parameters:
+
    +
  • request – request object.

  • +
  • return_obj – bool. Set to True if obj vs pk is desired.

  • +
+
+
Returns:
+

int representing a valid organization pk or organization object.

+
+
+
+ +
+
+get_parent_org(request)
+

Gets parent organization of org from query param or request. +:param request: Request object. +:return: organization object.

+
+ +
+ +
+
+class seed.utils.api.OrgQuerySetMixin
+

Bases: OrgMixin

+

Mixin proving a get_queryset method that filters on organization.

+

In order to use this mixin you must specify the model attributes on the +View[Set] class. By default it assumes there is an organization field +on the model. You can override this by setting the orgfilter attribute +to the appropriate fieldname. This also allows nested fields e.g. +foreign_key.organization +By default this retrieves organization from query string param OR the +default_organization or first returned organization of the logged in user. +You can force it to return the appropriate “parent” organization by setting +the force_parent attribute to True.

+
+
+get_queryset()
+

“get_queryset filtered on organization

+
+ +
+ +
+
+class seed.utils.api.OrgUpdateMixin
+

Bases: OrgMixin

+

Mixin to add organization when updating model instance

+
+
+perform_update(serializer)
+

Override to add org

+
+ +
+ +
+
+class seed.utils.api.OrgValidateMixin
+

Bases: object

+

Mixin to provide a validate() method organization to ensure users belongs +to the same org as the instance referenced by a foreign key..

+

You must set org_validators on the Serializer that uses this Mixin. +This is a list of OrgValidator named tuples (where key is the key +on request data representing the foreign key, and field the foreign key +that represents the organization on the corresponding model.

+

my_validator = OrgValidator(key=’foreign_key, field=’organization_id’)

+

..example:

+
+
+
class MySerializer(OrgValidateMixin, serializers.ModelSerializer):
+
foreign_key= serializers.PrimaryKeyRelatedField(

query_set=MyModel.objects.all()

+
+
+

) +org_validators = [my_validator]

+
+
+
+

This ensures request.user belongs to the org MyModel.organization

+

You can traverse foreign key relationships by using a double underscore +in validator.field

+

In the example above setting validator field to be ‘property__org_id’ +is equivalent to MyModel.property.org_id

+

If you use this Mixin and write a validate method, you must call super +to ensure validation takes place.

+
+
+validate(data)
+

Object level validation. +Checks for self.org_validators on Serializers and +ensures users belongs to org corresponding to the foreign key +being set.

+
+ +
+
+validate_org(instance, user, validator)
+

Raise error if orgs do not match. +:param instance: value in request.data.get(key) to check against +:type instance: model instance +:param: org_id of user, from get_org_id(request) +:type org_id: int +:param validator: validator to user +:type: OrgValidator named tuple

+
+ +
+ +
+
+class seed.utils.api.OrgValidator(key, field)
+

Bases: tuple

+
+
+field
+

Alias for field number 1

+
+ +
+
+key
+

Alias for field number 0

+
+ +
+ +
+
+class seed.utils.api.ProfileIdMixin
+

Bases: object

+

Provides methods to get the columns to show based on a profile ID

+
+
+get_show_columns(org_id, profile_id)
+

Get list of columns from the profile_id. The result will be in the form of

+
+
show_columns = {

‘fields’: [‘field_1’, ‘field_2’, …] +‘extra_data’: [‘extra_data_field_1’, ‘extra_data_field_2’, …]

+
+
+

}

+
+
Parameters:
+
    +
  • org_id – str, id of organization

  • +
  • profile_id – str, id of profile to retrieve

  • +
+
+
Returns:
+

dist of lists

+
+
+
+ +
+ +
+
+seed.utils.api.api_endpoint(fn)
+

Decorator function to mark a view as allowed to authenticate via API key.

+

Decorator must be used before login_required or has_perm to set +request.user for those decorators.

+
+ +
+
+seed.utils.api.api_endpoint_class(fn)
+

Decorator function to mark a view as allowed to authenticate via API key.

+

Decorator must be used before login_required or has_perm to set +request.user for those decorators.

+
+ +
+
+seed.utils.api.clean_api_regex(url)
+

Given a django-style url regex pattern, strip it down to a human-readable +url.

+

TODO: If pks ever appear in the url, this will need to account for that.

+
+ +
+
+seed.utils.api.drf_api_endpoint(fn)
+

Decorator to register a Django Rest Framework view with the list of API +endpoints. Marks it with is_api_endpoint = True as well as appending it +to the global endpoints list.

+
+ +
+
+seed.utils.api.format_api_docstring(docstring)
+

Cleans up a python method docstring for human consumption.

+
+ +
+
+seed.utils.api.get_all_urls(urllist, prefix='')
+

Recursive generator that traverses entire tree of URLs, starting with +urllist, yielding a tuple of (url_pattern, view_function) for each +one.

+
+ +
+
+seed.utils.api.get_api_endpoints()
+

Examines all views and returns those with is_api_endpoint set +to true (done by the @api_endpoint decorator).

+
+ +
+
+seed.utils.api.get_api_request_user(request)
+

Determines if this is an API request and returns the corresponding user if so.

+
+ +
+
+seed.utils.api.get_org_id_from_validator(instance, field)
+

For querysets Django enables you to do things like:

+

note double underscore. However you can’t do:

+

This presents an issue as getattr only works 1 level deep:

+
+

getattr(obj, ‘org.id’) does not work either.

+
+

This can be worked around using rgetattr (above). +This functions mimics getattr(obj, ‘org__id’) by +splitting field on __ and calling rgetattr on the result.

+
+ +
+
+seed.utils.api.rgetattr(obj, lst)
+

This enables recursive getattr look ups. +given obj, [‘a’, ‘b’, ‘c’] as params it will look up: +obj.a, a.b, b.c returning b.c unless one of the previous +values was None, in which case it returns None immediately.

+
+
Parameters:
+
    +
  • obj (object) – initial object to examine

  • +
  • lst (list) – list of successive attributes to look up

  • +
+
+
+
+ +
+
+

Buildings

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+seed.utils.buildings.get_source_type(import_file, source_type='')
+

Used for converting ImportFile source_type into an int.

+
+ +
+
+

Organizations

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+seed.utils.organizations.create_organization(user=None, org_name='', *args, **kwargs)
+

Helper script to create a user/org relationship from scratch. This is heavily used and +creates the default labels, columns, and data quality rules when a new organization is created

+
+
Parameters:
+
    +
  • user – user inst.

  • +
  • org_name – str, name of Organization we’d like to create.

  • +
  • kwargs ((optional)) – ‘role’, int; ‘status’, str.

  • +
+
+
+
+ +
+
+seed.utils.organizations.create_suborganization(user, current_org, suborg_name='', user_role=10)
+
+ +
+
+seed.utils.organizations.default_pm_mappings()
+
+ +
+
+

Time

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+seed.utils.time.convert_datestr(datestr, make_tz_aware=False)
+

Converts dates like 12/31/2010 into datetime objects. Dates are returned in UTC time

+

TODO: reconcile this with seed/lib/mcm/cleaners.py#L85-L85

+
+
Parameters:
+
    +
  • datestr – string, value to convert

  • +
  • make_tz_aware – bool, if set to true, then will convert the timezone into UTC time

  • +
+
+
Returns:
+

datetime or None

+
+
+
+ +
+
+seed.utils.time.convert_to_js_timestamp(timestamp)
+

converts a django/python datetime object to milliseconds since epoch

+
+ +
+
+seed.utils.time.parse_datetime(maybe_datetime)
+

Process a datetime value that may be None, timestamp, strftime.

+
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/modules/seed.views.html b/docs/code_documentation/2.22.0/modules/seed.views.html new file mode 100644 index 00000000..58c24cc6 --- /dev/null +++ b/docs/code_documentation/2.22.0/modules/seed.views.html @@ -0,0 +1,232 @@ + + + + + + + Views Package — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Views Package

+
+

Submodules

+
+
+

Accounts

+
+
+

APIs

+
+
+

Main

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+seed.views.main.angular_js_tests(request)
+

Jasmine JS unit test code covering AngularJS unit tests

+
+ +
+
+seed.views.main.celery_queue(self, request, *args, **kwargs)
+

Returns the number of running and queued celery tasks. This action can only be performed by superusers

+

Returns:

+
{
+    'active': {'total': n, 'tasks': []}, // Tasks that are currently being executed
+    'reserved': {'total': n, 'tasks': []}, // Tasks waiting to be executed
+    'scheduled': {'total': n, 'tasks': []}, // Tasks reserved by the worker when they have an eta or countdown
+    'maxConcurrency': The maximum number of active tasks
+}
+
+
+
+ +
+
+seed.views.main.error404(request, exception)
+
+ +
+
+seed.views.main.error410(request)
+
+ +
+
+seed.views.main.error500(request)
+
+ +
+
+seed.views.main.health_check(request)
+

Perform a health check without requiring authentication

+
+ +
+
+seed.views.main.home(request)
+

the main view for the app +Sets in the context for the django template:

+
    +
  • app_urls: a json object of all the URLs that is loaded in the JS global namespace

  • +
  • username: the request user’s username (first and last name)

  • +
+
+ +
+
+seed.views.main.version(self, request, *args, **kwargs)
+

Returns the SEED version and current git sha

+
+ +
+
+

Meters

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/seed-platform/seed/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/objects.inv b/docs/code_documentation/2.22.0/objects.inv new file mode 100644 index 00000000..4a0a626f Binary files /dev/null and b/docs/code_documentation/2.22.0/objects.inv differ diff --git a/docs/code_documentation/2.22.0/py-modindex.html b/docs/code_documentation/2.22.0/py-modindex.html new file mode 100644 index 00000000..6887f2e7 --- /dev/null +++ b/docs/code_documentation/2.22.0/py-modindex.html @@ -0,0 +1,413 @@ + + + + + + Python Module Index — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ c | + s +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ c
+ config +
    + config.template_context +
    + config.tests +
    + config.utils +
    + config.views +
    + config.wsgi +
 
+ s
+ seed +
    + seed.data_importer +
    + seed.data_importer.managers +
    + seed.data_importer.utils +
    + seed.decorators +
    + seed.landing +
    + seed.landing.forms +
    + seed.landing.management +
    + seed.landing.management.commands +
    + seed.landing.management.commands.update_eula +
    + seed.landing.models +
    + seed.landing.tests +
    + seed.landing.urls +
    + seed.landing.views +
    + seed.lib +
    + seed.lib.mappings +
    + seed.lib.mappings.mapper +
    + seed.lib.mappings.mapping_columns +
    + seed.lib.merging +
    + seed.lib.merging.merging +
    + seed.management +
    + seed.models +
    + seed.models.auditlog +
    + seed.models.columns +
    + seed.models.cycles +
    + seed.models.data_quality +
    + seed.models.models +
    + seed.models.properties +
    + seed.models.tax_lots +
    + seed.public +
    + seed.search +
    + seed.serializers +
    + seed.serializers.celery +
    + seed.serializers.labels +
    + seed.tasks +
    + seed.templatetags.breadcrumbs +
    + seed.test_helpers +
    + seed.test_helpers.factory.helpers +
    + seed.tests.test_admin_views +
    + seed.tests.test_decorators +
    + seed.tests.test_tasks +
    + seed.tests.test_views +
    + seed.tests.util +
    + seed.token_generators +
    + seed.utils +
    + seed.utils.api +
    + seed.utils.buildings +
    + seed.utils.organizations +
    + seed.utils.time +
    + seed.views +
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/search.html b/docs/code_documentation/2.22.0/search.html new file mode 100644 index 00000000..6df2ad98 --- /dev/null +++ b/docs/code_documentation/2.22.0/search.html @@ -0,0 +1,133 @@ + + + + + + Search — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/searchindex.js b/docs/code_documentation/2.22.0/searchindex.js new file mode 100644 index 00000000..52b0ffb3 --- /dev/null +++ b/docs/code_documentation/2.22.0/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "aws", "data_model", "data_quality", "deployment", "developer_resources", "docker", "faq", "getting_started", "help", "index", "kubernetes_deployment", "license", "linux", "mapping", "matching", "migrations", "modules", "modules/config", "modules/seed", "modules/seed.cleansing", "modules/seed.data", "modules/seed.data_importer", "modules/seed.features", "modules/seed.landing", "modules/seed.landing.management", "modules/seed.landing.management.commands", "modules/seed.lib", "modules/seed.lib.mappings", "modules/seed.lib.merging", "modules/seed.management", "modules/seed.managers", "modules/seed.managers.tests", "modules/seed.mappings", "modules/seed.models", "modules/seed.public", "modules/seed.serializers", "modules/seed.templatetags", "modules/seed.test_helpers", "modules/seed.test_helpers.factory", "modules/seed.test_helpers.factory.lib", "modules/seed.tests", "modules/seed.tests.functional", "modules/seed.urls", "modules/seed.utils", "modules/seed.views", "setup_docker", "setup_osx", "translation"], "filenames": ["api.rst", "aws.rst", "data_model.rst", "data_quality.rst", "deployment.rst", "developer_resources.rst", "docker.rst", "faq.rst", "getting_started.rst", "help.rst", "index.rst", "kubernetes_deployment.rst", "license.rst", "linux.rst", "mapping.rst", "matching.rst", "migrations.rst", "modules.rst", "modules/config.rst", "modules/seed.rst", "modules/seed.cleansing.rst", "modules/seed.data.rst", "modules/seed.data_importer.rst", "modules/seed.features.rst", "modules/seed.landing.rst", "modules/seed.landing.management.rst", "modules/seed.landing.management.commands.rst", "modules/seed.lib.rst", "modules/seed.lib.mappings.rst", "modules/seed.lib.merging.rst", "modules/seed.management.rst", "modules/seed.managers.rst", "modules/seed.managers.tests.rst", "modules/seed.mappings.rst", "modules/seed.models.rst", "modules/seed.public.rst", "modules/seed.serializers.rst", "modules/seed.templatetags.rst", "modules/seed.test_helpers.rst", "modules/seed.test_helpers.factory.rst", "modules/seed.test_helpers.factory.lib.rst", "modules/seed.tests.rst", "modules/seed.tests.functional.rst", "modules/seed.urls.rst", "modules/seed.utils.rst", "modules/seed.views.rst", "setup_docker.rst", "setup_osx.rst", "translation.rst"], "titles": ["API", "AWS Setup", "Data Model", "Data Quality", "Deployment Guide", "Developer Resources", "Docker Deployment on AWS", "Frequently Asked Questions", "Getting Started", "Help", "Standard Energy Efficiency Data (SEED) Platform", "Kubernetes Deployment Guide with Helm", "License", "General Linux Setup", "Mapping", "Matching", "Migrations", "Modules", "Configuration", "SEED Package", "Data Quality Package", "Data Package", "Data Importer Package", "Features Package", "Landing Package", "seed.landing.management package", "Landing Management Package", "Library Packages", "seed.lib.mappings package", "seed.lib.merging package", "Management Package", "Managers Package", "Manager Tests Package", "Mapping Package", "Models", "Public Package", "Serializers Package", "Templatetags Package", "Test Helpers Package", "Test Helper Factor Package", "Test Helper Factory Lib Package", "Tests Package", "Tests (Functional) Package", "URLs Package", "Utilities Package", "Views Package", "Installation using Docker", "Installation on OSX", "Translating SEED"], "terms": {"i": [0, 1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 16, 19, 20, 22, 24, 28, 34, 37, 41, 44, 45, 46, 47, 48], "handl": [0, 2, 4, 5, 16, 24, 25, 26, 28, 41], "via": [0, 5, 15, 18, 20, 24, 34, 44], "an": [0, 1, 2, 3, 5, 6, 7, 10, 11, 13, 14, 15, 16, 18, 19, 24, 26, 34, 41, 44, 45, 46, 47, 48], "encod": 0, "author": [0, 19, 24, 28, 29, 37], "token": [0, 11, 17, 24, 37, 48], "set": [0, 1, 2, 4, 6, 10, 11, 13, 14, 15, 16, 18, 19, 20, 24, 28, 29, 34, 41, 44, 45, 46, 47], "http": [0, 4, 5, 6, 9, 11, 13, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 47], "header": [0, 5, 14, 19, 24, 41, 48], "To": [0, 1, 2, 3, 4, 5, 11, 46, 47], "request": [0, 2, 9, 11, 13, 14, 18, 19, 24, 34, 41, 44, 45], "go": [0, 5, 34, 46], "app": [0, 1, 5, 7, 10, 11, 13, 22, 45, 47], "profil": [0, 1, 5, 6, 13, 14, 44, 47], "develop": [0, 4, 7, 10, 18, 47], "click": [0, 2, 3], "get": [0, 1, 2, 5, 6, 10, 11, 13, 15, 19, 20, 28, 34, 41, 44, 47, 48], "new": [0, 2, 11, 15, 16, 19, 20, 22, 26, 29, 34, 41, 44, 47, 48], "kei": [0, 2, 4, 5, 6, 8, 11, 16, 19, 20, 24, 28, 29, 34, 41, 44, 48], "everi": [0, 1, 2, 5, 13, 34], "your": [0, 1, 4, 5, 6, 7, 11, 13, 16, 46, 47], "usernam": [0, 1, 5, 11, 13, 24, 41, 45, 46, 47], "email": [0, 5, 6, 7, 11, 13, 19, 24, 34, 41], "all": [0, 2, 5, 7, 11, 12, 13, 15, 16, 19, 20, 22, 24, 34, 37, 44, 45, 47, 48], "lowercas": [0, 14, 41], "basic": [0, 48], "auth": [0, 4, 24], "The": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 19, 20, 26, 28, 34, 44, 45, 46, 47, 48], "sent": [0, 7], "form": [0, 2, 12, 17, 34, 41, 44], "credenti": [0, 11], "where": [0, 2, 3, 5, 9, 15, 20, 22, 44, 47, 48], "base64": 0, "join": [0, 9, 17], "singl": [0, 16, 19, 34, 47], "colon": 0, "us": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19, 20, 22, 28, 34, 44, 47, 48], "python": [0, 4, 7, 8, 9, 10, 19, 34, 44], "librari": [0, 7, 10, 17], "import": [0, 3, 4, 5, 7, 10, 15, 16, 17, 20, 28, 34, 41, 46], "result": [0, 2, 5, 15, 16, 20, 28, 34, 44], "seed": [0, 1, 4, 5, 6, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 27, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 47], "platform": [0, 1, 4, 5, 6, 11, 12, 13, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 47], "org": [0, 5, 6, 7, 9, 11, 13, 16, 19, 22, 24, 37, 41, 44, 46, 47], "version": [0, 4, 5, 6, 7, 11, 28, 34, 45, 46, 47], "user_email": 0, "api_kei": [0, 24, 47], "print": [0, 5], "json": [0, 1, 2, 5, 11, 13, 14, 17, 19, 28, 45, 48], "curl": [0, 1, 6, 13], "pass": [0, 5, 6, 13, 19, 34, 36, 46], "follow": [0, 1, 2, 4, 5, 6, 11, 12, 13, 15, 16, 34, 46, 47], "u": [0, 5, 6, 7, 10, 11, 12, 13, 22, 34], "If": [0, 1, 2, 4, 5, 6, 7, 11, 15, 16, 19, 20, 28, 34, 44, 46, 47, 48], "fail": [0, 5, 6, 16, 41, 46], "": [0, 1, 2, 5, 6, 7, 9, 10, 12, 13, 15, 18, 19, 20, 22, 24, 34, 41, 45, 46, 47, 48], "statu": [0, 19, 41, 44], "code": [0, 5, 9, 11, 12, 16, 19, 34, 45, 46, 47], "302": 0, "redirect": 0, "user": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 15, 16, 19, 24, 34, 41, 44, 45, 46, 48], "login": [0, 5, 8, 11, 13, 24, 41, 46], "mani": [0, 2, 13, 20, 24, 34, 48], "requir": [0, 1, 5, 6, 7, 10, 11, 12, 13, 16, 20, 24, 45, 47, 48], "paramet": [0, 19, 20, 24, 28, 29, 34, 37, 44, 46], "queri": [0, 5, 16, 19, 20, 24, 34, 44], "string": [0, 16, 19, 20, 22, 24, 28, 34, 37, 44, 48], "url": [0, 5, 10, 11, 13, 17, 19, 37, 44, 45], "A": [0, 1, 5, 12, 13, 14, 15, 20, 24, 34, 41, 47], "frequent": [0, 10], "includ": [0, 1, 5, 12, 13, 15, 16, 20, 22, 29, 34, 46], "organization_id": [0, 2, 5, 16, 19, 20, 34, 36, 44], "you": [0, 1, 4, 5, 7, 9, 11, 13, 16, 18, 34, 36, 44, 46, 47, 48], "belong": [0, 2, 44], "For": [0, 1, 2, 5, 6, 10, 11, 13, 15, 18, 34, 36, 41, 44, 46, 47], "exampl": [0, 1, 2, 5, 6, 9, 15, 18, 19, 20, 24, 28, 34, 36, 37, 44, 46, 47, 48], "v2": [0, 11], "organ": [0, 1, 5, 7, 9, 10, 11, 13, 15, 16, 17, 19, 20, 22, 34, 47], "12": [0, 2, 5, 44, 48], "Or": [0, 15], "d": [0, 5, 6, 44, 47], "6": [0, 5, 34], "role": [0, 2, 44, 47], "viewer": 0, "update_rol": 0, "param": [0, 19, 20, 34, 44], "post": [0, 19, 41, 47], "data": [0, 1, 4, 5, 7, 9, 11, 12, 13, 14, 15, 16, 17, 24, 28, 29, 34, 41, 44, 48], "dump": [0, 10, 47], "from": [0, 1, 2, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 19, 20, 24, 26, 28, 29, 34, 41, 44, 46, 47, 48], "object": [0, 5, 7, 14, 16, 19, 20, 22, 24, 28, 34, 36, 37, 39, 41, 44, 45], "specifi": [0, 5, 14, 15, 20, 44, 46], "each": [0, 2, 5, 11, 15, 16, 22, 29, 41, 44], "document": [0, 1, 2, 6, 9, 10, 12, 13, 14, 16], "In": [0, 1, 2, 5, 13, 16, 20, 22, 24, 34, 44, 46, 47], "case": [0, 2, 3, 5, 15, 16, 28, 34, 41, 44, 47], "error": [0, 4, 5, 16, 19, 20, 44, 46], "most": [0, 2, 3, 5, 6, 15, 20, 24, 34], "return": [0, 2, 5, 16, 19, 20, 22, 24, 28, 29, 34, 36, 37, 44, 45], "thi": [0, 1, 2, 3, 4, 5, 6, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 22, 24, 26, 28, 29, 34, 36, 41, 44, 45, 46, 47, 48], "instead": [0, 2, 5, 34, 37, 47], "expect": [0, 5, 13, 16, 22, 41], "messag": [0, 4, 5, 24, 47], "explan": 0, "here": [0, 2, 5, 7, 11, 13, 15, 18, 22, 46], "list": [0, 2, 5, 6, 9, 11, 12, 15, 19, 20, 28, 29, 34, 36, 44], "interact": 0, "ar": [0, 1, 2, 3, 4, 5, 7, 11, 12, 13, 14, 15, 16, 19, 20, 22, 24, 28, 34, 44, 45, 46, 47, 48], "avail": [0, 1, 7, 9, 10, 13, 28, 48], "access": [0, 1, 5, 7, 10, 11, 13, 15, 47], "menu": 0, "item": [0, 5, 11, 16, 28], "left": [0, 29], "navig": [0, 34, 47], "pane": 0, "within": [0, 1, 5, 13, 15, 19, 47], "account": [0, 4, 11, 15, 17, 22, 41, 44], "instanc": [0, 1, 2, 4, 6, 13, 15, 19, 20, 22, 24, 29, 34, 36, 44, 47], "view": [0, 10, 11, 14, 15, 17, 34, 44], "non": [0, 2, 8, 13, 34], "without": [0, 12, 15, 16, 41, 45], "swagger": 0, "server": [0, 1, 4, 5, 6, 8, 11, 14, 18], "provid": [1, 5, 6, 7, 10, 12, 13, 19, 22, 44, 47, 48], "prefer": [1, 2, 6, 13, 16, 20, 22], "host": [1, 6, 7, 13, 16, 47], "django": [1, 2, 4, 6, 7, 8, 10, 11, 16, 18, 19, 20, 24, 34, 37, 44, 45, 46, 48], "project": [1, 4, 5, 6, 13, 18, 19], "excel": [1, 6, 13], "place": [1, 6, 13, 34, 44, 48], "gener": [1, 4, 6, 9, 10, 11, 17, 44, 47], "understand": [1, 6, 13], "layout": [1, 6, 13, 48], "ubuntu": [1, 5, 6, 8, 13], "18": [1, 5, 6, 13], "04": [1, 6, 13], "lt": 1, "These": [1, 2, 11, 14, 15, 34, 47], "instruct": [1, 8, 10, 11, 13, 46], "have": [1, 2, 3, 4, 5, 6, 7, 11, 13, 15, 16, 18, 19, 22, 34, 41, 45, 46, 47, 48], "been": [1, 2, 5, 15, 19, 20, 34, 47], "updat": [1, 2, 5, 6, 7, 13, 15, 16, 24, 25, 29, 34, 44, 47, 48], "It": [1, 2, 6, 9, 11, 18, 34, 44, 46, 48], "recommend": [1, 4, 5, 9, 13, 47], "docker": [1, 4, 5, 8, 10, 11, 13], "base": [1, 2, 5, 7, 10, 13, 19, 20, 22, 24, 26, 28, 29, 34, 36, 37, 39, 41, 44, 46, 47, 48], "deploy": [1, 5, 10, 15, 18], "sudo": [1, 6, 13, 16, 47], "apt": [1, 6, 13, 16], "upgrad": [1, 6, 13, 16, 47], "instal": [1, 4, 5, 8, 11, 13, 16, 19, 48], "y": [1, 6], "libpq": [1, 13], "dev": [1, 11, 13, 46, 47], "pip": [1, 13, 47], "libatla": [1, 13], "gfortran": [1, 13], "build": [1, 2, 7, 8, 9, 10, 13, 15, 17, 19, 20, 34, 41, 47], "essenti": [1, 13], "g": [1, 2, 4, 5, 9, 11, 13, 16, 34, 44, 47, 48], "npm": [1, 5, 8, 13, 16], "libxml2": [1, 13], "libxslt1": [1, 13], "git": [1, 6, 13, 45, 47], "mercuri": [1, 13], "libssl": [1, 13], "libffi": [1, 13], "uwsgi": [1, 13, 47], "core": [1, 13, 16, 19], "plugin": [1, 13], "postgresql": [1, 2, 4, 7, 8, 10, 16], "redi": [1, 8, 13, 16, 20], "abov": [1, 2, 5, 6, 12, 13, 15, 20, 44], "command": [1, 5, 6, 11, 13, 16, 18, 24, 25, 26, 34, 46, 47], "quick": [1, 8, 11, 13], "okai": [1, 6], "local": [1, 4, 5, 6, 13, 16, 47, 48], "more": [1, 2, 4, 5, 11, 13, 15, 16, 41, 48], "perman": 1, "scalabl": 1, "solut": 1, "elasticach": [1, 13], "9": [1, 2, 5, 11, 13], "4": [1, 2, 5, 6, 12, 13, 15, 20, 34, 47], "support": [1, 4, 13, 16, 19, 36], "type": [1, 2, 11, 13, 20, 22, 29, 34, 44], "contrib": [1, 4, 5, 7, 13, 16, 24, 47], "can": [1, 2, 3, 4, 5, 7, 9, 10, 11, 13, 14, 15, 16, 19, 22, 28, 34, 44, 45, 46, 47, 48], "rd": [1, 13], "se": [1, 6], "clone": [1, 6, 13, 47], "repositori": [1, 5, 6, 9, 13, 16, 47], "github": [1, 5, 6, 9, 11, 13, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 47], "com": [1, 5, 6, 9, 11, 13, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 47], "enter": [1, 2, 11, 13], "repo": [1, 11, 13], "cd": [1, 5, 6, 13, 47], "r": [1, 5, 13, 16, 47], "txt": [1, 13, 16, 47], "j": [1, 5, 45, 47, 48], "copi": [1, 5, 13, 16, 19, 34, 47, 48], "local_untrack": [1, 4, 5, 7, 16, 46, 47], "py": [1, 4, 5, 7, 11, 16, 19, 24, 37, 44, 46, 47], "dist": [1, 13, 44, 47], "file": [1, 2, 4, 5, 6, 7, 11, 13, 14, 16, 20, 24, 26, 28, 34, 46, 47, 48], "config": [1, 5, 11, 13, 18, 46, 47], "directori": [1, 5, 6, 11, 13, 16, 46, 47], "add": [1, 4, 5, 6, 13, 14, 16, 20, 28, 44, 46, 47, 48], "password": [1, 5, 11, 13, 16, 19, 24, 41, 46, 47], "port": [1, 13, 16, 46, 47], "point": [1, 2, 5, 13, 14, 15, 22, 34, 46, 47], "manual": [1, 5, 10, 13, 14, 15, 16, 47, 48], "infrastructur": [1, 13], "default": [1, 2, 3, 5, 6, 11, 13, 16, 19, 20, 34, 36, 44, 46, 47], "engin": [1, 6, 13, 16, 47], "db": [1, 5, 6, 11, 13, 16, 20, 24, 34, 47], "backend": [1, 4, 13, 16, 34, 47], "postgresql_psycopg2": [1, 13], "name": [1, 2, 5, 6, 7, 11, 12, 13, 16, 18, 19, 20, 24, 28, 29, 34, 36, 37, 41, 44, 45, 46, 47], "arbitrari": [1, 2, 13, 36], "ani": [1, 2, 3, 4, 5, 6, 12, 13, 14, 15, 16, 18, 20, 22, 28, 29, 34, 46, 47, 48], "valid": [1, 6, 7, 10, 13, 19, 20, 24, 34, 39, 44], "long": [1, 2, 5, 13, 16, 28], "exist": [1, 2, 4, 5, 6, 10, 13, 16, 19, 20, 28, 29, 34, 41, 46, 47], "creat": [1, 2, 4, 5, 6, 11, 14, 15, 16, 19, 20, 22, 24, 26, 28, 34, 41, 44, 46, 47, 48], "postgr": [1, 2, 5, 6, 11, 13, 16, 46, 47], "psql": [1, 5, 13, 47], "shell": [1, 5, 7, 16, 46, 47], "line": [1, 2, 5, 11, 16, 34, 47, 48], "createdb": [1, 13, 47], "tabl": [1, 5, 13, 16, 28, 34, 47], "migrat": [1, 8, 10, 13, 20], "manag": [1, 4, 7, 10, 13, 14, 16, 17, 19, 20, 24, 28, 34, 46, 47, 48], "syncdb": 1, "superus": [1, 5, 13, 45, 47], "system": [1, 2, 5, 11, 13, 15, 47], "create_default_us": [1, 5, 11, 13, 47], "demo": [1, 5, 41, 47], "demo123": [1, 47], "must": [1, 5, 11, 12, 13, 14, 15, 16, 26, 34, 44, 46, 47], "ti": [1, 13, 34], "visit": [1, 9, 13, 47], "admin": [1, 6, 8, 11, 13, 17, 19, 24], "parent": [1, 10, 13, 19, 20, 24, 29, 34, 44], "them": [1, 5, 13, 16, 41, 48], "reli": [1, 13], "both": [1, 2, 5, 7, 10, 13, 15, 19, 20, 34, 47], "should": [1, 2, 5, 11, 13, 15, 16, 18, 22, 34, 41, 46, 47, 48], "celery_broker_url": [1, 13, 16, 47], "ntmprk": 1, "0001": 1, "usw2": 1, "amazonaw": [1, 6, 11], "6379": [1, 13, 16, 47], "1": [1, 2, 4, 5, 6, 8, 11, 12, 13, 15, 20, 22, 34, 41, 44, 46], "django_redi": [1, 13, 16, 47], "rediscach": [1, 13, 16, 47], "locat": [1, 5, 13, 16, 20, 47], "save": [1, 5, 7, 10, 13, 14, 20, 22, 24, 29, 34, 47], "match": [1, 5, 10, 11, 13, 16, 19, 20, 22, 28, 44], "qualiti": [1, 7, 10, 13, 17, 44], "check": [1, 3, 13, 16, 19, 20, 28, 34, 41, 44, 45, 48], "etc": [1, 2, 5, 6, 13, 14, 15, 19, 46, 48], "connect": [1, 9, 11, 13, 15, 46], "queue": [1, 13, 16], "start": [1, 2, 5, 10, 11, 13, 34, 39, 44, 46], "l": [1, 6, 13, 47], "info": [1, 5, 11, 13, 34, 47], "c": [1, 5, 6, 12, 13, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47], "2": [1, 2, 5, 6, 8, 11, 12, 13, 15, 20, 34, 48], "max": [1, 5, 11, 13, 20, 47], "per": [1, 13, 15, 19, 20, 47, 48], "child": [1, 2, 13, 20, 24, 34, 47], "1000": [1, 13, 20, 47], "eb": [1, 13, 47], "django_celery_beat": [1, 5, 13, 47], "schedul": [1, 13, 19, 45, 47], "databaseschedul": [1, 13, 47], "below": [2, 5, 6, 11, 16, 20, 22, 24, 28, 34, 41, 46, 47, 48], "out": [2, 5, 6, 7, 9, 12, 13, 20, 47, 48], "state": [2, 5, 12, 29, 34], "need": [2, 5, 7, 9, 11, 13, 14, 15, 16, 19, 22, 34, 41, 44, 46, 47, 48], "our": [2, 9, 13, 29, 41], "primari": [2, 19, 20], "tree": [2, 44, 48], "structur": [2, 20, 28], "node": [2, 11, 37, 47], "tip": 2, "referenc": [2, 44], "take": [2, 11, 16, 28, 34, 37, 44], "ha": [2, 5, 13, 14, 15, 19, 20, 34, 46], "load": [2, 13, 20, 24, 34, 45], "csv": [2, 28], "contain": [2, 6, 8, 9, 11, 12, 16, 18, 34, 41, 48], "inform": [2, 4, 5, 7, 9, 10, 11, 14, 34], "about": [2, 5, 34], "one": [2, 3, 4, 5, 7, 11, 15, 16, 18, 20, 24, 28, 34, 44, 48], "first": [2, 5, 6, 11, 15, 16, 19, 20, 24, 28, 34, 37, 44, 45, 46, 47], "bs0": 2, "At": [2, 4, 14, 15, 47, 48], "time": [2, 5, 6, 15, 16, 17, 20, 24, 34, 41, 46, 47, 48], "link": [2, 11, 16, 34, 37], "cb0": 2, "also": [2, 5, 9, 11, 12, 13, 15, 16, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 47], "relat": [2, 5, 16, 20, 24, 34, 41], "repres": [2, 5, 15, 19, 44], "databas": [2, 4, 6, 7, 8, 10, 14, 16, 20, 22, 29, 34, 46], "foreign": [2, 16, 44], "come": [2, 11, 20, 44], "fruition": 2, "sai": [2, 15], "bs1": 2, "wa": [2, 5, 15, 20, 22, 28, 34, 41, 44], "occur": [2, 5, 14, 15, 16], "bs2": 2, "merg": [2, 5, 10, 14, 16, 17, 34], "togeth": [2, 34], "given": [2, 3, 5, 15, 19, 22, 28, 34, 44], "record": [2, 3, 5, 14, 15, 19, 34], "b3": 2, "snapshot": [2, 15], "becaus": [2, 16, 19, 20, 48], "newer": [2, 5, 6, 13], "two": [2, 4, 5, 11, 15, 16, 22, 28, 34], "perspect": 2, "By": [2, 13, 34, 44, 47], "recent": [2, 15, 34], "allow": [2, 15, 18, 41, 44], "evolv": 2, "over": [2, 15, 34, 47, 48], "canon": [2, 29, 34, 48], "site": [2, 5, 7, 11, 34], "eui": [2, 16, 20, 34], "valu": [2, 4, 11, 13, 15, 20, 22, 24, 28, 34, 44, 46, 47, 48], "75": 2, "some": [2, 5, 7, 11, 15, 16, 34, 46, 47, 48], "chang": [2, 5, 15, 16, 34, 46, 47, 48], "caus": [2, 12, 16, 48], "80": [2, 11, 13], "submit": [2, 5, 9], "linkag": 2, "other": [2, 4, 5, 7, 9, 10, 12, 13, 15, 16, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "order": [2, 5, 11, 14, 15, 16, 44, 46, 48], "keep": [2, 16], "track": [2, 48], "addit": [2, 5, 14, 15, 16], "seed_buildingsnapshot_children": 2, "would": [2, 13, 15, 19, 28], "throughout": [2, 34], "applic": [2, 5, 7, 9, 10, 11, 15, 18], "search_build": 2, "endpoint": [2, 5, 10, 28, 44], "search": [2, 10, 17], "activ": [2, 7, 10, 17, 24, 45, 47], "search_mapping_result": 2, "regardless": [2, 34], "whether": [2, 3, 12, 14, 19, 28, 41], "dure": [2, 3, 5, 15, 19], "map": [2, 5, 10, 16, 17, 19, 22, 29, 34, 41, 48], "preview": [2, 15], "section": [2, 7, 11, 37, 47], "illustr": 2, "purpos": [2, 5, 12, 34], "let": [2, 36], "suppos": 2, "bs3": 2, "bs4": 2, "And": 2, "correspond": [2, 14, 44], "look": [2, 6, 11, 16, 44, 47, 48], "like": [2, 5, 6, 11, 16, 36, 44, 46, 47, 48], "process": [2, 5, 14, 15, 19, 24, 28, 34, 41, 44, 47, 48], "raw": [2, 28, 34], "b0": 2, "c0": 2, "id1": 2, "11": [2, 5, 8], "id2": 2, "id3": 2, "13": [2, 5], "id4": 2, "14": [2, 5], "15": [2, 5], "sinc": [2, 5, 13, 15, 16, 34, 44, 47], "choos": [2, 15, 46, 48], "move": [2, 5, 13, 34], "onli": [2, 6, 15, 19, 20, 34, 41, 44, 45, 47], "deactiv": 2, "secondari": 2, "true": [2, 4, 5, 13, 19, 20, 22, 24, 28, 34, 36, 39, 44], "bs5": 2, "cb1": 2, "decid": [2, 13, 14, 28], "fals": [2, 5, 13, 18, 19, 20, 24, 26, 28, 29, 34, 36, 44], "after": [2, 3, 4, 5, 6, 11, 15, 16, 19, 34, 41, 46], "bs6": 2, "even": [2, 12, 15, 22, 47], "though": [2, 15, 22, 47], "normal": [2, 5, 15, 16, 22, 28, 34, 47], "its": [2, 11, 12, 15], "anytim": 2, "unmatch": 2, "leaf": 2, "conceptu": 2, "sometim": 2, "devil": 2, "detail": [2, 6, 15], "ad": [2, 15, 20, 22, 28, 41], "least": [2, 15, 48], "consid": [2, 15], "simpl": [2, 6, 11, 13, 15, 20, 34, 37, 41], "properti": [2, 3, 5, 6, 15, 16, 17, 19, 20, 22, 24, 28, 44], "id": [2, 5, 11, 16, 19, 20, 22, 24, 34, 36, 37, 41, 44, 47], "year": [2, 15, 20, 34, 41], "end": [2, 7, 10, 14, 34, 39], "floor": [2, 34], "area": [2, 20, 34], "address": [2, 5, 13, 16, 19, 20, 34, 41], "releas": [2, 6, 10, 11, 16, 34, 41], "date": [2, 20, 34, 44], "499045": 2, "2000": 2, "1234": [2, 5], "fake": [2, 16], "st": 2, "thing": [2, 44, 47], "upload": [2, 7, 10, 14], "see": [2, 4, 5, 7, 11, 13, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 48], "success": [2, 11, 19, 41, 44], "dialog": 2, "73700": 2, "modifi": [2, 11, 34], "timestamp": [2, 44], "Then": [2, 15, 47], "lot": [2, 15, 20, 34], "empti": [2, 5, 11, 34], "source_typ": [2, 34, 41, 44], "0": [2, 4, 5, 7, 8, 13, 20, 28, 34, 39, 41, 44, 46], "column": [2, 10, 14, 16, 17, 28, 29, 44], "which": [2, 5, 11, 13, 15, 16, 22, 28, 34, 44, 46, 47, 48], "content": [2, 6, 17, 41], "extra_data_sourc": 2, "popul": [2, 5], "e": [2, 4, 5, 11, 13, 16, 28, 34, 37, 44, 46, 47, 48], "owner_postal_code_source_id": 2, "interest": [2, 34], "import_file_id": [2, 34], "refer": [2, 15, 34], "data_importer_importfil": 2, "befor": [2, 5, 6, 11, 15, 16, 20, 24, 41, 44, 46, 47], "hit": [2, 11], "continu": 2, "button": [2, 3, 48], "second": [2, 37], "73701": 2, "screen": [2, 16], "pm_property_id": [2, 20, 34], "year_end": [2, 20, 34], "gross_floor_area": [2, 20, 34], "address_line_1": [2, 20, 34], "release_d": [2, 20, 34], "That": [2, 15], "now": [2, 11, 19, 28, 47, 48], "same": [2, 5, 7, 10, 11, 15, 28, 34, 37, 41, 44, 47], "next": [2, 15, 28], "2001": 2, "As": [2, 15, 48], "73702": 2, "pattern": [2, 44], "similarli": 2, "73703": 2, "appear": [2, 5, 44, 46], "howev": [2, 4, 5, 12, 16, 20, 44], "abl": [2, 11, 41], "make": [2, 5, 6, 7, 11, 15, 16, 18, 34, 41, 46, 47, 48], "confirm": [2, 41], "73704": 2, "ident": 2, "term": [2, 26], "except": [2, 20, 24, 34, 36, 41, 45], "differ": [2, 5, 9, 11, 13, 15, 20, 22, 28, 29, 46, 47, 48], "confid": [2, 5, 28, 34, 41], "canonical_building_id": 2, "null": 2, "last_modified_by_id": 2, "landing_seedus": [2, 47], "address_line_1_source_id": 2, "gross_floor_area_source_id": 2, "pm_property_id_source_id": 2, "release_date_source_id": 2, "year_ending_source_id": 2, "summar": 2, "5": [2, 5, 8, 12, 20, 34], "were": [2, 5, 15, 16, 22, 34], "twice": [2, 15], "row": [2, 3, 16, 20], "step": [2, 5, 11, 13, 15, 16, 47, 48], "20505": 2, "There": [2, 5, 11, 16, 48], "still": [2, 5, 47], "orgs_organ": 2, "filter": [2, 5, 19, 44], "get_build": 2, "membership": 2, "sourc": [2, 5, 7, 9, 10, 12, 16, 34, 46, 47, 48], "extend": [2, 19], "note": [2, 4, 6, 10, 13, 16, 19, 24, 34, 44, 46, 47, 48], "made": [2, 28], "input": 2, "none": [2, 5, 11, 19, 20, 24, 26, 28, 34, 36, 37, 39, 41, 44], "itself": [2, 5], "so": [2, 5, 7, 14, 15, 16, 22, 28, 34, 44, 46, 48], "block": [2, 11, 34, 47], "number": [2, 5, 11, 15, 19, 20, 34, 44, 45, 47], "block_number_source_id": 2, "unlik": [2, 11], "who": [2, 47], "block_numb": [2, 34], "nevertheless": 2, "year_built": [2, 20, 34, 41], "those": [2, 11, 15, 28, 34, 44], "street": 2, "usual": [2, 18, 47], "cannot": [2, 20, 34], "serv": 2, "storag": [2, 13, 16, 20], "an_unknown_field": 2, "something_els": [2, 19], "some_buildingsnapshot_id": 2, "another_buildingsnapshot_id": 2, "truncat": 2, "too": [2, 5, 48], "255": 2, "charact": [2, 5], "jurisdiction_tax_lot_id": [2, 20, 34], "custom_id_1": [2, 20, 34], "ubid": [2, 34], "lot_numb": [2, 34], "district": [2, 34], "owner": [2, 12, 13, 15, 34, 47], "owner_email": [2, 34], "owner_telephon": [2, 34], "owner_address": [2, 34, 41], "owner_city_st": [2, 34], "owner_postal_cod": [2, 34], "property_nam": [2, 34], "address_line_2": [2, 34], "citi": [2, 34], "postal_cod": [2, 34], "state_provinc": 2, "building_certif": [2, 34], "No": [2, 16], "store": [2, 5, 11, 20, 34, 46], "run": [3, 4, 5, 6, 8, 11, 15, 16, 19, 45, 48], "pair": [3, 10, 15, 16, 41], "taxlot": [3, 5, 15, 16, 17, 19, 20, 48], "demand": 3, "select": [3, 5, 9, 11, 15, 28, 41], "inventori": [3, 29, 34], "page": [3, 4, 5, 10, 15, 19, 41, 47], "action": [3, 4, 5, 11, 15, 45], "defin": [3, 5, 14, 20, 24, 28, 34], "rule": [3, 15, 17, 20, 44], "broken": 3, "satisfi": 3, "notabl": 3, "when": [3, 5, 10, 11, 13, 14, 16, 19, 20, 24, 34, 41, 44, 45, 46, 47], "label": [3, 5, 15, 17, 20, 34, 44], "appli": [3, 5, 14, 20], "elabor": 3, "attach": [3, 47], "break": [3, 5, 46], "doe": [3, 4, 5, 7, 10, 20, 29, 44, 47], "happen": [3, 10, 14, 15, 16], "due": [3, 5, 13, 46], "perform": [3, 4, 5, 7, 10, 16, 19, 45], "reason": [3, 15], "intend": [4, 47], "linux": [4, 6, 10, 46], "cloud": [4, 11], "aw": [4, 10, 47], "hardwar": 4, "offici": 4, "window": [4, 5, 8, 11], "product": [4, 5, 6, 12, 18, 46], "desir": [4, 5, 11, 13, 44, 47], "setup": [4, 5, 10, 19, 24, 41, 47], "prerequisit": [4, 8], "depend": [4, 5, 8, 11], "javascript": [4, 7, 8, 10], "configur": [4, 5, 8, 10, 16, 17, 20, 46], "cach": [4, 16, 19, 20, 34, 41, 47], "broker": [4, 47], "celeri": [4, 5, 16, 20, 36, 45, 46, 47], "background": 4, "task": [4, 17, 20, 22, 45, 47], "worker": [4, 45, 47], "initi": [4, 5, 15, 20, 24, 28, 41, 44, 47], "web": [4, 5, 6, 7, 10, 14, 46], "environ": [4, 5, 11, 46, 47], "variabl": [4, 5, 11, 18, 37, 46, 47], "mail": 4, "servic": [4, 6, 11, 12, 16, 26, 48], "deploi": [4, 5, 11, 16], "kubernet": [4, 10], "helm": [4, 10], "cluster": 4, "resourc": [4, 10], "through": [4, 5, 11, 12, 34, 48], "variou": [4, 5, 9, 16], "custom": [4, 5, 6, 16, 18, 20, 22, 28, 34], "webserv": [4, 46], "issu": [4, 5, 9, 10, 13, 16, 44, 46], "enabl": [4, 5, 9, 11, 20, 44, 47], "up": [4, 5, 11, 13, 15, 16, 20, 24, 41, 44, 46, 47, 48], "io": [4, 5, 6], "raven_config": 4, "sentry_js_dsn": [4, 11], "frontend": 4, "moment": [4, 13], "sentry_sdk": 4, "integr": [4, 10], "djangointegr": 4, "celeryintegr": 4, "init": [4, 47], "dsn": [4, 11], "ingest": 4, "job": 4, "traces_sample_r": 4, "captur": [4, 5, 15], "100": [4, 5, 11, 20, 39], "transact": 4, "we": [4, 5, 11, 13, 14, 19, 34, 41, 44, 48], "adjust": [4, 48], "wish": 4, "associ": [4, 15, 20, 34], "assum": [4, 11, 44, 47], "mai": [4, 12, 15, 16, 34, 44, 46, 47], "send": [4, 11, 13, 19, 20, 24], "pii": 4, "send_default_pii": 4, "job_id": 4, "22": 5, "21": [5, 11], "20": 5, "19": 5, "17": 5, "3": [5, 11, 12, 13, 15, 20, 34, 46, 47], "16": [5, 13], "10": [5, 11, 13, 20, 44, 46], "7": 5, "osx": [5, 8], "translat": [5, 10], "philosophi": 5, "style": [5, 44], "don": [5, 46], "t": [5, 15, 16, 34, 44, 46, 47], "crazi": 5, "indirect": [5, 12], "interpol": 5, "precommit": 5, "format": [5, 11, 19, 20, 28, 34, 41, 48], "static": [5, 13, 16, 20, 34, 36], "verifi": [5, 6, 13, 48], "syntax": 5, "thei": [5, 15, 20, 28, 34, 45, 47], "ignor": [5, 15, 34], "emul": 5, "ci": 5, "machin": [5, 47], "descript": [5, 18, 20, 34], "e402": 5, "modul": [5, 10, 18, 41], "level": [5, 15, 18, 20, 44], "top": [5, 24, 34, 48], "e501": 5, "82": 5, "e731": 5, "do": [5, 11, 15, 16, 19, 28, 34, 44, 46, 47, 48], "assign": [5, 19, 34], "lambda": [5, 34], "express": [5, 12, 48], "def": [5, 19, 36], "w503": 5, "binari": [5, 12], "oper": 5, "w504": 5, "call": [5, 11, 14, 20, 28, 34, 36, 41, 44, 47], "tox": 5, "flake8": 5, "begin": 5, "codebas": [5, 22], "benefit": [5, 7, 10], "elimin": 5, "accident": [5, 15], "mistak": 5, "prevent": [5, 15], "bug": 5, "well": [5, 7, 10, 16, 44], "better": [5, 47, 48], "experi": 5, "exhaust": 5, "annot": 5, "function": [5, 7, 10, 11, 17, 19, 34, 37, 41, 44], "refactor": 5, "might": [5, 15, 18], "benefici": 5, "ambigu": [5, 15], "determin": [5, 34, 44], "ton": 5, "effort": 5, "built": [5, 20, 24, 34, 41], "collect": 5, "dict": [5, 19, 20, 28, 29, 34, 36], "tupl": [5, 28, 34, 44], "capit": 5, "typeddict": 5, "notrequir": 5, "typing_extens": 5, "packag": [5, 8, 10, 11, 13, 17], "option": [5, 13, 19, 24, 26, 34, 37, 44], "dictionari": [5, 20, 29, 34, 41], "common": [5, 6, 11], "gotcha": 5, "try": [5, 15, 28, 36, 41, 46], "class": [5, 19, 20, 22, 24, 26, 28, 34, 36, 37, 39, 41, 44], "method": [5, 7, 10, 16, 19, 20, 22, 24, 26, 28, 34, 36, 41, 44], "__future__": 5, "re": [5, 11, 15, 41, 47, 48], "warn": [5, 20], "runtim": 5, "sure": [5, 6, 7, 11, 16, 34, 41, 46, 47], "wast": 5, "pleas": [5, 9], "checker": 5, "feel": 5, "free": 5, "throw": 5, "problemat": 5, "current": [5, 19, 34, 45, 48], "mypi": 5, "own": [5, 13, 15], "extens": [5, 16, 34, 47], "vscode": 5, "pylanc": 5, "microsoft": 5, "pyright": 5, "typecheck": 5, "complic": 5, "mix": 5, "extra": [5, 29, 34], "propertyst": [5, 16, 17, 20, 29, 34], "taxlotst": [5, 16, 17, 20, 29, 34], "model": [5, 7, 10, 14, 16, 17, 29, 36, 44], "yet": 5, "database_column": [5, 34], "copar": [5, 34], "sql": [5, 34], "keep_field": 5, "makemigr": 5, "script": [5, 6, 16, 44, 47, 48], "new_db_field": 5, "forward": [5, 11, 20, 24, 34], "schema_editor": 5, "get_model": 5, "column_nam": [5, 16, 34, 41], "geocoding_confid": [5, 34], "table_nam": [5, 16, 20, 34], "display_nam": [5, 20, 34], "geocod": [5, 16, 34, 47], "column_descript": [5, 34], "data_typ": [5, 20, 34], "is_extra_data": [5, 16, 34], "count": [5, 34], "elif": 5, "col": [5, 28], "els": [5, 36], "than": [5, 11, 12, 15, 20, 28, 48], "0090_auto_20180425_1154": 5, "runpython": 5, "unit": [5, 12, 16, 17, 20, 22, 34, 45], "fix": [5, 16], "failur": 5, "test_mapping_data": [5, 17], "test_kei": 5, "test_column": 5, "test_column_retrieve_schema": 5, "test_column_retrieve_db_field": 5, "workflow": [5, 9, 28], "toggl": 5, "mainten": 5, "mode": [5, 46, 47], "displai": [5, 15, 16, 34, 46], "api": [5, 7, 8, 9, 10, 14, 16, 17, 19, 24, 28, 48], "exec": [5, 11, 16, 46], "seed_web": [5, 46], "sh": [5, 6, 16, 47, 48], "off": [5, 44, 46], "angular": [5, 48], "delimit": 5, "thu": 5, "renam": [5, 34], "BE": [5, 12], "interpolateprovid": 5, "startsymbol": 5, "endsymbol": 5, "eas": [5, 11], "automat": [5, 15, 16, 48], "readthedoc": 5, "en": 5, "latest": [5, 11, 15], "html": [5, 11, 13, 26, 48], "xmlhttprequest": 5, "cooki": 5, "x": [5, 6], "csrftoken": 5, "seed_app": 5, "statehelperprovid": 5, "urlrouterprovid": 5, "locationprovid": 5, "home": [5, 6, 34, 45], "templateurl": 5, "static_url": [5, 13], "control": [5, 16, 34, 48], "profile_control": 5, "resolv": [5, 6, 15], "auth_payload": 5, "auth_servic": 5, "q": [5, 13, 19], "user_servic": 5, "var": [5, 37, 47], "get_organ": [5, 44], "is_author": 5, "requires_superus": 5, "user_profile_payload": 5, "get_user_profil": 5, "found": [5, 11, 15, 34, 47], "doc": [5, 11, 47], "djangoproject": 5, "topic": [5, 9], "standard": [5, 7, 12, 18], "logger": 5, "describ": [5, 14, 15, 34, 46], "sever": [5, 16, 20], "debug": [5, 13], "low": [5, 16, 34], "minor": 5, "problem": [5, 9], "major": [5, 48], "critic": 5, "written": [5, 7, 10, 12, 19], "hardcod": 5, "goal": [5, 15], "dynam": [5, 20, 24, 34], "espm": 5, "blob": [5, 24], "lib": [5, 10, 16, 17, 19, 38, 39, 44, 47], "pm": [5, 22, 28, 34], "brief": 5, "how": [5, 9, 10, 48], "drop": 5, "distribut": [5, 12], "part": [5, 16, 28], "third": [5, 11, 13], "last": [5, 15, 45], "span": 5, "multipl": [5, 7, 10, 15, 16, 34], "createus": [5, 13, 47], "seedus": [5, 9, 11, 13, 16, 17, 24, 47], "IF": [5, 12], "NOT": [5, 12], "postgi": [5, 8, 13, 16], "timescaledb": [5, 8, 13, 16], "testorg": 5, "timescaledb_pre_restor": 5, "previou": [5, 44], "pg_restor": 5, "backup": [5, 6, 16, 46], "prod": [5, 11, 13], "prod_20191203_000002": 5, "installed_vers": 5, "being": [5, 15, 19, 44, 45, 46, 47], "default_vers": 5, "pg_available_extens": 5, "timescaledb_post_restor": 5, "disabl": 5, "celerybeat": 5, "salesforc": [5, 19], "domain": [5, 19], "dev1": 5, "salesforce_en": 5, "periodictask": 5, "name__startswith": 5, "salesforce_sync_org": 5, "update_chang": 5, "jasmin": [5, 45], "angular_js_test": [5, 45], "vcr": 5, "cassett": 5, "reus": 5, "respons": [5, 6, 10, 19], "unless": [5, 44, 46], "want": [5, 11, 16, 34, 46, 47], "refresh": 5, "isn": 5, "anyth": [5, 7], "logic": [5, 26, 34], "mapquest": [5, 8, 16], "work": [5, 6, 7, 10, 11, 12, 13, 16, 44, 46, 47], "ll": [5, 46, 48], "small": [5, 19], "testing_mapquest_api_kei": 5, "actual": [5, 15, 26, 41], "just": [5, 11, 15, 34, 37, 46, 47, 48], "delet": [5, 16, 20, 22, 34], "old": [5, 6, 15, 16, 34], "ones": [5, 16, 22], "vcr_cassett": 5, "hidden": 5, "push": [5, 48], "coverag": 5, "report": [5, 9, 34, 41], "under": [5, 47, 48], "83": 5, "pep8": 5, "eslint": 5, "lint": 5, "older": [5, 16, 46], "websit": [5, 9, 11, 13, 47, 48], "rm": [5, 6, 16], "rf": [5, 16], "htmlout": 5, "sphinx": 5, "b": [5, 15, 28, 41, 44], "code_document": 5, "new_vers": 5, "developer_resourc": 5, "md": [5, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "outsid": 5, "nation": [5, 7, 10, 12], "lab": 5, "review": [5, 9, 48], "fill": [5, 6, 9, 34, 48], "agreement": 5, "fork": 5, "otherwis": [5, 6, 12], "ensur": [5, 11, 20, 24, 34, 44], "ticket": 5, "board": 5, "progress": [5, 19, 20, 41, 48], "tracker": 5, "branch": [5, 19], "hotfix": 5, "appropri": [5, 6, 44, 46], "convent": 5, "issue_id": 5, "short": [5, 6, 24], "write": [5, 15, 44], "upon": [5, 16], "complet": [5, 15, 16], "pull": [5, 11, 48], "pr": 5, "against": [5, 19, 20, 44], "auto": [5, 10, 48], "featur": [5, 9, 10, 15, 17, 19, 24, 48], "donotpublish": 5, "present": [5, 34, 44], "enhanc": 5, "improv": [5, 7, 10], "publish": [5, 11], "onc": [5, 11, 13, 14, 15, 19, 46, 48], "approv": [5, 12], "readi": [5, 11, 13, 47], "prepar": [5, 16], "prep": 5, "root": [5, 11, 16, 47], "alwai": [5, 15, 34], "rst": 5, "draft": 5, "changelog": 5, "cleanup": [5, 22, 34], "spell": 5, "correct": [5, 11, 16, 19, 34], "letter": 5, "miss": [5, 34], "ui": [5, 11, 14, 34, 48], "lokalis": [5, 48], "main": [5, 9, 11, 14, 17, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 47], "hub": 5, "seedplatform": [5, 6, 11], "amazon": [6, 11, 13], "m5ad": 6, "xlarg": 6, "launch": [6, 11], "remov": [6, 11, 16, 20, 28, 34, 46], "containerd": 6, "runc": 6, "commun": [6, 9, 16], "edit": [6, 15, 47], "transport": 6, "ca": 6, "certif": [6, 34, 41], "gnupg": 6, "agent": 6, "softwar": [6, 7, 10, 12], "fssl": 6, "download": [6, 11, 47], "gpg": 6, "deb": 6, "arch": 6, "amd64": 6, "lsb_releas": 6, "stabl": 6, "ce": 6, "cli": [6, 48], "group": [6, 7, 10, 15, 24], "groupadd": 6, "usermod": 6, "ag": [6, 16], "newgrp": 6, "dn": [6, 13], "correctli": [6, 20, 34], "ip": 6, "v6": 6, "getent": 6, "tutum": 6, "dnsutil": 6, "nslookup": 6, "west": [6, 11], "compos": [6, 16, 46], "25": 6, "unam": 6, "m": 6, "o": [6, 36], "usr": [6, 13, 16, 47], "bin": [6, 13, 16, 47], "chmod": 6, "checkout": [6, 16, 47], "export": [6, 13, 17, 19, 47], "postgres_us": [6, 11], "postgres_db": [6, 11], "postgres_password": [6, 11], "gdeus3fasd1askj89qkaldjfx": 6, "postgres_port": [6, 11], "5432": [6, 11, 13, 16, 47], "secret_kei": [6, 11], "96": 6, "7jg": 6, "_": 6, "z9c9qwwu2": 6, "w": 6, "hb3r322yf3lz": 6, "ekw": 6, "ly": 6, "until": [6, 11, 46], "restor": [6, 10, 47], "seed_admin_us": [6, 11], "seed_admin_password": [6, 11], "7febwal38": 6, "k3jlfa92lakj8ih4": 6, "seed_admin_org": [6, 11], "aws_access_key_id": [6, 11], "aws_access_kei": 6, "aws_secret_access_kei": [6, 11], "aws_secret_kei": 6, "aws_ses_region_nam": [6, 11], "aws_ses_region_endpoint": [6, 11], "server_email": [6, 11], "persist": [6, 15, 34], "volum": [6, 11, 46], "seed_pgdata": [6, 46], "seed_media": [6, 46], "mkdir": [6, 47], "p": [6, 13, 47], "path": [6, 19, 24, 34, 41, 47], "dir": 6, "wai": [6, 11, 12, 13, 47, 48], "swarm": 6, "stack": 6, "implement": [6, 7, 10, 20, 24, 26, 34, 36, 41], "simpli": [6, 16, 20], "yml": [6, 11, 16, 46, 48], "filenam": [6, 34], "bash": [6, 11], "replac": [6, 11, 13, 16, 18, 47], "energi": [7, 9, 12, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "effici": [7, 12, 34], "help": [7, 10, 16, 24, 25, 26, 46, 47], "easili": [7, 10, 16, 19, 28], "larg": [7, 10, 11], "combin": [7, 10, 15, 18, 47], "clean": [7, 10, 16, 34, 44], "share": [7, 10, 16, 19], "easi": [7, 10, 11, 13, 47], "flexibl": [7, 10], "cost": [7, 10], "effect": [7, 10, 16], "demonstr": [7, 10], "econom": [7, 10], "environment": [7, 10], "program": [7, 10, 12, 15], "target": [7, 10, 15, 47], "invest": [7, 10], "angularj": [7, 10, 45], "bootstrap": [7, 10, 47], "front": [7, 10], "back": [7, 10, 14, 47], "browser": [7, 10, 47, 48], "interfac": [7, 10, 11], "full": [7, 10, 22, 34], "renew": [7, 10], "laboratori": [7, 10, 12], "fund": [7, 10], "depart": [7, 10, 12], "newdomain": 7, "staticfiles_storag": [7, 16], "comment": [7, 34, 47], "redeploi": 7, "recollect": 7, "compress": 7, "nodej": [8, 13], "nativ": [8, 11, 48], "tutori": 9, "learn": 9, "forum": 9, "announc": 9, "question": [9, 10, 34], "buildingenergytool": 9, "inquiri": 9, "specif": [9, 12, 13, 15, 20, 22, 34], "tool": [9, 11, 48], "desk": 9, "relev": 9, "buildingdata": 9, "gov": [9, 28, 29], "open": [9, 16, 46, 47], "compon": 9, "client": [9, 14, 41, 44], "dataset": [9, 41], "encourag": 9, "seeddevelop": 9, "guid": 10, "monitor": [10, 11], "authent": [10, 13, 44, 45], "payload": 10, "children": [10, 20, 24, 34], "v": [10, 41, 44], "what": [10, 11, 13, 34, 46, 47], "realli": [10, 15], "buildingsnapshot": 10, "canonicalbuild": 10, "_source_id": 10, "field": [10, 15, 16, 19, 20, 24, 28, 29, 34, 36, 44, 47], "extra_data": [10, 20, 34, 44], "possibl": [10, 12, 15, 22, 29], "loss": [10, 12], "why": 10, "depth": 10, "land": [10, 17, 19], "public": [10, 17, 34], "serial": [10, 17, 44], "test": [10, 13, 16, 17, 19, 22, 31, 45, 47], "util": [10, 16, 17, 24], "nginx": [10, 13], "log": [10, 19, 34, 44, 46, 47, 48], "bede": [10, 17], "complianc": 10, "reset": [10, 19, 20, 46], "contribut": 10, "best": [10, 15], "practic": 10, "licens": [10, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "ask": 10, "index": [10, 13], "robust": 11, "orchestr": 11, "further": 11, "choic": 11, "slightli": 11, "provis": 11, "googl": [11, 48], "gcp": 11, "azur": 11, "ak": 11, "userguid": 11, "cliv2": 11, "insert": [11, 34, 46], "secret": [11, 46, 47], "region": [11, 13], "east": [11, 13, 34], "output": [11, 46], "mac": [11, 46, 47], "homebrew": [11, 47], "brew": [11, 16, 47, 48], "did": [11, 20], "properli": [11, 41], "pod": 11, "replicaset": 11, "unfamiliar": 11, "gui": 11, "One": 11, "dashboard": 11, "parti": [11, 12, 13], "octant": 11, "eksctl": 11, "elast": 11, "disregard": 11, "eksct": 11, "termin": [11, 47], "adequ": 11, "permiss": [11, 12, 24], "bracket": 11, "m5": 11, "min": [11, 20, 28], "tag": [11, 37, 48], "env": [11, 46, 47], "persistentvolum": 11, "media": [11, 24, 46], "access_key_id": 11, "secret_access_kei": 11, "django_settings_modul": [11, 13, 47], "super": [11, 44, 46, 47], "yaml": [11, 19], "bsyncr": 11, "analysi": [11, 15], "bsyncr_server_port": 11, "5000": [11, 16], "bsyncr_server_host": 11, "sentri": 11, "sentry_raven_dsn": 11, "self": [11, 19, 28, 34, 36, 44, 45], "registr": 11, "secur": 11, "google_recaptcha_site_kei": 11, "recaptcha": 11, "google_recaptcha_secret_kei": 11, "imag": [11, 46], "noaa": 11, "noaa_token": 11, "context": [11, 17, 37, 45], "onlin": 11, "status": 11, "extern": 11, "ingress": 11, "someth": [11, 46, 47], "loadbalanc": 11, "154": 11, "227": 11, "my": [11, 13, 47], "uniqu": [11, 16, 34], "32291": 11, "tcp": 11, "dedeploi": 11, "find": [11, 15, 20, 34, 47], "talk": 11, "kubeconfig": 11, "yourself": [11, 46, 47], "seedorg": [11, 47], "badpass": [11, 13, 47], "restart": [11, 13, 16, 46, 47], "rollout": 11, "copyright": [12, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "2017": 12, "2024": [12, 20], "allianc": [12, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "sustain": [12, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "llc": [12, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "contributor": [12, 18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "right": [12, 29, 48], "reserv": [12, 45], "redistribut": 12, "modif": [12, 19], "permit": 12, "condit": [12, 20, 34], "met": 12, "retain": [12, 34], "notic": 12, "disclaim": 12, "reproduc": 12, "materi": 12, "neither": 12, "holder": [12, 41], "nor": 12, "endors": 12, "promot": [12, 34], "deriv": [12, 34], "prior": 12, "claus": 12, "trademark": 12, "confusingli": 12, "similar": [12, 13, 34], "design": 12, "govern": 12, "employe": 12, "respect": [12, 34], "BY": 12, "THE": 12, "AND": 12, "AS": 12, "OR": [12, 44], "impli": 12, "warranti": 12, "BUT": 12, "limit": 12, "TO": [12, 13, 47], "OF": 12, "merchant": 12, "fit": 12, "FOR": 12, "particular": [12, 14, 15, 34], "IN": 12, "NO": 12, "event": [12, 15, 34], "shall": 12, "THEIR": 12, "liabl": 12, "direct": 12, "incident": 12, "special": [12, 16, 34], "exemplari": 12, "consequenti": 12, "damag": 12, "procur": 12, "substitut": 12, "good": [12, 41], "profit": 12, "busi": 12, "interrupt": 12, "ON": [12, 13, 47], "theori": 12, "liabil": 12, "contract": 12, "strict": 12, "tort": 12, "neglig": 12, "aris": 12, "advis": 12, "SUCH": 12, "2014": 12, "regent": 12, "univers": 12, "california": 12, "lawrenc": 12, "berkelei": 12, "subject": [12, 24], "receipt": 12, "dept": 12, "thereof": 12, "while": [13, 15, 46], "bare": 13, "bone": 13, "counterpart": 13, "desktop": [13, 46], "ppa": [13, 16], "timescal": [13, 16, 47], "python3": [13, 47], "gdal": 13, "selenium": 13, "protractor": 13, "jre": 13, "seeddb": [13, 16, 47], "seedpass": [13, 16, 47], "prompt": [13, 47], "tune": [13, 16], "su": [13, 47], "grant": [13, 47], "privileg": [13, 47], "alter": [13, 47], "createrol": 13, "exit": [13, 47], "pip3": [13, 16], "gi": [13, 16, 47], "localhost": [13, 16, 47], "could": [13, 16, 18, 28, 36, 46, 47], "mysql": 13, "dbshell": 13, "127": [13, 16, 41, 46, 47], "lbnl": 13, "Of": [13, 47], "cours": [13, 47], "somewher": [13, 47], "8000": [13, 47], "runserv": [13, 18, 47], "sit": 13, "behind": [13, 16], "dj": 13, "collectstat": 13, "shrinkwrap": 13, "node_modul": 13, "openlay": 13, "ext": 13, "static_root": 13, "collected_stat": 13, "dedic": 13, "receiv": [13, 34, 41], "bashrc": [13, 47], "overrid": [13, 22, 34, 44], "sentry_dsn": 13, "xyz": 13, "getsentri": 13, "123": 13, "only_http": 13, "email_backend": 13, "django_s": 13, "sesbackend": 13, "consol": [13, 48], "quickstart": 13, "sandbox": 13, "sender": [13, 34], "recipi": 13, "notif": 13, "sn": 13, "notifi": 13, "bounc": 13, "dkim": 13, "spf": 13, "put": [13, 47, 48], "compat": [13, 20], "gmail": 13, "emailbackend": 13, "domain_urlconf": 13, "down": [14, 44, 46], "overview": 14, "batch": 14, "invok": 14, "save_raw_data": 14, "done": [14, 19, 44, 47, 48], "know": [14, 15], "portfolio": [14, 22, 28], "metadata": 14, "data_import": [14, 22], "dataimportbackend": 14, "upload_complet": 14, "attribut": [14, 29, 44], "importfil": [14, 22, 44], "subsequ": [14, 15], "exactli": 14, "space": [14, 24, 34], "uppercas": 14, "relationship": [15, 34, 44], "between": [15, 24, 46, 47], "tax": [15, 20, 34], "criteria": 15, "customiz": 15, "high": [15, 20, 34], "identifi": [15, 16, 20], "represent": [15, 19], "discard": 15, "phone": 15, "shouldn": [15, 16], "much": [15, 41, 47], "whenev": 15, "execut": [15, 20, 24, 34, 45], "few": [15, 48], "unrel": 15, "scope": 15, "scenario": [15, 34], "exclud": [15, 19, 20, 22, 34], "overlap": 15, "prioriti": [15, 29, 34], "final": [15, 16, 28], "give": [15, 47], "protect": [15, 44], "period": [15, 34], "meter": [15, 16, 17, 22, 34], "mean": 15, "aggreg": 15, "altern": 15, "themselv": [15, 48], "mention": 15, "earlier": 15, "assumpt": 15, "avoid": [15, 47, 48], "unresolv": 15, "situat": [15, 46], "wouldn": 15, "cross": 15, "alreadi": [15, 16, 34, 47], "individu": 15, "explicit": 15, "trigger": [15, 46], "explicitli": 15, "chosen": 15, "incom": 15, "whole": [15, 18, 48], "round": 15, "origin": [15, 34], "establish": 15, "reestablish": 15, "commit": [15, 48], "affect": 15, "difficult": 15, "revers": [15, 20, 24, 34], "tri": 15, "unmerg": 15, "unlink": 15, "intervent": 15, "accomplish": 15, "veri": [15, 16, 34], "fact": 15, "lead": 15, "carri": 15, "consider": [15, 22], "taken": [15, 19], "entri": [15, 19, 26], "anoth": [15, 18], "oppos": 15, "amongst": 15, "duplic": [15, 16, 28, 34, 41, 47, 48], "flag": 15, "doesn": [15, 46], "bit": 16, "celery_result_backend": 16, "celery_task_default_queu": 16, "celery_task_queu": 16, "exchang": 16, "routing_kei": 16, "censu": 16, "tract": 16, "disadvantag": 16, "around": [16, 44], "minut": 16, "across": [16, 19, 34], "gaug": 16, "impact": 16, "deprec": [16, 41], "often": 16, "aros": 16, "upsert": 16, "typic": [16, 20, 34], "seed_column": 16, "300": 16, "kbtu": [16, 20], "ft2": 16, "units_pint": [16, 34], "complex": 16, "column_id": [16, 34], "seed_columnmapping_": 16, "constraint": 16, "seed_columnmapping_column_raw": 16, "old_id": 16, "seed_columnmapping_column_map": 16, "encount": [16, 19], "0118_match_merge_link_all_org": 16, "reorder": 16, "118": 16, "recogn": 16, "cycl": [16, 17, 41], "fulli": [16, 24], "superperm": 16, "whole_org_match_merge_link": 16, "insid": [16, 41, 46], "seri": 16, "tap": [16, 48], "timescaledb_mov": 16, "awhil": 16, "recalcul": 16, "pars": [16, 19, 34], "bldg": [16, 34], "cast": [16, 34], "bytestr": 16, "On": 16, "indic": [16, 41], "postgres_container_id": 16, "operationalerror": 16, "bower": 16, "vendor": 16, "css": 16, "default_file_storag": 16, "filesystemstorag": 16, "sign": 16, "submodul": [17, 25, 38], "templat": [17, 34, 45, 47], "sentry_j": [17, 18], "session_kei": [17, 18], "de_camel_cas": [17, 18], "robots_txt": [17, 18], "wsgi": [17, 19], "inherit": 17, "comparisonerror": [17, 20], "dataqualitycheck": [17, 20], "dataqualitytypecasterror": [17, 20], "unitmismatcherror": [17, 20], "format_pint_viol": [17, 20], "notdeletedmanag": [17, 22], "kbtu_thermal_conversion_factor": [17, 22], "usage_point_id": [17, 22], "subpackag": [17, 41], "customcreateuserform": [17, 24], "loginform": [17, 24], "userlogintest": [17, 24], "account_activation_s": [17, 24], "create_account": [17, 24], "landing_pag": [17, 24], "password_reset": [17, 24], "password_reset_complet": [17, 24], "password_reset_confirm": [17, 24], "password_reset_don": [17, 24], "password_set": [17, 24], "signup": [17, 19, 24, 41], "mapper": [17, 19], "create_column_regex": [17, 28], "get_pm_map": [17, 28], "mapping_column": 17, "mappingcolumn": [17, 28], "sort_dupl": [17, 28], "mapping_data": 17, "test_mapp": 17, "test_mapping_column": 17, "get_attrs_with_map": [17, 29], "get_propertystate_attr": [17, 29], "get_state_attr": [17, 29], "get_state_to_state_tupl": [17, 29], "get_taxlotstate_attr": [17, 29], "merge_st": [17, 29, 34], "seed_map": [17, 19], "auditlog": 17, "columncastexcept": [17, 34], "validate_model": [17, 34], "statuslabel": [17, 20, 34, 36], "propertyauditlog": [17, 34], "propertyview": [17, 20, 34], "post_save_property_st": [17, 34], "post_save_property_view": [17, 34], "pre_delete_st": [17, 34], "sync_latitude_longitude_and_long_lat": [17, 34], "taxlotauditlog": [17, 34], "taxlotview": [17, 20, 34], "post_save_taxlot_st": [17, 34], "post_save_taxlot_view": [17, 34], "templatetag": [17, 19], "helper": [17, 19, 28, 37, 41, 44], "decor": [17, 44], "decoratormixin": [17, 19], "ajax_request": [17, 19], "ajax_request_class": [17, 19], "get_prog_kei": [17, 19], "lock_and_track": [17, 19], "require_organization_id": [17, 19], "require_organization_id_class": [17, 19], "require_organization_membership": [17, 19], "factori": [17, 38, 39], "build_shared_buildings_org": [17, 19], "create_inventory_queryset": [17, 19], "get_inventory_fieldnam": [17, 19], "get_orgs_w_public_field": [17, 19], "inventory_search_filter_sort": [17, 19], "parse_bodi": [17, 19], "process_search_param": [17, 19], "search_inventori": [17, 19], "search_properti": [17, 19], "search_taxlot": [17, 19], "delete_organ": [17, 19], "invite_new_user_to_se": [17, 19], "send_salesforce_error_log": [17, 19], "signuptokengener": [17, 19], "celerydatetimeseri": [17, 36], "labelseri": [17, 36], "adminviewstest": [17, 19, 41], "classdecoratortest": [17, 19, 41], "requireorganizationidtest": [17, 19, 41], "testdecor": [17, 19, 41], "testexcept": [17, 19, 41], "testtask": [17, 19, 41], "getdatasetsviewstest": [17, 19, 41], "importfileviewstest": [17, 19, 41], "inventoryviewtest": [17, 19, 41], "mainviewtest": [17, 19, 41], "testmcmview": [17, 19, 41], "assertdictsubsetmixin": [17, 19, 41], "datamappingbasetestcas": [17, 19, 41], "deletemodelstestcas": [17, 19, 41], "fakecli": [17, 19, 41], "fakerequest": [17, 19, 41], "apibypasscsrfmiddlewar": [17, 44], "orgcreatemixin": [17, 44], "orgcreateupdatemixin": [17, 44], "orgmixin": [17, 44], "orgquerysetmixin": [17, 44], "orgupdatemixin": [17, 44], "orgvalidatemixin": [17, 44], "orgvalid": [17, 44], "profileidmixin": [17, 44], "api_endpoint": [17, 44], "api_endpoint_class": [17, 44], "clean_api_regex": [17, 44], "drf_api_endpoint": [17, 44], "format_api_docstr": [17, 44], "get_all_url": [17, 44], "get_api_endpoint": [17, 44], "get_api_request_us": [17, 44], "get_org_id_from_valid": [17, 44], "rgetattr": [17, 44], "get_source_typ": [17, 44], "create_organ": [17, 44], "create_suborgan": [17, 44], "default_pm_map": [17, 44], "convert_datestr": [17, 44], "convert_to_js_timestamp": [17, 44], "parse_datetim": [17, 44], "tm": [18, 19, 20, 22, 24, 25, 26, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "template_context": 18, "expos": 18, "runfcgi": 18, "discov": 18, "wsgi_appl": 18, "sens": 18, "later": [18, 28, 46], "deleg": [18, 20, 24, 34], "introduc": 18, "middlewar": [18, 44], "framework": [18, 44], "breadcrumb": 19, "breadcrumbnod": [19, 37], "render": [19, 24, 37, 48], "urlbreadcrumbnod": [19, 37], "breadcrumb_root": [19, 37], "breadcrumb_url": [19, 37], "breadcrumb_url_root": [19, 37], "create_crumb": [19, 37], "create_crumb_first": [19, 37], "factor": [19, 22, 38], "chomski": [19, 38, 39], "djangofunctionalfactori": [19, 38, 39], "invalid_test_cc_numb": [19, 38, 39], "rand_bool": [19, 38, 39], "rand_citi": [19, 38, 39], "rand_city_suffix": [19, 38, 39], "rand_curr": [19, 38, 39], "rand_dat": [19, 38, 39], "rand_domain": [19, 38, 39], "rand_email": [19, 38, 39], "rand_float": [19, 38, 39], "rand_int": [19, 38, 39], "rand_nam": [19, 38, 39], "rand_phon": [19, 38, 39], "rand_plant_nam": [19, 38, 39], "rand_str": [19, 38, 39], "rand_street_address": [19, 38, 39], "rand_street_suffix": [19, 38, 39], "test_cc_numb": [19, 38, 39], "valid_test_cc_numb": [19, 38, 39], "test_add_org": [19, 41], "test_add_org_dup": [19, 41], "test_add_user_existing_org": [19, 41], "test_add_user_new_org": [19, 41], "test_add_user_no_org": [19, 41], "test_signup_process": [19, 41], "test_signup_process_force_lowercase_email": [19, 41], "test_ajax_request_class_dict": [19, 41], "test_ajax_request_class_dict_status_error": [19, 41], "test_ajax_request_class_dict_status_fals": [19, 41], "test_ajax_request_class_format_typ": [19, 41], "test_require_organization_id_class_no_org_id": [19, 41], "test_require_organization_id_class_org_id": [19, 41], "test_require_organization_id_class_org_id_not_int": [19, 41], "test_require_organization_id_fail_no_kei": [19, 41], "test_require_organization_id_fail_not_numer": [19, 41], "test_require_organization_id_success_integ": [19, 41], "test_require_organization_id_success_str": [19, 41], "lock": [19, 41], "pk": [19, 41, 44], "test_get_prog_kei": [19, 41], "test_increment_cach": [19, 41], "test_lock": [19, 41], "test_locking_w_except": [19, 41], "test_progress": [19, 41], "unlock": [19, 41], "test_delete_organ": [19, 41], "test_delete_dataset": [19, 41], "test_get_dataset": [19, 41], "test_get_datasets_count": [19, 41], "test_get_datasets_count_invalid": [19, 41], "test_update_dataset": [19, 41], "test_delete_fil": [19, 41], "test_get_import_fil": [19, 41], "test_get_matching_and_geocoding_result": [19, 41], "test_get_cycl": [19, 41], "test_get_properti": [19, 41], "test_get_properties_cycle_id": [19, 41], "test_get_properties_empty_pag": [19, 41], "test_get_properties_page_not_an_integ": [19, 41], "test_get_properties_pint_field": [19, 41], "test_get_properties_profile_id": [19, 41], "test_get_properties_property_extra_data": [19, 41], "test_get_properties_select_al": [19, 41], "test_get_properties_taxlot_extra_data": [19, 41], "test_get_properties_with_taxlot": [19, 41], "test_get_properties_with_taxlots_with_footprint": [19, 41], "test_get_properties_wrong_query_param": [19, 41], "test_get_property_column": [19, 41], "test_get_property_multiple_taxlot": [19, 41], "test_get_taxlot": [19, 41], "test_get_taxlot_column": [19, 41], "test_get_taxlots_empty_pag": [19, 41], "test_get_taxlots_extra_data": [19, 41], "test_get_taxlots_multiple_taxlot": [19, 41], "test_get_taxlots_no_cycle_id": [19, 41], "test_get_taxlots_page_not_an_integ": [19, 41], "test_get_taxlots_profile_id": [19, 41], "test_postoffic": [19, 41], "test_update_pint_fields_with_modified_display_set": [19, 41], "test_hom": [19, 41], "assert_expected_map": [19, 41], "expected_map": [19, 41], "raw_columns_expect": [19, 41], "test_create_dataset": [19, 41], "test_get_column_mapping_suggest": [19, 41], "test_get_column_mapping_suggestions_pm_fil": [19, 41], "test_get_column_mapping_suggestions_with_column": [19, 41], "test_get_raw_column_nam": [19, 41], "test_save_column_map": [19, 41], "test_save_column_mappings_idempot": [19, 41], "assertdictcontainssubset": [19, 41], "create_import_fil": [19, 41], "set_up": [19, 41], "teardown": [19, 41], "meta": [19, 24, 36, 41], "bodi": [19, 41], "convert": [19, 44], "mixin": [19, 44], "loginrequiredmixin": 19, "login_requir": [19, 44], "myview": 19, "someview": 19, "some_decor": 19, "func": 19, "annoi": 19, "slash": 19, "serializ": [19, 36], "http_accept": 19, "my_view": 19, "news_titl": 19, "titl": [19, 37], "func_nam": 19, "import_file_pk": 19, "fn": [19, 44], "arg": [19, 20, 22, 24, 26, 34, 36, 44, 45], "kwarg": [19, 20, 22, 24, 34, 36, 41, 44, 45], "executor": 19, "int": [19, 28, 34, 44], "pertain": [19, 22], "sibl": 19, "inventory_typ": [19, 34, 48], "order_bi": 19, "other_org": 19, "cycle_id": [19, 34], "queryset": [19, 20, 22, 44], "inst": [19, 29, 34, 44], "str": [19, 34, 44], "publicli": 19, "sort": [19, 28], "tax_lot_id": [19, 20], "sort_revers": 19, "bool": [19, 20, 28, 34, 44], "asc": 19, "dsc": 19, "pagin": 19, "number_per_pag": 19, "show_shared_build": [19, 24], "global": [19, 44, 45, 47], "other_search_param": 19, "project_id": 19, "is_api_request": 19, "intern": 19, "boolean": [19, 20, 28, 34], "fieldnam": [19, 20, 44], "unicod": [19, 20], "org_pk": 19, "delete_organization_build": 19, "email_address": 19, "user_pk": 19, "first_nam": [19, 24], "invit": 19, "newli": 19, "default_token_gener": 19, "new_us": 19, "noth": 19, "sync": [19, 24], "aleck": 19, "landgraf": 19, "token_gener": 19, "master": [19, 24], "expir": 19, "three": 19, "dai": 19, "strategi": 19, "mechan": 19, "check_token": 19, "token_expir": 19, "make_token": 19, "data_qu": 20, "doesnotexist": [20, 24, 34], "objectdoesnotexist": [20, 24, 34], "multipleobjectsreturn": [20, 24, 34], "required_field": [20, 24], "add_invalid_geometry_entry_provid": 20, "row_id": 20, "add_result_comparison_error": 20, "rule_check": 20, "add_result_dimension_error": 20, "add_result_is_nul": 20, "add_result_max_error": 20, "rule_max": 20, "add_result_min_error": 20, "rule_min": 20, "add_result_missing_and_non": 20, "add_result_missing_req": 20, "add_result_string_error": 20, "add_result_type_error": 20, "add_rul": 20, "add_rule_if_new": 20, "cache_kei": 20, "check_data": 20, "record_typ": [20, 34], "get_fieldnam": 20, "wrapper": [20, 24, 34], "defer": [20, 24, 34], "read": [20, 22, 24, 34], "initialize_cach": 20, "chunk": 20, "random": 20, "initialize_rul": 20, "accessor": [20, 24, 34], "side": [20, 24, 34, 48], "forwardonetoonedescriptor": [20, 24, 34], "subclass": [20, 22, 24, 26, 34, 36], "foreignkei": [20, 24, 34], "related_nam": [20, 24, 34], "forwardmanytoonedescriptor": [20, 24, 34], "remove_all_rul": 20, "remove_status_label": 20, "label_class": 20, "linked_id": 20, "rang": 20, "either": [20, 34, 41, 44, 46, 47, 48], "reset_all_rul": 20, "reiniti": 20, "reset_default_rul": 20, "reset_result": 20, "classmethod": [20, 24, 34, 39], "retriev": [20, 34, 41, 44], "previous": 20, "backward": 20, "obj": [20, 36, 44], "retrieve_result_by_address": 20, "retrieve_result_by_tax_lot_id": 20, "jurisdict": [20, 34], "reversemanytoonedescriptor": [20, 24, 34], "create_forward_many_to_many_manag": [20, 24, 34], "save_to_cach": 20, "rememb": 20, "update_status_label": 20, "add_to_result": 20, "default_rul": 20, "not_nul": 20, "rule_typ": 20, "conditioned_floor_area": [20, 34], "7000000": 20, "ft": 20, "energy_scor": [20, 34], "generation_d": [20, 34], "20241231": 20, "18890101": 20, "occupied_floor_area": [20, 34], "recent_sale_d": [20, 34], "site_eui": [20, 34], "site_eui_weather_norm": [20, 34], "source_eui": [20, 34], "source_eui_weather_norm": [20, 34], "1700": 20, "rule_exclud": 20, "rule_includ": 20, "rule_not_nul": 20, "rule_rang": 20, "rule_requir": 20, "rule_type_custom": 20, "rule_type_default": 20, "severity_error": 20, "severity_valid": 20, "severity_warn": 20, "type_area": 20, "type_d": 20, "type_eui": 20, "type_numb": 20, "type_str": 20, "type_year": 20, "data_quality_check": 20, "data_quality_check_id": 20, "for_derived_column": 20, "format_str": 20, "get_data_type_displai": 20, "integerfield": [20, 34], "get_rule_type_displai": 20, "get_severity_displai": 20, "maximum_valid": 20, "greater": [20, 28, 47], "maximum": [20, 45], "minimum_valid": 20, "less": 20, "minimum": 20, "status_label": 20, "status_label_id": 20, "str_to_data_typ": 20, "therefor": 20, "definit": 20, "variant": 20, "text_match": 20, "valid_text": 20, "text": 20, "regex": [20, 28, 44], "source_valu": 20, "pint": 20, "violat": [20, 34], "human": [20, 44], "readabl": [20, 41, 44], "quantiti": 20, "formatted_valu": 20, "formatted_min": 20, "formatted_max": 20, "get_al": 22, "filesystem": 22, "get_queryset": [22, 44], "behavior": 22, "use_for_related_field": 22, "countri": 22, "thermal": 22, "convers": 22, "nrel": [22, 28], "deduc": 22, "regard": 22, "align": 22, "thermal_conversion_assumpt": 22, "enum": 22, "concept": 22, "sole": 22, "irrespect": 22, "raw_source_id": 22, "extract": 22, "usag": 22, "greenbutton": 22, "uri": 22, "eula": [24, 25], "usercreationform": 24, "alia": [24, 36, 44, 47], "widget": 24, "emailinput": 24, "base_field": 24, "password1": 24, "charfield": [24, 34], "password2": 24, "emailfield": 24, "declared_field": 24, "auto_id": 24, "id_": 24, "prefix": [24, 44], "error_class": 24, "errorlist": 24, "label_suffix": 24, "empty_permit": 24, "field_ord": 24, "use_required_attribut": 24, "abstractbaseus": 24, "permissionsmixin": 24, "abstract": 24, "compliant": [24, 34], "username_field": 24, "analysis_set": 24, "columnmapping_set": 24, "cycle_set": 24, "date_join": 24, "deactivate_us": 24, "default_building_detail_custom_column": 24, "default_custom_column": 24, "default_organ": [24, 44], "default_organization_id": 24, "email_us": 24, "from_email": 24, "generate_kei": 24, "adapt": 24, "tastypi": 24, "toastdriven": 24, "l47": 24, "get_absolute_url": 24, "get_full_nam": 24, "plu": 24, "last_nam": 24, "get_next_by_date_join": 24, "datetimefield": [24, 34], "is_next": [24, 34], "get_previous_by_date_join": 24, "get_short_nam": 24, "greenassessmentpropertyauditlog_set": 24, "pizza": [24, 34], "manytomanyfield": [24, 34], "manytomanydescriptor": [24, 34], "importrecord_set": 24, "is_staff": 24, "logentry_set": 24, "modified_import_record": 24, "oauth2_provider_accesstoken": 24, "oauth2_provider_appl": 24, "oauth2_provider_gr": 24, "oauth2_provider_refreshtoken": 24, "usermanag": 24, "organizationuser_set": 24, "postofficeemail_set": 24, "postofficeemailtemplate_set": 24, "process_header_request": 24, "user_permiss": 24, "methodnam": [24, 41], "runtest": [24, 41], "testcas": [24, 41], "hook": [24, 34, 41], "fixtur": [24, 41], "exercis": [24, 41], "test_simple_login": 24, "happi": [24, 41], "uidb64": 24, "ToS": 26, "update_eula": 26, "stdout": [26, 46], "stderr": 26, "no_color": 26, "force_color": 26, "basecommand": 26, "dan": [28, 29], "gunter": [28, 29], "dkgunter": [28, 29], "lbl": [28, 29, 47], "raw_column": [28, 41], "sanit": 28, "raw_data": 28, "resolve_dupl": 28, "xlsx": 28, "attempt": 28, "from_field": 28, "nichola": 28, "dest_column": 28, "previous_map": 28, "map_arg": 28, "default_map": 28, "threshold": 28, "probabilist": 28, "unknown": 28, "mainli": 28, "build_column_map": 28, "add_map": 28, "potenti": 28, "preced": 28, "apply_threshold": 28, "suggest": 28, "meet": 28, "forc": [28, 34, 41, 44], "separ": [28, 36, 46], "equal": 28, "final_map": 28, "downstream": 28, "raw_column_1": 28, "db_column_1": 28, "raw_column_2": 28, "first_suggested_map": 28, "grab": 28, "dup_map_field": 28, "highest": 28, "win": 28, "battl": 28, "set_initial_mapping_cmp": 28, "initial_mapping_cmp": 28, "hash": [28, 34], "detect": 28, "cmp": 28, "data_set_build": 29, "attr": 29, "state_list": 29, "merged_st": [29, 34], "state1": [29, 34], "state2": [29, 34], "ignore_merge_protect": 29, "favor": [29, 34], "column_exclude_field": 34, "bounding_box": 34, "centroid": 34, "data_st": [34, 41], "import_fil": [34, 44], "long_lat": 34, "hash_object": 34, "normalized_address": 34, "source_eui_modeled_orig": 34, "site_eui_orig": 34, "occupied_floor_area_orig": 34, "site_eui_weather_normalized_orig": 34, "site_eui_modeled_orig": 34, "source_eui_orig": 34, "gross_floor_area_orig": 34, "conditioned_floor_area_orig": 34, "source_eui_weather_normalized_orig": 34, "column_merge_favor_exist": 34, "column_merge_favor_new": 34, "column_merge_protect": 34, "pm_parent_property_id": 34, "jurisdiction_property_id": 34, "audit": [34, 41], "audit_template_building_id": 34, "postal": 34, "latitud": 34, "longitud": 34, "footprint": 34, "property_footprint": 34, "geometri": 34, "taxlot_footprint": 34, "datetim": [34, 44], "gross": 34, "use_descript": 34, "star": 34, "score": 34, "integ": 34, "property_not": 34, "property_typ": 34, "telephon": 34, "building_count": 34, "sale": 34, "occupi": 34, "home_energy_score_id": 34, "weather": 34, "site_eui_model": 34, "source_eui_model": 34, "alert": 34, "energy_alert": 34, "space_alert": 34, "number_properti": 34, "egrid": 34, "subregion": 34, "egrid_subregion_cod": 34, "total": [34, 45], "ghg": 34, "emiss": 34, "total_ghg_emiss": 34, "margin": 34, "total_marginal_ghg_emiss": 34, "intens": 34, "total_ghg_emissions_intens": 34, "ghg_intens": 34, "total_marginal_ghg_emissions_intens": 34, "zone": 34, "property_timezon": 34, "data_type_pars": 34, "callabl": 34, "fromisoformat": 34, "float": 34, "excluded_api_field": 34, "excluded_column_return_field": 34, "excluded_mapping_field": 34, "geocoded_address": 34, "geocoded_postal_cod": 34, "geocoded_side_of_street": 34, "geocoded_countri": 34, "geocoded_st": 34, "geocoded_counti": 34, "geocoded_c": 34, "geocoded_neighborhood": 34, "excluded_rename_from_field": 34, "excluded_rename_to_field": 34, "internal_type_to_data_typ": 34, "booleanfield": 34, "datefield": 34, "floatfield": 34, "doubl": [34, 44], "jsonfield": 34, "pointfield": 34, "polygonfield": 34, "textfield": 34, "pinned_column": 34, "quantity_unit_column": 34, "shared_field_typ": 34, "shared_non": 34, "shared_publ": 34, "unmappable_property_field": 34, "unmappable_taxlot_field": 34, "account_name_column": 34, "actual_emission_column": 34, "actual_energy_column": 34, "benchmark_id_column": 34, "cast_column_valu": 34, "column_data_typ": 34, "allow_non": 34, "rais": [34, 36, 44], "castexcept": 34, "wide": 34, "clean_field": 34, "validationerror": 34, "non_field_error": 34, "column_list_profil": 34, "columnlistprofilecolumn_set": 34, "comstock_map": 34, "contact_email_column": 34, "contact_name_column": 34, "create_map": 34, "arrai": 34, "columnmap": 34, "create_mappings_from_fil": 34, "absolut": 34, "data_admin_account_name_column": 34, "data_admin_email_column": 34, "data_admin_name_column": 34, "dataviewparameter_set": 34, "delete_al": 34, "invalid": 34, "irrevers": 34, "column_map": 34, "derived_column": 34, "restaur": 34, "onetoonefield": 34, "derived_column_id": 34, "derivedcolumn_set": 34, "derivedcolumnparameter_set": 34, "geocoding_ord": 34, "get_merge_protection_displai": 34, "merge_protect": 34, "get_next_by_cr": 34, "get_next_by_modifi": 34, "get_previous_by_cr": 34, "get_previous_by_modifi": 34, "get_shared_field_type_displai": 34, "is_matching_criteria": 34, "mapped_map": 34, "raw_map": 34, "recognize_empti": 34, "rename_column": 34, "new_column_nam": 34, "vice": 34, "versa": 34, "overwrit": [34, 46], "retrieve_al": 34, "org_id": [34, 44], "liter": 34, "only_us": 34, "include_rel": 34, "exclude_deriv": 34, "grid": 34, "retrieve_all_by_tupl": 34, "retrieve_db_field_name_for_hash_comparison": 34, "independ": 34, "md5": 34, "quickli": 34, "superset": [34, 41], "retrieve_db_field_table_and_names_from_db_t": 34, "retrieve_db_field": 34, "retrieve_db_fields_from_db_t": 34, "retrieve_db_typ": 34, "field_nam": 34, "field_name_2": 34, "data_type_2": 34, "retrieve_mapping_column": 34, "retrieve_prior": 34, "data_007": 34, "data_008": 34, "salesforce_column": 34, "force_insert": 34, "force_upd": 34, "insist": 34, "equival": [34, 44], "save_column_nam": 34, "model_obj": 34, "ever": [34, 44], "seen": [34, 46], "target_emission_column": 34, "target_energy_column": 34, "unit_id": 34, "x_axis_column": 34, "analysispropertyview_set": 34, "dataview_set": 34, "event_set": 34, "get_next_by_end": 34, "get_next_by_start": 34, "get_or_create_default": 34, "get_previous_by_end": 34, "get_previous_by_start": 34, "importfile_set": 34, "propertyview_set": 34, "taxlotproperty_set": 34, "taxlotview_set": 34, "user_id": 34, "color": [34, 36], "super_organ": [34, 36], "show_in_list": [34, 36], "timestampedmodel": 34, "blue_choic": 34, "blue": 34, "color_choic": 34, "red": 34, "light": [34, 41], "green": [34, 47], "white": 34, "orang": 34, "grai": 34, "default_label": 34, "residenti": 34, "exempt": 34, "ownership": 34, "gray_choic": 34, "green_choic": 34, "light_blue_choic": 34, "orange_choic": 34, "red_choic": 34, "white_choic": 34, "and_filter_group": 34, "compliance_label": 34, "exclude_filter_group": 34, "get_color_displai": 34, "django_extens": 34, "creationdatetimefield": 34, "modificationdatetimefield": 34, "indication_label": 34, "or_filter_group": 34, "rule_set": 34, "super_organization_id": 34, "to_dict": 34, "violation_label": 34, "measur": 34, "decim": 34, "unit_typ": 34, "column_set": 34, "get_unit_type_displai": 34, "unit_nam": 34, "overtim": 34, "remain": [34, 47, 48], "unchang": 34, "copy_met": 34, "source_property_id": 34, "source_persist": 34, "aren": 34, "bulk": 34, "reassign": 34, "data_logg": 34, "get_next_by_upd": 34, "get_previous_by_upd": 34, "inventory_docu": 34, "parent_properti": 34, "parent_property_id": 34, "property_set": 34, "parent1": 34, "parent2": 34, "parent_state1": 34, "parent_state2": 34, "import_filenam": 34, "get_record_type_displai": 34, "parent1_id": 34, "parent2_id": 34, "parent_state1_id": 34, "parent_state2_id": 34, "propertyauditlog_parent1": 34, "propertyauditlog_parent2": 34, "state_id": 34, "view_id": 34, "pytz": 34, "timezon": [34, 44], "all_timezon": 34, "alaska": 34, "aleutian": 34, "arizona": 34, "central": 34, "indiana": 34, "eastern": 34, "hawaii": 34, "stark": 34, "michigan": 34, "mountain": 34, "pacif": 34, "samoa": 34, "analysispropertyview": 34, "reverseonetoonedescriptor": 34, "building_fil": 34, "get_data_state_displai": 34, "get_merge_state_displai": 34, "get_source_type_displai": 34, "histori": 34, "measure_set": 34, "merge_relationship": 34, "property_id": 34, "propertyauditlog_st": 34, "propertymeasure_set": 34, "simul": [34, 41], "include_related_data": 34, "mask": 34, "ubidmodel_set": 34, "world": 34, "characterist": 34, "gapauditlog_view": 34, "greenassessmentproperty_set": 34, "initialize_audit_log": 34, "propertyauditlog_view": 34, "tax_lot_st": 34, "tax_lot_view": 34, "ubidmodel": 34, "ahead": 34, "touch": 34, "tax_lot": 34, "taxlotauditlog_parent1": 34, "taxlotauditlog_parent2": 34, "stub": [34, 41], "taxlotauditlog_parent_state1": 34, "taxlotauditlog_parent_state2": 34, "taxlotauditlog_st": 34, "property_st": 34, "property_view": 34, "taxlot_id": 34, "taxlotauditlog_view": 34, "skipkei": 36, "ensure_ascii": 36, "check_circular": 36, "allow_nan": 36, "sort_kei": 36, "indent": 36, "jsonencod": 36, "typeerror": 36, "iter": 36, "seed_decod": 36, "seed_dump": 36, "seed_load": 36, "modelseri": [36, 44], "extra_kwarg": 36, "write_onli": 36, "is_appli": 36, "get_is_appli": 36, "to_represent": 36, "primit": 36, "datatyp": 36, "bitbucket": 37, "mathiasdm": 37, "render_func": 37, "url_nod": 37, "parser": 37, "andrii": 37, "drozdyuk": 37, "url_var": 37, "context_var": 37, "just_context_var": 37, "crumb": 37, "produc": 37, "person_detail": 37, "person_url": 37, "person": 37, "argument": 37, "test_help": 39, "start_year": 39, "1900": 39, "end_year": 39, "2011": 39, "length": 39, "test_admin_view": 41, "dupe": 41, "entir": [41, 44], "creation": 41, "test_decor": 41, "34": 41, "sum": 41, "increment": 41, "had": 41, "finish": [41, 46], "counter": 41, "test_task": 41, "deal": 41, "test_view": 41, "k": 41, "dest_col": 41, "assert": 41, "70": 41, "air": 41, "leakag": 41, "64": 41, "47": 41, "50": 41, "create_dataset": 41, "get_raw_column_nam": 41, "save_column_map": 41, "subset": 41, "necessari": [41, 46], "polyfil": 41, "believ": 41, "compar": [41, 48], "import_file_source_typ": 41, "user_nam": 41, "test_us": 41, "user_password": 41, "test_pass": 41, "deconstruct": 41, "extrem": 41, "weight": 41, "view_func": 41, "remote_addr": 41, "fake_login_path": 41, "get_respons": 44, "turn": 44, "csrf": 44, "csrfviewmiddlewar": 44, "perform_cr": 44, "get_parent_org": 44, "return_obj": 44, "prove": 44, "orgfilt": 44, "nest": 44, "foreign_kei": 44, "force_par": 44, "perform_upd": 44, "org_valid": 44, "my_valid": 44, "myseri": 44, "primarykeyrelatedfield": 44, "query_set": 44, "mymodel": 44, "travers": 44, "underscor": 44, "property__org_id": 44, "validate_org": 44, "get_org_id": 44, "show": [44, 47], "get_show_column": 44, "profile_id": 44, "show_column": 44, "field_1": 44, "field_2": 44, "extra_data_field_1": 44, "extra_data_field_2": 44, "mark": 44, "has_perm": 44, "strip": 44, "todo": 44, "regist": [44, 47], "rest": 44, "is_api_endpoint": 44, "append": 44, "docstr": 44, "consumpt": 44, "urllist": 44, "recurs": 44, "yield": 44, "url_pattern": 44, "view_funct": 44, "examin": [44, 47], "getattr": 44, "deep": 44, "mimic": 44, "org__id": 44, "split": 44, "__": 44, "lst": 44, "immedi": 44, "org_nam": 44, "scratch": 44, "heavili": 44, "current_org": 44, "suborg_nam": 44, "user_rol": 44, "datestr": 44, "make_tz_awar": 44, "31": 44, "2010": 44, "utc": 44, "reconcil": 44, "mcm": 44, "cleaner": 44, "l85": 44, "millisecond": 44, "epoch": 44, "maybe_datetim": 44, "strftime": 44, "cover": 45, "celery_queu": 45, "queu": 45, "n": 45, "wait": [45, 46], "eta": 45, "countdown": 45, "maxconcurr": 45, "error404": 45, "error410": 45, "error500": 45, "health_check": 45, "health": 45, "app_url": 45, "namespac": 45, "sha": 45, "toolbox": 46, "concours": 46, "6038": 46, "Be": 46, "patient": 46, "successfulli": 46, "coupl": 46, "everyth": 46, "converg": 46, "overridden": 46, "forget": 46, "live": 46, "reload": 46, "f": 46, "docker_dev": 46, "probabl": [46, 48], "unfortun": 46, "seed_db_volum": 46, "mount": 46, "seed_media_volum": 46, "folder": [46, 47], "switch": [46, 47], "seed_pgdata_prod": 46, "nocaptur": 46, "worth": 46, "_log": 46, "pdb": 46, "remot": 46, "remote_pdb": 46, "set_trac": 46, "breakpoint": 46, "remotepdb": 46, "session": 46, "41653": 46, "netcat": 46, "nc": 46, "skip": 47, "virtualenv": 47, "conda": 47, "succe": 47, "forg": 47, "crfsuit": 47, "macport": 47, "graphviz": 47, "pyenv": 47, "although": 47, "easiest": 47, "pollut": 47, "easier": 47, "postgresql94": 47, "opt": 47, "defaultdb": 47, "chown": 47, "initdb": 47, "stop": 47, "alias": 47, "postactiv": 47, "pg_start": 47, "pg_ctl": 47, "pg_stop": 47, "launchag": 47, "whoami": 47, "WITH": 47, "postgis2": 47, "becom": 47, "remaind": 47, "maintain": 47, "compil": 47, "gcc": 47, "clang": 47, "cmake": 47, "openssl": 47, "dopenssl_root_dir": 47, "conf": 47, "uncom": [47, 48], "shared_preload_librari": 47, "config_fil": 47, "virtualenvwrapp": 47, "workon": 47, "cc": 47, "cp": 47, "favorit": 47, "editor": 47, "plan_purchas": 47, "business_edit": 47, "business_edition_fre": 47, "me": 47, "consum": 47, "directli": 47, "deadbeef": 47, "hard": 47, "statement": 47, "encapsul": 47, "stand": 47, "alon": 47, "foreground": 47, "seem": 47, "lokalise2": 48, "get_python_transl": 48, "get_angular_transl": 48, "usemissingtranslationhandlerlog": 48, "untransl": 48, "lokal": 48, "tl": 48, "dr": 48, "english": 48, "littl": 48, "care": 48, "held": 48, "languag": 48, "mo": 48, "suppli": 48, "sniff": 48, "accept": 48, "swap": 48, "dom": 48, "wherev": 48, "wrinkl": 48, "plural": 48, "flow": 48, "visibl": 48, "smooth": 48, "nice": 48, "speaker": 48, "screenshot": 48, "clarifi": 48, "phrase": 48, "placehold": 48, "fairli": 48, "straightforward": 48, "profession": 48, "mostli": 48, "visual": 48, "ok": 48, "french": 48, "german": 48, "wordi": 48, "rel": 48, "element": 48, "expand": 48, "oddli": 48, "err": 48, "clever": 48, "aim": 48, "compet": 48, "h2": 48, "include_shared_taxlot": 48, "include_shar": 48}, "objects": {"config": [[18, 0, 0, "-", "template_context"], [18, 0, 0, "-", "tests"], [18, 0, 0, "-", "utils"], [18, 0, 0, "-", "views"], [18, 0, 0, "-", "wsgi"]], "config.template_context": [[18, 1, 1, "", "sentry_js"], [18, 1, 1, "", "session_key"]], "config.utils": [[18, 1, 1, "", "de_camel_case"]], "config.views": [[18, 1, 1, "", "robots_txt"]], "": [[19, 0, 0, "-", "seed"]], "seed": [[22, 0, 0, "-", "data_importer"], [19, 0, 0, "-", "decorators"], [24, 0, 0, "-", "landing"], [27, 0, 0, "-", "lib"], [30, 0, 0, "-", "management"], [34, 0, 0, "-", "models"], [35, 0, 0, "-", "public"], [19, 0, 0, "-", "search"], [36, 0, 0, "-", "serializers"], [19, 0, 0, "-", "tasks"], [38, 0, 0, "-", "test_helpers"], [19, 0, 0, "-", "token_generators"], [19, 0, 0, "-", "utils"], [45, 0, 0, "-", "views"]], "seed.data_importer": [[22, 0, 0, "-", "managers"], [22, 0, 0, "-", "utils"]], "seed.data_importer.managers": [[22, 2, 1, "", "NotDeletedManager"]], "seed.data_importer.managers.NotDeletedManager": [[22, 3, 1, "", "get_all"], [22, 3, 1, "", "get_queryset"], [22, 4, 1, "", "use_for_related_fields"]], "seed.data_importer.utils": [[22, 1, 1, "", "kbtu_thermal_conversion_factors"], [22, 1, 1, "", "usage_point_id"]], "seed.decorators": [[19, 1, 1, "", "DecoratorMixin"], [19, 1, 1, "", "ajax_request"], [19, 1, 1, "", "ajax_request_class"], [19, 1, 1, "", "get_prog_key"], [19, 1, 1, "", "lock_and_track"], [19, 1, 1, "", "require_organization_id"], [19, 1, 1, "", "require_organization_id_class"], [19, 1, 1, "", "require_organization_membership"]], "seed.landing": [[24, 0, 0, "-", "forms"], [25, 0, 0, "-", "management"], [24, 0, 0, "-", "models"], [24, 0, 0, "-", "tests"], [24, 0, 0, "-", "urls"], [24, 0, 0, "-", "views"]], "seed.landing.forms": [[24, 2, 1, "", "CustomCreateUserForm"], [24, 2, 1, "", "LoginForm"]], "seed.landing.forms.CustomCreateUserForm": [[24, 2, 1, "", "Meta"], [24, 4, 1, "", "base_fields"], [24, 4, 1, "", "declared_fields"], [24, 5, 1, "", "media"]], "seed.landing.forms.CustomCreateUserForm.Meta": [[24, 4, 1, "", "fields"], [24, 4, 1, "", "model"], [24, 4, 1, "", "widgets"]], "seed.landing.forms.LoginForm": [[24, 4, 1, "", "base_fields"], [24, 4, 1, "", "declared_fields"], [24, 5, 1, "", "media"]], "seed.landing.management": [[26, 0, 0, "-", "commands"]], "seed.landing.management.commands": [[26, 0, 0, "-", "update_eula"]], "seed.landing.management.commands.update_eula": [[26, 2, 1, "", "Command"]], "seed.landing.management.commands.update_eula.Command": [[26, 3, 1, "", "handle"], [26, 4, 1, "", "help"]], "seed.landing.models": [[24, 2, 1, "", "SEEDUser"]], "seed.landing.models.SEEDUser": [[24, 6, 1, "", "DoesNotExist"], [24, 6, 1, "", "MultipleObjectsReturned"], [24, 4, 1, "", "REQUIRED_FIELDS"], [24, 4, 1, "", "USERNAME_FIELD"], [24, 4, 1, "", "analysis_set"], [24, 4, 1, "", "api_key"], [24, 4, 1, "", "columnmapping_set"], [24, 4, 1, "", "cycle_set"], [24, 4, 1, "", "date_joined"], [24, 3, 1, "", "deactivate_user"], [24, 4, 1, "", "default_building_detail_custom_columns"], [24, 4, 1, "", "default_custom_columns"], [24, 4, 1, "", "default_organization"], [24, 4, 1, "", "default_organization_id"], [24, 4, 1, "", "email"], [24, 3, 1, "", "email_user"], [24, 4, 1, "", "first_name"], [24, 3, 1, "", "generate_key"], [24, 3, 1, "", "get_absolute_url"], [24, 3, 1, "", "get_full_name"], [24, 3, 1, "", "get_next_by_date_joined"], [24, 3, 1, "", "get_previous_by_date_joined"], [24, 3, 1, "", "get_short_name"], [24, 4, 1, "", "greenassessmentpropertyauditlog_set"], [24, 4, 1, "", "groups"], [24, 4, 1, "", "id"], [24, 4, 1, "", "importrecord_set"], [24, 4, 1, "", "is_staff"], [24, 4, 1, "", "last_name"], [24, 4, 1, "", "logentry_set"], [24, 4, 1, "", "modified_import_records"], [24, 4, 1, "", "notes"], [24, 4, 1, "", "oauth2_provider_accesstoken"], [24, 4, 1, "", "oauth2_provider_application"], [24, 4, 1, "", "oauth2_provider_grant"], [24, 4, 1, "", "oauth2_provider_refreshtoken"], [24, 4, 1, "", "objects"], [24, 4, 1, "", "organizationuser_set"], [24, 4, 1, "", "orgs"], [24, 4, 1, "", "postofficeemail_set"], [24, 4, 1, "", "postofficeemailtemplate_set"], [24, 3, 1, "", "process_header_request"], [24, 3, 1, "", "save"], [24, 4, 1, "", "show_shared_buildings"], [24, 4, 1, "", "user_permissions"], [24, 4, 1, "", "username"]], "seed.landing.tests": [[24, 2, 1, "", "UserLoginTest"]], "seed.landing.tests.UserLoginTest": [[24, 3, 1, "", "setUp"], [24, 3, 1, "", "test_simple_login"]], "seed.landing.views": [[24, 1, 1, "", "account_activation_sent"], [24, 1, 1, "", "activate"], [24, 1, 1, "", "create_account"], [24, 1, 1, "", "landing_page"], [24, 1, 1, "", "password_reset"], [24, 1, 1, "", "password_reset_complete"], [24, 1, 1, "", "password_reset_confirm"], [24, 1, 1, "", "password_reset_done"], [24, 1, 1, "", "password_set"], [24, 1, 1, "", "signup"]], "seed.lib": [[28, 0, 0, "-", "mappings"], [29, 0, 0, "-", "merging"]], "seed.lib.mappings": [[28, 0, 0, "-", "mapper"], [28, 0, 0, "-", "mapping_columns"]], "seed.lib.mappings.mapper": [[28, 1, 1, "", "create_column_regexes"], [28, 1, 1, "", "get_pm_mapping"]], "seed.lib.mappings.mapping_columns": [[28, 2, 1, "", "MappingColumns"], [28, 1, 1, "", "sort_duplicates"]], "seed.lib.mappings.mapping_columns.MappingColumns": [[28, 3, 1, "", "add_mappings"], [28, 3, 1, "", "apply_threshold"], [28, 5, 1, "", "duplicates"], [28, 5, 1, "", "final_mappings"], [28, 3, 1, "", "first_suggested_mapping"], [28, 3, 1, "", "resolve_duplicate"], [28, 3, 1, "", "set_initial_mapping_cmp"]], "seed.lib.merging": [[29, 0, 0, "-", "merging"]], "seed.lib.merging.merging": [[29, 1, 1, "", "get_attrs_with_mapping"], [29, 1, 1, "", "get_propertystate_attrs"], [29, 1, 1, "", "get_state_attrs"], [29, 1, 1, "", "get_state_to_state_tuple"], [29, 1, 1, "", "get_taxlotstate_attrs"], [29, 1, 1, "", "merge_state"]], "seed.models": [[34, 0, 0, "-", "auditlog"], [34, 0, 0, "-", "columns"], [34, 0, 0, "-", "cycles"], [20, 0, 0, "-", "data_quality"], [34, 0, 0, "-", "models"], [34, 0, 0, "-", "properties"], [34, 0, 0, "-", "tax_lots"]], "seed.models.columns": [[34, 2, 1, "", "Column"], [34, 6, 1, "", "ColumnCastException"], [34, 1, 1, "", "validate_model"]], "seed.models.columns.Column": [[34, 4, 1, "", "COLUMN_EXCLUDE_FIELDS"], [34, 4, 1, "", "COLUMN_MERGE_FAVOR_EXISTING"], [34, 4, 1, "", "COLUMN_MERGE_FAVOR_NEW"], [34, 4, 1, "", "COLUMN_MERGE_PROTECTION"], [34, 4, 1, "", "DATABASE_COLUMNS"], [34, 4, 1, "", "DATA_TYPE_PARSERS"], [34, 6, 1, "", "DoesNotExist"], [34, 4, 1, "", "EXCLUDED_API_FIELDS"], [34, 4, 1, "", "EXCLUDED_COLUMN_RETURN_FIELDS"], [34, 4, 1, "", "EXCLUDED_MAPPING_FIELDS"], [34, 4, 1, "", "EXCLUDED_RENAME_FROM_FIELDS"], [34, 4, 1, "", "EXCLUDED_RENAME_TO_FIELDS"], [34, 4, 1, "", "INTERNAL_TYPE_TO_DATA_TYPE"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "PINNED_COLUMNS"], [34, 4, 1, "", "QUANTITY_UNIT_COLUMNS"], [34, 4, 1, "", "SHARED_FIELD_TYPES"], [34, 4, 1, "", "SHARED_NONE"], [34, 4, 1, "", "SHARED_PUBLIC"], [34, 4, 1, "", "UNMAPPABLE_PROPERTY_FIELDS"], [34, 4, 1, "", "UNMAPPABLE_TAXLOT_FIELDS"], [34, 4, 1, "", "account_name_column"], [34, 4, 1, "", "actual_emission_column"], [34, 4, 1, "", "actual_energy_column"], [34, 4, 1, "", "benchmark_id_column"], [34, 3, 1, "", "cast"], [34, 3, 1, "", "cast_column_value"], [34, 3, 1, "", "clean"], [34, 4, 1, "", "column_description"], [34, 4, 1, "", "column_list_profiles"], [34, 4, 1, "", "column_name"], [34, 4, 1, "", "columnlistprofilecolumn_set"], [34, 4, 1, "", "comstock_mapping"], [34, 4, 1, "", "contact_email_column"], [34, 4, 1, "", "contact_name_column"], [34, 3, 1, "", "create_mappings"], [34, 3, 1, "", "create_mappings_from_file"], [34, 4, 1, "", "created"], [34, 4, 1, "", "data_admin_account_name_column"], [34, 4, 1, "", "data_admin_email_column"], [34, 4, 1, "", "data_admin_name_column"], [34, 4, 1, "", "data_type"], [34, 4, 1, "", "dataviewparameter_set"], [34, 3, 1, "", "delete_all"], [34, 4, 1, "", "derived_column"], [34, 4, 1, "", "derived_column_id"], [34, 4, 1, "", "derivedcolumn_set"], [34, 4, 1, "", "derivedcolumnparameter_set"], [34, 4, 1, "", "display_name"], [34, 4, 1, "", "geocoding_order"], [34, 3, 1, "", "get_merge_protection_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_modified"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_modified"], [34, 3, 1, "", "get_shared_field_type_display"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_file"], [34, 4, 1, "", "import_file_id"], [34, 4, 1, "", "is_extra_data"], [34, 4, 1, "", "is_matching_criteria"], [34, 4, 1, "", "mapped_mappings"], [34, 4, 1, "", "merge_protection"], [34, 4, 1, "", "modified"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "raw_mappings"], [34, 4, 1, "", "recognize_empty"], [34, 3, 1, "", "rename_column"], [34, 3, 1, "", "retrieve_all"], [34, 3, 1, "", "retrieve_all_by_tuple"], [34, 3, 1, "", "retrieve_db_field_name_for_hash_comparison"], [34, 3, 1, "", "retrieve_db_field_table_and_names_from_db_tables"], [34, 3, 1, "", "retrieve_db_fields"], [34, 3, 1, "", "retrieve_db_fields_from_db_tables"], [34, 3, 1, "", "retrieve_db_types"], [34, 3, 1, "", "retrieve_mapping_columns"], [34, 3, 1, "", "retrieve_priorities"], [34, 4, 1, "", "salesforce_column"], [34, 3, 1, "", "save"], [34, 3, 1, "", "save_column_names"], [34, 4, 1, "", "shared_field_type"], [34, 4, 1, "", "table_name"], [34, 4, 1, "", "target_emission_column"], [34, 4, 1, "", "target_energy_column"], [34, 4, 1, "", "unit"], [34, 4, 1, "", "unit_id"], [34, 4, 1, "", "units_pint"], [34, 4, 1, "", "x_axis_columns"]], "seed.models.cycles": [[34, 2, 1, "", "Cycle"]], "seed.models.cycles.Cycle": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "analysispropertyview_set"], [34, 4, 1, "", "created"], [34, 4, 1, "", "cycles"], [34, 4, 1, "", "dataview_set"], [34, 4, 1, "", "end"], [34, 4, 1, "", "event_set"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_end"], [34, 3, 1, "", "get_next_by_start"], [34, 3, 1, "", "get_or_create_default"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_end"], [34, 3, 1, "", "get_previous_by_start"], [34, 4, 1, "", "id"], [34, 4, 1, "", "importfile_set"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "propertyview_set"], [34, 4, 1, "", "start"], [34, 4, 1, "", "taxlotproperty_set"], [34, 4, 1, "", "taxlotview_set"], [34, 4, 1, "", "user"], [34, 4, 1, "", "user_id"]], "seed.models.data_quality": [[20, 6, 1, "", "ComparisonError"], [20, 2, 1, "", "DataQualityCheck"], [20, 6, 1, "", "DataQualityTypeCastError"], [20, 2, 1, "", "Rule"], [20, 6, 1, "", "UnitMismatchError"], [20, 1, 1, "", "format_pint_violation"]], "seed.models.data_quality.DataQualityCheck": [[20, 6, 1, "", "DoesNotExist"], [20, 6, 1, "", "MultipleObjectsReturned"], [20, 4, 1, "", "REQUIRED_FIELDS"], [20, 3, 1, "", "add_invalid_geometry_entry_provided"], [20, 3, 1, "", "add_result_comparison_error"], [20, 3, 1, "", "add_result_dimension_error"], [20, 3, 1, "", "add_result_is_null"], [20, 3, 1, "", "add_result_max_error"], [20, 3, 1, "", "add_result_min_error"], [20, 3, 1, "", "add_result_missing_and_none"], [20, 3, 1, "", "add_result_missing_req"], [20, 3, 1, "", "add_result_string_error"], [20, 3, 1, "", "add_result_type_error"], [20, 3, 1, "", "add_rule"], [20, 3, 1, "", "add_rule_if_new"], [20, 3, 1, "", "cache_key"], [20, 3, 1, "", "check_data"], [20, 3, 1, "", "get_fieldnames"], [20, 4, 1, "", "id"], [20, 3, 1, "", "initialize_cache"], [20, 3, 1, "", "initialize_rules"], [20, 4, 1, "", "name"], [20, 4, 1, "", "objects"], [20, 4, 1, "", "organization"], [20, 4, 1, "", "organization_id"], [20, 3, 1, "", "remove_all_rules"], [20, 3, 1, "", "remove_status_label"], [20, 3, 1, "", "reset_all_rules"], [20, 3, 1, "", "reset_default_rules"], [20, 3, 1, "", "reset_results"], [20, 3, 1, "", "retrieve"], [20, 3, 1, "", "retrieve_result_by_address"], [20, 3, 1, "", "retrieve_result_by_tax_lot_id"], [20, 4, 1, "", "rules"], [20, 3, 1, "", "save_to_cache"], [20, 3, 1, "", "update_status_label"]], "seed.models.data_quality.Rule": [[20, 4, 1, "", "DATA_TYPES"], [20, 4, 1, "", "DEFAULT_RULES"], [20, 6, 1, "", "DoesNotExist"], [20, 6, 1, "", "MultipleObjectsReturned"], [20, 4, 1, "", "RULE_EXCLUDE"], [20, 4, 1, "", "RULE_INCLUDE"], [20, 4, 1, "", "RULE_NOT_NULL"], [20, 4, 1, "", "RULE_RANGE"], [20, 4, 1, "", "RULE_REQUIRED"], [20, 4, 1, "", "RULE_TYPE"], [20, 4, 1, "", "RULE_TYPE_CUSTOM"], [20, 4, 1, "", "RULE_TYPE_DEFAULT"], [20, 4, 1, "", "SEVERITY"], [20, 4, 1, "", "SEVERITY_ERROR"], [20, 4, 1, "", "SEVERITY_VALID"], [20, 4, 1, "", "SEVERITY_WARNING"], [20, 4, 1, "", "TYPE_AREA"], [20, 4, 1, "", "TYPE_DATE"], [20, 4, 1, "", "TYPE_EUI"], [20, 4, 1, "", "TYPE_NUMBER"], [20, 4, 1, "", "TYPE_STRING"], [20, 4, 1, "", "TYPE_YEAR"], [20, 4, 1, "", "condition"], [20, 4, 1, "", "data_quality_check"], [20, 4, 1, "", "data_quality_check_id"], [20, 4, 1, "", "data_type"], [20, 4, 1, "", "description"], [20, 4, 1, "", "enabled"], [20, 4, 1, "", "field"], [20, 4, 1, "", "for_derived_column"], [20, 3, 1, "", "format_strings"], [20, 3, 1, "", "get_data_type_display"], [20, 3, 1, "", "get_rule_type_display"], [20, 3, 1, "", "get_severity_display"], [20, 4, 1, "", "id"], [20, 4, 1, "", "max"], [20, 3, 1, "", "maximum_valid"], [20, 4, 1, "", "min"], [20, 3, 1, "", "minimum_valid"], [20, 4, 1, "", "name"], [20, 4, 1, "", "not_null"], [20, 4, 1, "", "objects"], [20, 4, 1, "", "required"], [20, 4, 1, "", "rule_type"], [20, 4, 1, "", "severity"], [20, 4, 1, "", "status_label"], [20, 4, 1, "", "status_label_id"], [20, 3, 1, "", "str_to_data_type"], [20, 4, 1, "", "table_name"], [20, 4, 1, "", "text_match"], [20, 4, 1, "", "units"], [20, 3, 1, "", "valid_text"]], "seed.models.models": [[34, 2, 1, "", "StatusLabel"], [34, 2, 1, "", "Unit"]], "seed.models.models.StatusLabel": [[34, 4, 1, "", "BLUE_CHOICE"], [34, 4, 1, "", "COLOR_CHOICES"], [34, 4, 1, "", "DEFAULT_LABELS"], [34, 6, 1, "", "DoesNotExist"], [34, 4, 1, "", "GRAY_CHOICE"], [34, 4, 1, "", "GREEN_CHOICE"], [34, 4, 1, "", "LIGHT_BLUE_CHOICE"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "ORANGE_CHOICE"], [34, 4, 1, "", "RED_CHOICE"], [34, 4, 1, "", "WHITE_CHOICE"], [34, 4, 1, "", "and_filter_groups"], [34, 4, 1, "", "color"], [34, 4, 1, "", "compliance_label"], [34, 4, 1, "", "exclude_filter_groups"], [34, 3, 1, "", "get_color_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_modified"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_modified"], [34, 4, 1, "", "id"], [34, 4, 1, "", "indication_label"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "or_filter_groups"], [34, 4, 1, "", "propertyview_set"], [34, 4, 1, "", "rule_set"], [34, 4, 1, "", "show_in_list"], [34, 4, 1, "", "super_organization"], [34, 4, 1, "", "super_organization_id"], [34, 4, 1, "", "taxlotview_set"], [34, 3, 1, "", "to_dict"], [34, 4, 1, "", "violation_label"]], "seed.models.models.Unit": [[34, 4, 1, "", "DATE"], [34, 4, 1, "", "DATETIME"], [34, 4, 1, "", "DECIMAL"], [34, 6, 1, "", "DoesNotExist"], [34, 4, 1, "", "FLOAT"], [34, 4, 1, "", "INTEGER"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "STRING"], [34, 4, 1, "", "UNIT_TYPES"], [34, 4, 1, "", "column_set"], [34, 3, 1, "", "get_unit_type_display"], [34, 4, 1, "", "id"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "unit_name"], [34, 4, 1, "", "unit_type"]], "seed.models.properties": [[34, 2, 1, "", "Property"], [34, 2, 1, "", "PropertyAuditLog"], [34, 2, 1, "", "PropertyState"], [34, 2, 1, "", "PropertyView"], [34, 1, 1, "", "post_save_property_state"], [34, 1, 1, "", "post_save_property_view"], [34, 1, 1, "", "pre_delete_state"], [34, 1, 1, "", "sync_latitude_longitude_and_long_lat"]], "seed.models.properties.Property": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "analysispropertyview_set"], [34, 3, 1, "", "copy_meters"], [34, 4, 1, "", "created"], [34, 4, 1, "", "data_loggers"], [34, 4, 1, "", "events"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 4, 1, "", "id"], [34, 4, 1, "", "inventory_documents"], [34, 4, 1, "", "meters"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "parent_property"], [34, 4, 1, "", "parent_property_id"], [34, 4, 1, "", "property_set"], [34, 4, 1, "", "updated"], [34, 4, 1, "", "views"]], "seed.models.properties.PropertyAuditLog": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "created"], [34, 4, 1, "", "description"], [34, 3, 1, "", "get_record_type_display"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_filename"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "parent1"], [34, 4, 1, "", "parent1_id"], [34, 4, 1, "", "parent2"], [34, 4, 1, "", "parent2_id"], [34, 4, 1, "", "parent_state1"], [34, 4, 1, "", "parent_state1_id"], [34, 4, 1, "", "parent_state2"], [34, 4, 1, "", "parent_state2_id"], [34, 4, 1, "", "propertyauditlog_parent1"], [34, 4, 1, "", "propertyauditlog_parent2"], [34, 4, 1, "", "record_type"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 4, 1, "", "view"], [34, 4, 1, "", "view_id"]], "seed.models.properties.PropertyState": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "address_line_1"], [34, 4, 1, "", "address_line_2"], [34, 4, 1, "", "analysispropertyview"], [34, 4, 1, "", "audit_template_building_id"], [34, 4, 1, "", "bounding_box"], [34, 4, 1, "", "building_certification"], [34, 4, 1, "", "building_count"], [34, 4, 1, "", "building_files"], [34, 4, 1, "", "centroid"], [34, 4, 1, "", "city"], [34, 3, 1, "", "clean"], [34, 4, 1, "", "conditioned_floor_area"], [34, 4, 1, "", "conditioned_floor_area_orig"], [34, 3, 1, "", "coparent"], [34, 4, 1, "", "created"], [34, 4, 1, "", "custom_id_1"], [34, 4, 1, "", "data_state"], [34, 4, 1, "", "egrid_subregion_code"], [34, 4, 1, "", "energy_alerts"], [34, 4, 1, "", "energy_score"], [34, 4, 1, "", "extra_data"], [34, 4, 1, "", "generation_date"], [34, 4, 1, "", "geocoding_confidence"], [34, 3, 1, "", "get_data_state_display"], [34, 3, 1, "", "get_merge_state_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 3, 1, "", "get_source_type_display"], [34, 4, 1, "", "gross_floor_area"], [34, 4, 1, "", "gross_floor_area_orig"], [34, 4, 1, "", "hash_object"], [34, 3, 1, "", "history"], [34, 4, 1, "", "home_energy_score_id"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_file"], [34, 4, 1, "", "import_file_id"], [34, 4, 1, "", "jurisdiction_property_id"], [34, 4, 1, "", "latitude"], [34, 4, 1, "", "long_lat"], [34, 4, 1, "", "longitude"], [34, 4, 1, "", "lot_number"], [34, 4, 1, "", "measure_set"], [34, 4, 1, "", "measures"], [34, 3, 1, "", "merge_relationships"], [34, 4, 1, "", "merge_state"], [34, 4, 1, "", "normalized_address"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "occupied_floor_area"], [34, 4, 1, "", "occupied_floor_area_orig"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "owner"], [34, 4, 1, "", "owner_address"], [34, 4, 1, "", "owner_city_state"], [34, 4, 1, "", "owner_email"], [34, 4, 1, "", "owner_postal_code"], [34, 4, 1, "", "owner_telephone"], [34, 4, 1, "", "parent_state1"], [34, 4, 1, "", "parent_state2"], [34, 4, 1, "", "pm_parent_property_id"], [34, 4, 1, "", "pm_property_id"], [34, 4, 1, "", "postal_code"], [34, 3, 1, "", "promote"], [34, 4, 1, "", "property_footprint"], [34, 4, 1, "", "property_name"], [34, 4, 1, "", "property_notes"], [34, 4, 1, "", "property_timezone"], [34, 4, 1, "", "property_type"], [34, 4, 1, "", "propertyauditlog_state"], [34, 4, 1, "", "propertymeasure_set"], [34, 4, 1, "", "propertyview_set"], [34, 4, 1, "", "recent_sale_date"], [34, 4, 1, "", "release_date"], [34, 3, 1, "", "save"], [34, 4, 1, "", "scenarios"], [34, 4, 1, "", "simulation"], [34, 4, 1, "", "site_eui"], [34, 4, 1, "", "site_eui_modeled"], [34, 4, 1, "", "site_eui_modeled_orig"], [34, 4, 1, "", "site_eui_orig"], [34, 4, 1, "", "site_eui_weather_normalized"], [34, 4, 1, "", "site_eui_weather_normalized_orig"], [34, 4, 1, "", "source_eui"], [34, 4, 1, "", "source_eui_modeled"], [34, 4, 1, "", "source_eui_modeled_orig"], [34, 4, 1, "", "source_eui_orig"], [34, 4, 1, "", "source_eui_weather_normalized"], [34, 4, 1, "", "source_eui_weather_normalized_orig"], [34, 4, 1, "", "source_type"], [34, 4, 1, "", "space_alerts"], [34, 4, 1, "", "state"], [34, 3, 1, "", "to_dict"], [34, 4, 1, "", "total_ghg_emissions"], [34, 4, 1, "", "total_ghg_emissions_intensity"], [34, 4, 1, "", "total_marginal_ghg_emissions"], [34, 4, 1, "", "total_marginal_ghg_emissions_intensity"], [34, 4, 1, "", "ubid"], [34, 4, 1, "", "ubidmodel_set"], [34, 4, 1, "", "updated"], [34, 4, 1, "", "use_description"], [34, 4, 1, "", "year_built"], [34, 4, 1, "", "year_ending"]], "seed.models.properties.PropertyView": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "cycle"], [34, 4, 1, "", "cycle_id"], [34, 4, 1, "", "gapauditlog_view"], [34, 4, 1, "", "greenassessmentproperty_set"], [34, 4, 1, "", "id"], [34, 5, 1, "", "import_filename"], [34, 3, 1, "", "initialize_audit_logs"], [34, 4, 1, "", "labels"], [34, 4, 1, "", "notes"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "property"], [34, 4, 1, "", "property_id"], [34, 4, 1, "", "propertyauditlog_view"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 3, 1, "", "tax_lot_states"], [34, 3, 1, "", "tax_lot_views"], [34, 4, 1, "", "taxlotproperty_set"]], "seed.models.tax_lots": [[34, 2, 1, "", "TaxLot"], [34, 2, 1, "", "TaxLotAuditLog"], [34, 2, 1, "", "TaxLotState"], [34, 2, 1, "", "TaxLotView"], [34, 1, 1, "", "post_save_taxlot_state"], [34, 1, 1, "", "post_save_taxlot_view"], [34, 1, 1, "", "sync_latitude_longitude_and_long_lat"]], "seed.models.tax_lots.TaxLot": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "created"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 4, 1, "", "id"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "updated"], [34, 4, 1, "", "views"]], "seed.models.tax_lots.TaxLotAuditLog": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "created"], [34, 4, 1, "", "description"], [34, 3, 1, "", "get_record_type_display"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_filename"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "parent1"], [34, 4, 1, "", "parent1_id"], [34, 4, 1, "", "parent2"], [34, 4, 1, "", "parent2_id"], [34, 4, 1, "", "parent_state1"], [34, 4, 1, "", "parent_state1_id"], [34, 4, 1, "", "parent_state2"], [34, 4, 1, "", "parent_state2_id"], [34, 4, 1, "", "record_type"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 4, 1, "", "taxlotauditlog_parent1"], [34, 4, 1, "", "taxlotauditlog_parent2"], [34, 4, 1, "", "view"], [34, 4, 1, "", "view_id"]], "seed.models.tax_lots.TaxLotState": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "address_line_1"], [34, 4, 1, "", "address_line_2"], [34, 4, 1, "", "block_number"], [34, 4, 1, "", "bounding_box"], [34, 4, 1, "", "centroid"], [34, 4, 1, "", "city"], [34, 3, 1, "", "coparent"], [34, 4, 1, "", "created"], [34, 4, 1, "", "custom_id_1"], [34, 4, 1, "", "data_state"], [34, 4, 1, "", "district"], [34, 4, 1, "", "extra_data"], [34, 4, 1, "", "geocoding_confidence"], [34, 3, 1, "", "get_data_state_display"], [34, 3, 1, "", "get_merge_state_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 4, 1, "", "hash_object"], [34, 3, 1, "", "history"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_file"], [34, 4, 1, "", "import_file_id"], [34, 4, 1, "", "jurisdiction_tax_lot_id"], [34, 4, 1, "", "latitude"], [34, 4, 1, "", "long_lat"], [34, 4, 1, "", "longitude"], [34, 3, 1, "", "merge_relationships"], [34, 4, 1, "", "merge_state"], [34, 4, 1, "", "normalized_address"], [34, 4, 1, "", "number_properties"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "postal_code"], [34, 3, 1, "", "promote"], [34, 3, 1, "", "save"], [34, 4, 1, "", "state"], [34, 4, 1, "", "taxlot_footprint"], [34, 4, 1, "", "taxlotauditlog_parent_state1"], [34, 4, 1, "", "taxlotauditlog_parent_state2"], [34, 4, 1, "", "taxlotauditlog_state"], [34, 4, 1, "", "taxlotview_set"], [34, 3, 1, "", "to_dict"], [34, 4, 1, "", "ubid"], [34, 4, 1, "", "ubidmodel_set"], [34, 4, 1, "", "updated"]], "seed.models.tax_lots.TaxLotView": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "cycle"], [34, 4, 1, "", "cycle_id"], [34, 4, 1, "", "id"], [34, 5, 1, "", "import_filename"], [34, 3, 1, "", "initialize_audit_logs"], [34, 4, 1, "", "labels"], [34, 4, 1, "", "notes"], [34, 4, 1, "", "objects"], [34, 3, 1, "", "property_states"], [34, 3, 1, "", "property_views"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 4, 1, "", "taxlot"], [34, 4, 1, "", "taxlot_id"], [34, 4, 1, "", "taxlotauditlog_view"], [34, 4, 1, "", "taxlotproperty_set"]], "seed.search": [[19, 1, 1, "", "build_shared_buildings_orgs"], [19, 1, 1, "", "create_inventory_queryset"], [19, 1, 1, "", "get_inventory_fieldnames"], [19, 1, 1, "", "get_orgs_w_public_fields"], [19, 1, 1, "", "inventory_search_filter_sort"], [19, 1, 1, "", "parse_body"], [19, 1, 1, "", "process_search_params"], [19, 1, 1, "", "search_inventory"], [19, 1, 1, "", "search_properties"], [19, 1, 1, "", "search_taxlots"]], "seed.serializers": [[36, 0, 0, "-", "celery"], [36, 0, 0, "-", "labels"]], "seed.serializers.celery": [[36, 2, 1, "", "CeleryDatetimeSerializer"]], "seed.serializers.celery.CeleryDatetimeSerializer": [[36, 3, 1, "", "default"], [36, 3, 1, "", "seed_decoder"], [36, 3, 1, "", "seed_dumps"], [36, 3, 1, "", "seed_loads"]], "seed.serializers.labels": [[36, 2, 1, "", "LabelSerializer"]], "seed.serializers.labels.LabelSerializer": [[36, 2, 1, "", "Meta"], [36, 3, 1, "", "get_is_applied"], [36, 3, 1, "", "to_representation"]], "seed.serializers.labels.LabelSerializer.Meta": [[36, 4, 1, "", "extra_kwargs"], [36, 4, 1, "", "fields"], [36, 4, 1, "", "model"]], "seed.tasks": [[19, 1, 1, "", "delete_organization"], [19, 1, 1, "", "invite_new_user_to_seed"], [19, 1, 1, "", "send_salesforce_error_log"]], "seed.templatetags": [[37, 0, 0, "-", "breadcrumbs"]], "seed.templatetags.breadcrumbs": [[37, 2, 1, "", "BreadcrumbNode"], [37, 2, 1, "", "UrlBreadcrumbNode"], [37, 1, 1, "", "breadcrumb"], [37, 1, 1, "", "breadcrumb_root"], [37, 1, 1, "", "breadcrumb_url"], [37, 1, 1, "", "breadcrumb_url_root"], [37, 1, 1, "", "create_crumb"], [37, 1, 1, "", "create_crumb_first"]], "seed.templatetags.breadcrumbs.BreadcrumbNode": [[37, 3, 1, "", "render"]], "seed.templatetags.breadcrumbs.UrlBreadcrumbNode": [[37, 3, 1, "", "render"]], "seed.test_helpers.factory": [[39, 0, 0, "-", "helpers"]], "seed.test_helpers.factory.helpers": [[39, 2, 1, "", "DjangoFunctionalFactory"]], "seed.test_helpers.factory.helpers.DjangoFunctionalFactory": [[39, 3, 1, "", "invalid_test_cc_number"], [39, 3, 1, "", "rand_bool"], [39, 3, 1, "", "rand_city"], [39, 3, 1, "", "rand_city_suffix"], [39, 3, 1, "", "rand_currency"], [39, 3, 1, "", "rand_date"], [39, 3, 1, "", "rand_domain"], [39, 3, 1, "", "rand_email"], [39, 3, 1, "", "rand_float"], [39, 3, 1, "", "rand_int"], [39, 3, 1, "", "rand_name"], [39, 3, 1, "", "rand_phone"], [39, 3, 1, "", "rand_plant_name"], [39, 3, 1, "", "rand_str"], [39, 3, 1, "", "rand_street_address"], [39, 3, 1, "", "rand_street_suffix"], [39, 3, 1, "", "test_cc_number"], [39, 3, 1, "", "valid_test_cc_number"]], "seed.tests": [[41, 0, 0, "-", "test_admin_views"], [41, 0, 0, "-", "test_decorators"], [41, 0, 0, "-", "test_tasks"], [41, 0, 0, "-", "test_views"], [41, 0, 0, "-", "util"]], "seed.tests.test_admin_views": [[41, 2, 1, "", "AdminViewsTest"]], "seed.tests.test_admin_views.AdminViewsTest": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_add_org"], [41, 3, 1, "", "test_add_org_dupe"], [41, 3, 1, "", "test_add_user_existing_org"], [41, 3, 1, "", "test_add_user_new_org"], [41, 3, 1, "", "test_add_user_no_org"], [41, 3, 1, "", "test_signup_process"], [41, 3, 1, "", "test_signup_process_force_lowercase_email"]], "seed.tests.test_decorators": [[41, 2, 1, "", "ClassDecoratorTests"], [41, 2, 1, "", "RequireOrganizationIDTests"], [41, 2, 1, "", "TestDecorators"], [41, 6, 1, "", "TestException"]], "seed.tests.test_decorators.ClassDecoratorTests": [[41, 3, 1, "", "test_ajax_request_class_dict"], [41, 3, 1, "", "test_ajax_request_class_dict_status_error"], [41, 3, 1, "", "test_ajax_request_class_dict_status_false"], [41, 3, 1, "", "test_ajax_request_class_format_type"], [41, 3, 1, "", "test_require_organization_id_class_no_org_id"], [41, 3, 1, "", "test_require_organization_id_class_org_id"], [41, 3, 1, "", "test_require_organization_id_class_org_id_not_int"]], "seed.tests.test_decorators.RequireOrganizationIDTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_require_organization_id_fail_no_key"], [41, 3, 1, "", "test_require_organization_id_fail_not_numeric"], [41, 3, 1, "", "test_require_organization_id_success_integer"], [41, 3, 1, "", "test_require_organization_id_success_string"]], "seed.tests.test_decorators.TestDecorators": [[41, 4, 1, "", "locked"], [41, 4, 1, "", "pk"], [41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_get_prog_key"], [41, 3, 1, "", "test_increment_cache"], [41, 3, 1, "", "test_locking"], [41, 3, 1, "", "test_locking_w_exception"], [41, 3, 1, "", "test_progress"], [41, 4, 1, "", "unlocked"]], "seed.tests.test_tasks": [[41, 2, 1, "", "TestTasks"]], "seed.tests.test_tasks.TestTasks": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_delete_organization"]], "seed.tests.test_views": [[41, 2, 1, "", "GetDatasetsViewsTests"], [41, 2, 1, "", "ImportFileViewsTests"], [41, 2, 1, "", "InventoryViewTests"], [41, 2, 1, "", "MainViewTests"], [41, 2, 1, "", "TestMCMViews"]], "seed.tests.test_views.GetDatasetsViewsTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_delete_dataset"], [41, 3, 1, "", "test_get_dataset"], [41, 3, 1, "", "test_get_datasets"], [41, 3, 1, "", "test_get_datasets_count"], [41, 3, 1, "", "test_get_datasets_count_invalid"], [41, 3, 1, "", "test_update_dataset"]], "seed.tests.test_views.ImportFileViewsTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_delete_file"], [41, 3, 1, "", "test_get_import_file"], [41, 3, 1, "", "test_get_matching_and_geocoding_results"]], "seed.tests.test_views.InventoryViewTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_get_cycles"], [41, 3, 1, "", "test_get_properties"], [41, 3, 1, "", "test_get_properties_cycle_id"], [41, 3, 1, "", "test_get_properties_empty_page"], [41, 3, 1, "", "test_get_properties_page_not_an_integer"], [41, 3, 1, "", "test_get_properties_pint_fields"], [41, 3, 1, "", "test_get_properties_profile_id"], [41, 3, 1, "", "test_get_properties_property_extra_data"], [41, 3, 1, "", "test_get_properties_select_all"], [41, 3, 1, "", "test_get_properties_taxlot_extra_data"], [41, 3, 1, "", "test_get_properties_with_taxlots"], [41, 3, 1, "", "test_get_properties_with_taxlots_with_footprints"], [41, 3, 1, "", "test_get_properties_wrong_query_params"], [41, 3, 1, "", "test_get_property"], [41, 3, 1, "", "test_get_property_columns"], [41, 3, 1, "", "test_get_property_multiple_taxlots"], [41, 3, 1, "", "test_get_taxlot"], [41, 3, 1, "", "test_get_taxlot_columns"], [41, 3, 1, "", "test_get_taxlots"], [41, 3, 1, "", "test_get_taxlots_empty_page"], [41, 3, 1, "", "test_get_taxlots_extra_data"], [41, 3, 1, "", "test_get_taxlots_multiple_taxlots"], [41, 3, 1, "", "test_get_taxlots_no_cycle_id"], [41, 3, 1, "", "test_get_taxlots_page_not_an_integer"], [41, 3, 1, "", "test_get_taxlots_profile_id"], [41, 3, 1, "", "test_postoffice"], [41, 3, 1, "", "test_update_pint_fields_with_modified_display_settings"]], "seed.tests.test_views.MainViewTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_home"]], "seed.tests.test_views.TestMCMViews": [[41, 3, 1, "", "assert_expected_mappings"], [41, 4, 1, "", "expected_mappings"], [41, 4, 1, "", "raw_columns_expected"], [41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_create_dataset"], [41, 3, 1, "", "test_get_column_mapping_suggestions"], [41, 3, 1, "", "test_get_column_mapping_suggestions_pm_file"], [41, 3, 1, "", "test_get_column_mapping_suggestions_with_columns"], [41, 3, 1, "", "test_get_raw_column_names"], [41, 3, 1, "", "test_progress"], [41, 3, 1, "", "test_save_column_mappings"], [41, 3, 1, "", "test_save_column_mappings_idempotent"]], "seed.tests.util": [[41, 2, 1, "", "AssertDictSubsetMixin"], [41, 2, 1, "", "DataMappingBaseTestCase"], [41, 2, 1, "", "DeleteModelsTestCase"], [41, 2, 1, "", "FakeClient"], [41, 2, 1, "", "FakeRequest"]], "seed.tests.util.AssertDictSubsetMixin": [[41, 3, 1, "", "assertDictContainsSubset"]], "seed.tests.util.DataMappingBaseTestCase": [[41, 3, 1, "", "create_import_file"], [41, 3, 1, "", "set_up"]], "seed.tests.util.DeleteModelsTestCase": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "tearDown"]], "seed.tests.util.FakeClient": [[41, 3, 1, "", "get"], [41, 3, 1, "", "post"]], "seed.tests.util.FakeRequest": [[41, 4, 1, "", "GET"], [41, 4, 1, "", "META"], [41, 4, 1, "", "POST"], [41, 4, 1, "", "body"], [41, 4, 1, "", "path"]], "seed.token_generators": [[19, 2, 1, "", "SignupTokenGenerator"]], "seed.token_generators.SignupTokenGenerator": [[19, 3, 1, "", "check_token"], [19, 3, 1, "", "make_token"]], "seed.utils": [[44, 0, 0, "-", "api"], [44, 0, 0, "-", "buildings"], [44, 0, 0, "-", "organizations"], [44, 0, 0, "-", "time"]], "seed.utils.api": [[44, 2, 1, "", "APIBypassCSRFMiddleware"], [44, 2, 1, "", "OrgCreateMixin"], [44, 2, 1, "", "OrgCreateUpdateMixin"], [44, 2, 1, "", "OrgMixin"], [44, 2, 1, "", "OrgQuerySetMixin"], [44, 2, 1, "", "OrgUpdateMixin"], [44, 2, 1, "", "OrgValidateMixin"], [44, 2, 1, "", "OrgValidator"], [44, 2, 1, "", "ProfileIdMixin"], [44, 1, 1, "", "api_endpoint"], [44, 1, 1, "", "api_endpoint_class"], [44, 1, 1, "", "clean_api_regex"], [44, 1, 1, "", "drf_api_endpoint"], [44, 1, 1, "", "format_api_docstring"], [44, 1, 1, "", "get_all_urls"], [44, 1, 1, "", "get_api_endpoints"], [44, 1, 1, "", "get_api_request_user"], [44, 1, 1, "", "get_org_id_from_validator"], [44, 1, 1, "", "rgetattr"]], "seed.utils.api.OrgCreateMixin": [[44, 3, 1, "", "perform_create"]], "seed.utils.api.OrgMixin": [[44, 3, 1, "", "get_organization"], [44, 3, 1, "", "get_parent_org"]], "seed.utils.api.OrgQuerySetMixin": [[44, 3, 1, "", "get_queryset"]], "seed.utils.api.OrgUpdateMixin": [[44, 3, 1, "", "perform_update"]], "seed.utils.api.OrgValidateMixin": [[44, 3, 1, "", "validate"], [44, 3, 1, "", "validate_org"]], "seed.utils.api.OrgValidator": [[44, 4, 1, "", "field"], [44, 4, 1, "", "key"]], "seed.utils.api.ProfileIdMixin": [[44, 3, 1, "", "get_show_columns"]], "seed.utils.buildings": [[44, 1, 1, "", "get_source_type"]], "seed.utils.organizations": [[44, 1, 1, "", "create_organization"], [44, 1, 1, "", "create_suborganization"], [44, 1, 1, "", "default_pm_mappings"]], "seed.utils.time": [[44, 1, 1, "", "convert_datestr"], [44, 1, 1, "", "convert_to_js_timestamp"], [44, 1, 1, "", "parse_datetime"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute", "5": "py:property", "6": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"], "5": ["py", "property", "Python property"], "6": ["py", "exception", "Python exception"]}, "titleterms": {"api": [0, 43, 44, 45, 47], "authent": 0, "payload": 0, "respons": 0, "endpoint": 0, "aw": [1, 6, 11, 13], "setup": [1, 8, 11, 13], "prerequisit": [1, 13, 47], "amazon": 1, "web": [1, 11, 13], "servic": [1, 13], "depend": [1, 13, 47], "python": [1, 5, 13, 47], "javascript": [1, 13, 47], "databas": [1, 5, 13, 47], "configur": [1, 11, 13, 18, 47], "cach": [1, 13], "messag": [1, 13], "broker": [1, 13], "run": [1, 13, 46, 47], "celeri": [1, 11, 13], "background": [1, 13], "task": [1, 13, 19, 41], "worker": [1, 13], "data": [2, 3, 10, 20, 21, 22], "model": [2, 19, 20, 22, 24, 34, 35, 41], "todo": [2, 14], "parent": 2, "children": 2, "match": [2, 14, 15], "manual": 2, "v": 2, "auto": 2, "what": [2, 7, 15], "realli": 2, "happen": 2, "buildingsnapshot": 2, "tabl": [2, 10], "import": [2, 14, 22], "when": [2, 15], "canonicalbuild": 2, "organ": [2, 44], "_source_id": 2, "field": [2, 5], "extra_data": 2, "save": 2, "possibl": 2, "loss": 2, "qualiti": [3, 20], "deploy": [4, 6, 11, 16], "guid": [4, 11], "migrat": [4, 5, 16, 47], "monitor": 4, "sentri": 4, "develop": [5, 8, 9, 13, 16, 46], "resourc": [5, 11], "gener": [5, 13, 19, 34, 48], "note": [5, 15], "pre": 5, "commit": 5, "flake": 5, "set": [5, 7], "type": 5, "hint": 5, "usag": 5, "check": 5, "django": [5, 13, 47], "ad": 5, "new": 5, "nginx": 5, "angularj": 5, "integr": 5, "templat": [5, 18], "tag": 5, "csrf": 5, "token": [5, 19], "ajax": 5, "request": 5, "rout": 5, "partial": 5, "view": [5, 18, 19, 20, 22, 24, 41, 45], "log": [5, 11], "bede": [5, 21], "complianc": 5, "manag": [5, 11, 22, 25, 26, 30, 31, 32], "column": [5, 34], "reset": 5, "restor": 5, "dump": 5, "test": [5, 18, 20, 24, 32, 38, 39, 40, 41, 42, 46], "build": [5, 44, 46], "document": 5, "contribut": 5, "instruct": [5, 47], "best": 5, "practic": 5, "releas": 5, "docker": [6, 16, 46], "instal": [6, 46, 47], "deploi": 6, "frequent": 7, "ask": 7, "question": 7, "i": [7, 15], "seed": [7, 9, 10, 19, 25, 28, 29, 33, 48], "platform": [7, 9, 10], "issu": 7, "why": [7, 15], "domain": 7, "exampl": 7, "com": 7, "aren": 7, "t": [7, 48], "static": 7, "asset": 7, "being": 7, "serv": 7, "correctli": 7, "get": 8, "start": [8, 47], "help": 9, "For": 9, "user": [9, 13, 47], "standard": 10, "energi": 10, "effici": 10, "indic": 10, "kubernet": 11, "helm": 11, "cluster": 11, "cli": 11, "kubectl": 11, "ek": 11, "control": 11, "specif": 11, "chart": 11, "exist": [11, 15], "upgrad": 11, "redeploi": 11, "stack": 11, "In": [11, 15], "updat": [11, 26], "other": 11, "licens": 12, "linux": 13, "postgresql": [13, 47], "creat": 13, "initi": 13, "server": [13, 46, 47], "product": 13, "environ": 13, "variabl": 13, "mail": 13, "se": 13, "smtp": 13, "local_untrack": 13, "py": 13, "map": [14, 28, 33], "pair": 14, "doe": 15, "how": 15, "us": [15, 46], "cycl": [15, 34], "merg": [15, 29], "link": 15, "across": 15, "put": 15, "them": 15, "togeth": 15, "Not": 15, "search": [15, 19], "depth": 15, "version": 16, "2": [16, 47], "22": 16, "0": [16, 47], "21": 16, "20": 16, "1": [16, 47], "19": 16, "18": 16, "17": 16, "4": 16, "3": 16, "16": 16, "15": 16, "14": 16, "13": 16, "12": 16, "11": [16, 47], "10": 16, "7": 16, "9": 16, "6": 16, "base": [16, 42], "ubuntu": [16, 46], "max": 16, "osx": [16, 46, 47], "5": [16, 47], "modul": [17, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 45], "submodul": [18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42, 43, 44, 45], "context": 18, "util": [18, 19, 22, 41, 44], "wsgi": 18, "packag": [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47], "subpackag": [19, 24, 25, 30, 31, 38, 39], "inherit": [19, 20], "decor": [19, 41], "factori": [19, 40], "content": [19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 45], "url": [22, 24, 43], "featur": 23, "land": [24, 25, 26], "form": 24, "eula": 26, "librari": 27, "lib": [28, 29, 40], "mapper": [28, 33], "mapping_column": 28, "mapping_data": 28, "test_mapp": 28, "test_mapping_column": 28, "test_mapping_data": 28, "json": [31, 32], "seed_map": 33, "auditlog": 34, "join": 34, "properti": 34, "taxlot": 34, "public": 35, "serial": 36, "label": 36, "templatetag": 37, "breadcrumb": 37, "helper": [38, 39, 40], "factor": 39, "chomski": 40, "admin": [41, 47], "export": 41, "function": 42, "page": 42, "account": [43, 45], "main": [43, 45], "time": 44, "meter": 45, "nativ": 46, "window": 46, "contain": 46, "non": 46, "debug": 46, "quick": 47, "postgi": 47, "timescaledb": 47, "nodej": 47, "npm": 47, "mapquest": 47, "kei": 47, "redi": 47, "login": 47, "translat": 48, "philosophi": 48, "style": 48, "don": 48, "go": 48, "crazi": 48, "indirect": 48, "interpol": 48}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx.ext.intersphinx": 1, "sphinx": 60}, "alltitles": {"API": [[0, "api"]], "Authentication": [[0, "authentication"]], "Payloads": [[0, "payloads"]], "Responses": [[0, "responses"]], "API Endpoints": [[0, "api-endpoints"]], "AWS Setup": [[1, "aws-setup"]], "Prerequisites": [[1, "prerequisites"], [13, "prerequisites"], [47, "prerequisites"]], "Amazon Web Services (AWS) Dependencies": [[1, "amazon-web-services-aws-dependencies"]], "Python Dependencies": [[1, "python-dependencies"], [13, "python-dependencies"]], "JavaScript Dependencies": [[1, "javascript-dependencies"], [13, "javascript-dependencies"]], "Database Configuration": [[1, "database-configuration"]], "Cache and Message Broker": [[1, "cache-and-message-broker"], [13, "cache-and-message-broker"]], "Running Celery the Background Task Worker": [[1, "running-celery-the-background-task-worker"]], "Data Model": [[2, "data-model"]], "Todo": [[2, "id1"], [14, "id2"], [14, "id3"]], "parents and children": [[2, "parents-and-children"]], "matching": [[2, "matching"]], "manual-matching vs auto-matching": [[2, "manual-matching-vs-auto-matching"]], "what really happens to the BuildingSnapshot table on import (and when)": [[2, "what-really-happens-to-the-buildingsnapshot-table-on-import-and-when"]], "what really happens to the CanonicalBuilding table on import (and when)": [[2, "what-really-happens-to-the-canonicalbuilding-table-on-import-and-when"]], "organization": [[2, "organization"]], "*_source_id fields": [[2, "source-id-fields"]], "extra_data": [[2, "extra-data"]], "saving and possible data loss": [[2, "saving-and-possible-data-loss"]], "Data Quality": [[3, "data-quality"]], "Deployment Guide": [[4, "deployment-guide"]], "Migrations": [[4, "migrations"], [16, "migrations"]], "Monitoring": [[4, "monitoring"]], "Sentry": [[4, "sentry"]], "Developer Resources": [[5, "developer-resources"]], "General Notes": [[5, "general-notes"]], "Pre-commit": [[5, "pre-commit"]], "Flake Settings": [[5, "flake-settings"]], "Python Type Hints": [[5, "python-type-hints"]], "Usage": [[5, "usage"]], "Type Checking": [[5, "type-checking"]], "Django Notes": [[5, "django-notes"]], "Adding New Fields to Database": [[5, "adding-new-fields-to-database"]], "NGINX Notes": [[5, "nginx-notes"]], "AngularJS Integration Notes": [[5, "angularjs-integration-notes"]], "Template Tags": [[5, "template-tags"]], "Django CSRF Token and AJAX Requests": [[5, "django-csrf-token-and-ajax-requests"]], "Routes and Partials or Views": [[5, "routes-and-partials-or-views"]], "Logging": [[5, "logging"]], "BEDES Compliance and Managing Columns": [[5, "bedes-compliance-and-managing-columns"]], "Resetting the Database": [[5, "resetting-the-database"]], "Restoring a Database Dump": [[5, "restoring-a-database-dump"]], "Migrating the Database": [[5, "migrating-the-database"]], "Testing": [[5, "testing"]], "Building Documentation": [[5, "building-documentation"]], "Contribution Instructions / Best Practices": [[5, "contribution-instructions-best-practices"]], "Release Instructions": [[5, "release-instructions"]], "Docker Deployment on AWS": [[6, "docker-deployment-on-aws"]], "Installation": [[6, "installation"]], "Deploying with Docker": [[6, "deploying-with-docker"]], "Frequently Asked Questions": [[7, "frequently-asked-questions"]], "Questions": [[7, "questions"]], "What is the SEED Platform?": [[7, "what-is-the-seed-platform"]], "Issues": [[7, "issues"]], "Why is the domain set to example.com?": [[7, "why-is-the-domain-set-to-example-com"]], "Why aren\u2019t the static assets being served correctly?": [[7, "why-aren-t-the-static-assets-being-served-correctly"]], "Getting Started": [[8, "getting-started"]], "Development Setup": [[8, "development-setup"]], "Help": [[9, "help"]], "For SEED Platform Users": [[9, "for-seed-platform-users"]], "For SEED Platform Developers": [[9, "for-seed-platform-developers"]], "Standard Energy Efficiency Data (SEED) Platform": [[10, "standard-energy-efficiency-data-seed-platform"]], "Indices and tables": [[10, "indices-and-tables"]], "Kubernetes Deployment Guide with Helm": [[11, "kubernetes-deployment-guide-with-helm"]], "Setup": [[11, "setup"]], "Cluster": [[11, "cluster"]], "AWS CLI Configuration": [[11, "aws-cli-configuration"]], "Kubectl": [[11, "kubectl"]], "Helm": [[11, "helm"]], "EKS Control (AWS Specific)": [[11, "eks-control-aws-specific"]], "Charts": [[11, "charts"]], "Deployment": [[11, "deployment"]], "Managing Existing Clusters": [[11, "managing-existing-clusters"]], "Upgrade/Redeploy the Helm Stack": [[11, "upgrade-redeploy-the-helm-stack"]], "Managing the Kubernetes Cluster (AWS Specific)": [[11, "managing-the-kubernetes-cluster-aws-specific"]], "Logging In": [[11, "logging-in"]], "Update web and web-celery": [[11, "update-web-and-web-celery"]], "Other Resources": [[11, "other-resources"]], "License": [[12, "license"]], "General Linux Setup": [[13, "general-linux-setup"]], "Configure PostgreSQL": [[13, "configure-postgresql"]], "Django Database Configuration": [[13, "django-database-configuration"]], "Creating the initial user": [[13, "creating-the-initial-user"]], "Running celery the background task worker": [[13, "running-celery-the-background-task-worker"]], "Running the development web server": [[13, "running-the-development-web-server"]], "Running a production web server": [[13, "running-a-production-web-server"]], "Environment Variables": [[13, "environment-variables"]], "Mail Services": [[13, "mail-services"]], "AWS SES Service": [[13, "aws-ses-service"]], "SMTP service": [[13, "smtp-service"]], "local_untracked.py": [[13, "local-untracked-py"]], "Mapping": [[14, "mapping"], [14, "id1"]], "Import": [[14, "import"]], "Matching": [[14, "matching"], [15, "matching"]], "Pairing": [[14, "pairing"]], "What is it?": [[15, "what-is-it"]], "Why does it exist?": [[15, "why-does-it-exist"]], "How and when is it used?": [[15, "how-and-when-is-it-used"]], "In-Cycle Merging": [[15, "in-cycle-merging"]], "Linking (Across Cycles)": [[15, "linking-across-cycles"]], "Putting them Together, Match-Merge-Linking": [[15, "putting-them-together-match-merge-linking"]], "Note on In-Cycle Not-merged Matches": [[15, "note-on-in-cycle-not-merged-matches"]], "Match Searching in Depth": [[15, "match-searching-in-depth"]], "Version Develop": [[16, "version-develop"]], "Version 2.22.0": [[16, "version-2-22-0"]], "Version 2.21.0": [[16, "version-2-21-0"]], "Version 2.20.1": [[16, "version-2-20-1"]], "Version 2.20.0": [[16, "version-2-20-0"]], "Version 2.19.0": [[16, "version-2-19-0"]], "Version 2.18.1": [[16, "version-2-18-1"]], "Version 2.18.0": [[16, "version-2-18-0"]], "Version 2.17.4": [[16, "version-2-17-4"]], "Version 2.17.3": [[16, "version-2-17-3"]], "Version 2.17.2": [[16, "version-2-17-2"]], "Version 2.17.1": [[16, "version-2-17-1"]], "Version 2.17.0": [[16, "version-2-17-0"]], "Version 2.16.0": [[16, "version-2-16-0"]], "Version 2.15.2": [[16, "version-2-15-2"]], "Version 2.15.1": [[16, "version-2-15-1"]], "Version 2.15.0": [[16, "version-2-15-0"]], "Version 2.14.0": [[16, "version-2-14-0"]], "Version 2.13.0": [[16, "version-2-13-0"]], "Version 2.12.0 - 2.12.4": [[16, "version-2-12-0-2-12-4"]], "Version 2.11.0": [[16, "version-2-11-0"]], "Version 2.10.0": [[16, "version-2-10-0"]], "Version 2.7.3 to 2.9.0": [[16, "version-2-7-3-to-2-9-0"]], "Version 2.7.2": [[16, "version-2-7-2"]], "Version 2.7.1": [[16, "version-2-7-1"]], "Version 2.7.0": [[16, "version-2-7-0"]], "Version 2.6.1": [[16, "version-2-6-1"]], "Version 2.6.0": [[16, "version-2-6-0"]], "Docker-based Deployment": [[16, "docker-based-deployment"], [16, "id1"]], "Ubuntu": [[16, "ubuntu"]], "Max OSX": [[16, "max-osx"]], "Version 2.5.2": [[16, "version-2-5-2"]], "Version 2.5.1": [[16, "version-2-5-1"]], "Version 2.5.0": [[16, "version-2-5-0"]], "Development": [[16, "development"]], "Modules": [[17, "modules"]], "Configuration": [[18, "configuration"]], "Submodules": [[18, "submodules"], [19, "submodules"], [20, "submodules"], [21, "submodules"], [22, "submodules"], [23, "submodules"], [24, "submodules"], [26, "submodules"], [27, "submodules"], [28, "submodules"], [29, "submodules"], [31, "submodules"], [32, "submodules"], [33, "submodules"], [34, "submodules"], [35, "submodules"], [36, "submodules"], [37, "submodules"], [39, "submodules"], [40, "submodules"], [41, "submodules"], [42, "submodules"], [43, "submodules"], [44, "submodules"], [45, "submodules"]], "Template Context": [[18, "module-config.template_context"]], "Tests": [[18, "module-config.tests"], [20, "tests"], [24, "module-seed.landing.tests"], [41, "tests"]], "Utils": [[18, "module-config.utils"], [19, "module-seed.utils"], [22, "module-seed.data_importer.utils"], [41, "module-seed.tests.util"]], "Views": [[18, "module-config.views"], [19, "module-seed.views"], [20, "views"], [22, "views"], [24, "module-seed.landing.views"], [41, "module-seed.tests.test_views"]], "WSGI": [[18, "module-config.wsgi"]], "SEED Package": [[19, "seed-package"]], "Subpackages": [[19, "subpackages"], [24, "subpackages"], [25, "subpackages"], [30, "subpackages"], [31, "subpackages"], [38, "subpackages"], [39, "subpackages"]], "Inheritance": [[19, "inheritance"], [20, "inheritance"]], "Decorators": [[19, "module-seed.decorators"], [41, "module-seed.tests.test_decorators"]], "Factory": [[19, "factory"]], "Models": [[19, "module-seed.models"], [20, "module-seed.models.data_quality"], [22, "models"], [24, "module-seed.landing.models"], [34, "models"], [35, "models"], [41, "models"]], "Search": [[19, "module-seed.search"]], "Tasks": [[19, "module-seed.tasks"], [41, "module-seed.tests.test_tasks"]], "Token Generator": [[19, "module-seed.token_generators"]], "Module contents": [[19, "module-seed"], [21, "module-contents"], [22, "module-seed.data_importer"], [23, "module-contents"], [24, "module-seed.landing"], [25, "module-seed.landing.management"], [26, "module-seed.landing.management.commands"], [27, "module-seed.lib"], [28, "module-seed.lib.mappings"], [29, "module-seed.lib.merging"], [30, "module-seed.management"], [31, "module-contents"], [32, "module-contents"], [33, "module-contents"], [34, "module-seed.models"], [35, "module-seed.public"], [36, "module-seed.serializers"], [38, "module-seed.test_helpers"], [45, "module-seed.views"]], "Data Quality Package": [[20, "data-quality-package"]], "Data Package": [[21, "data-package"]], "BEDES": [[21, "bedes"]], "Data Importer Package": [[22, "data-importer-package"]], "Managers": [[22, "module-seed.data_importer.managers"]], "URLs": [[22, "urls"], [24, "module-seed.landing.urls"]], "Features Package": [[23, "features-package"]], "Landing Package": [[24, "landing-package"]], "Forms": [[24, "module-seed.landing.forms"]], "seed.landing.management package": [[25, "seed-landing-management-package"]], "Landing Management Package": [[26, "landing-management-package"]], "Update EULA": [[26, "module-seed.landing.management.commands.update_eula"]], "Library Packages": [[27, "library-packages"]], "seed.lib.mappings package": [[28, "seed-lib-mappings-package"]], "seed.lib.mappings.mapper module": [[28, "module-seed.lib.mappings.mapper"]], "seed.lib.mappings.mapping_columns module": [[28, "module-seed.lib.mappings.mapping_columns"]], "seed.lib.mappings.mapping_data module": [[28, "seed-lib-mappings-mapping-data-module"]], "seed.lib.mappings.test_mapper module": [[28, "seed-lib-mappings-test-mapper-module"]], "seed.lib.mappings.test_mapping_columns module": [[28, "seed-lib-mappings-test-mapping-columns-module"]], "seed.lib.mappings.test_mapping_data module": [[28, "seed-lib-mappings-test-mapping-data-module"]], "seed.lib.merging package": [[29, "seed-lib-merging-package"]], "seed.lib.merging.merging module": [[29, "module-seed.lib.merging.merging"]], "Management Package": [[30, "management-package"]], "Managers Package": [[31, "managers-package"]], "JSON": [[31, "json"]], "Manager Tests Package": [[32, "manager-tests-package"]], "Test JSON Manager": [[32, "test-json-manager"]], "Mapping Package": [[33, "mapping-package"]], "seed.mappings.mapper module": [[33, "seed-mappings-mapper-module"]], "seed.mappings.seed_mappings module": [[33, "seed-mappings-seed-mappings-module"]], "AuditLog": [[34, "module-seed.models.auditlog"]], "Columns": [[34, "module-seed.models.columns"]], "Cycles": [[34, "module-seed.models.cycles"]], "Joins": [[34, "joins"]], "Generic Models": [[34, "module-seed.models.models"]], "Properties": [[34, "module-seed.models.properties"]], "TaxLots": [[34, "module-seed.models.tax_lots"]], "Public Package": [[35, "public-package"]], "Serializers Package": [[36, "serializers-package"]], "Serializers": [[36, "module-seed.serializers.celery"]], "Labels": [[36, "module-seed.serializers.labels"]], "Templatetags Package": [[37, "templatetags-package"]], "Breadcrumbs": [[37, "module-seed.templatetags.breadcrumbs"]], "Test Helpers Package": [[38, "test-helpers-package"]], "Test Helper Factor Package": [[39, "test-helper-factor-package"]], "Helpers": [[39, "module-seed.test_helpers.factory.helpers"]], "Test Helper Factory Lib Package": [[40, "test-helper-factory-lib-package"]], "Chomsky": [[40, "chomsky"]], "Tests Package": [[41, "tests-package"]], "Admin Views": [[41, "module-seed.tests.test_admin_views"]], "Exporters": [[41, "exporters"]], "Tests (Functional) Package": [[42, "tests-functional-package"]], "Base": [[42, "base"]], "Page": [[42, "page"]], "Pages": [[42, "pages"]], "URLs Package": [[43, "urls-package"]], "Accounts": [[43, "accounts"], [45, "accounts"]], "APIs": [[43, "apis"], [44, "module-seed.utils.api"], [45, "apis"]], "Main": [[43, "main"], [45, "main"]], "Utilities Package": [[44, "utilities-package"]], "Buildings": [[44, "module-seed.utils.buildings"]], "Organizations": [[44, "module-seed.utils.organizations"]], "Time": [[44, "module-seed.utils.time"]], "Views Package": [[45, "views-package"]], "Meters": [[45, "meters"]], "Installation using Docker": [[46, "installation-using-docker"]], "Docker Native (Ubuntu)": [[46, "docker-native-ubuntu"]], "Docker Native (Windows/OSX)": [[46, "docker-native-windows-osx"]], "Building and Running Containers for Non-Development": [[46, "building-and-running-containers-for-non-development"]], "Using Docker for Development": [[46, "using-docker-for-development"]], "Build": [[46, "build"]], "Running the Server": [[46, "running-the-server"]], "Running Tests": [[46, "running-tests"]], "Debugging": [[46, "debugging"]], "Installation on OSX": [[47, "installation-on-osx"]], "Quick Installation Instructions": [[47, "quick-installation-instructions"]], "PostgreSQL 11.1": [[47, "postgresql-11-1"]], "PostGIS 2.5": [[47, "postgis-2-5"]], "TimescaleDB 1.5.0": [[47, "timescaledb-1-5-0"]], "Python Packages": [[47, "python-packages"]], "NodeJS/npm": [[47, "nodejs-npm"]], "Configure Django and Databases": [[47, "configure-django-and-databases"]], "MapQuest API Key": [[47, "mapquest-api-key"]], "Run Django Migrations": [[47, "run-django-migrations"]], "Django Admin User": [[47, "django-admin-user"]], "Install Redis": [[47, "install-redis"]], "Install JavaScript Dependencies": [[47, "install-javascript-dependencies"]], "Start the Server": [[47, "start-the-server"]], "Login": [[47, "login"]], "Translating SEED": [[48, "translating-seed"]], "General philosophies / style": [[48, "general-philosophies-style"]], "Don\u2019t go crazy with indirection and interpolation": [[48, "don-t-go-crazy-with-indirection-and-interpolation"]]}, "indexentries": {"config.template_context": [[18, "module-config.template_context"]], "config.tests": [[18, "module-config.tests"]], "config.utils": [[18, "module-config.utils"]], "config.views": [[18, "module-config.views"]], "config.wsgi": [[18, "module-config.wsgi"]], "de_camel_case() (in module config.utils)": [[18, "config.utils.de_camel_case"]], "module": [[18, "module-config.template_context"], [18, "module-config.tests"], [18, "module-config.utils"], [18, "module-config.views"], [18, "module-config.wsgi"], [19, "module-seed"], [19, "module-seed.decorators"], [19, "module-seed.models"], [19, "module-seed.search"], [19, "module-seed.tasks"], [19, "module-seed.token_generators"], [19, "module-seed.utils"], [19, "module-seed.views"], [20, "module-seed.models.data_quality"], [22, "module-seed.data_importer"], [22, "module-seed.data_importer.managers"], [22, "module-seed.data_importer.utils"], [24, "module-seed.landing"], [24, "module-seed.landing.forms"], [24, "module-seed.landing.models"], [24, "module-seed.landing.tests"], [24, "module-seed.landing.urls"], [24, "module-seed.landing.views"], [25, "module-seed.landing.management"], [26, "module-seed.landing.management.commands"], [26, "module-seed.landing.management.commands.update_eula"], [27, "module-seed.lib"], [27, "module-seed.lib.mappings"], [27, "module-seed.lib.merging"], [28, "module-seed.lib.mappings"], [28, "module-seed.lib.mappings.mapper"], [28, "module-seed.lib.mappings.mapping_columns"], [29, "module-seed.lib.merging"], [29, "module-seed.lib.merging.merging"], [30, "module-seed.management"], [34, "module-seed.models"], [34, "module-seed.models.auditlog"], [34, "module-seed.models.columns"], [34, "module-seed.models.cycles"], [34, "module-seed.models.models"], [34, "module-seed.models.properties"], [34, "module-seed.models.tax_lots"], [35, "module-seed.public"], [36, "module-seed.serializers"], [36, "module-seed.serializers.celery"], [36, "module-seed.serializers.labels"], [37, "module-seed.templatetags.breadcrumbs"], [38, "module-seed.test_helpers"], [39, "module-seed.test_helpers.factory.helpers"], [41, "module-seed.tests.test_admin_views"], [41, "module-seed.tests.test_decorators"], [41, "module-seed.tests.test_tasks"], [41, "module-seed.tests.test_views"], [41, "module-seed.tests.util"], [44, "module-seed.utils.api"], [44, "module-seed.utils.buildings"], [44, "module-seed.utils.organizations"], [44, "module-seed.utils.time"], [45, "module-seed.views"]], "robots_txt() (in module config.views)": [[18, "config.views.robots_txt"]], "sentry_js() (in module config.template_context)": [[18, "config.template_context.sentry_js"]], "session_key() (in module config.template_context)": [[18, "config.template_context.session_key"]], "decoratormixin() (in module seed.decorators)": [[19, "seed.decorators.DecoratorMixin"]], "signuptokengenerator (class in seed.token_generators)": [[19, "seed.token_generators.SignupTokenGenerator"]], "ajax_request() (in module seed.decorators)": [[19, "seed.decorators.ajax_request"]], "ajax_request_class() (in module seed.decorators)": [[19, "seed.decorators.ajax_request_class"]], "build_shared_buildings_orgs() (in module seed.search)": [[19, "seed.search.build_shared_buildings_orgs"]], "check_token() (seed.token_generators.signuptokengenerator method)": [[19, "seed.token_generators.SignupTokenGenerator.check_token"]], "create_inventory_queryset() (in module seed.search)": [[19, "seed.search.create_inventory_queryset"]], "delete_organization() (in module seed.tasks)": [[19, "seed.tasks.delete_organization"]], "get_inventory_fieldnames() (in module seed.search)": [[19, "seed.search.get_inventory_fieldnames"]], "get_orgs_w_public_fields() (in module seed.search)": [[19, "seed.search.get_orgs_w_public_fields"]], "get_prog_key() (in module seed.decorators)": [[19, "seed.decorators.get_prog_key"]], "inventory_search_filter_sort() (in module seed.search)": [[19, "seed.search.inventory_search_filter_sort"]], "invite_new_user_to_seed() (in module seed.tasks)": [[19, "seed.tasks.invite_new_user_to_seed"]], "lock_and_track() (in module seed.decorators)": [[19, "seed.decorators.lock_and_track"]], "make_token() (seed.token_generators.signuptokengenerator method)": [[19, "seed.token_generators.SignupTokenGenerator.make_token"]], "parse_body() (in module seed.search)": [[19, "seed.search.parse_body"]], "process_search_params() (in module seed.search)": [[19, "seed.search.process_search_params"]], "require_organization_id() (in module seed.decorators)": [[19, "seed.decorators.require_organization_id"]], "require_organization_id_class() (in module seed.decorators)": [[19, "seed.decorators.require_organization_id_class"]], "require_organization_membership() (in module seed.decorators)": [[19, "seed.decorators.require_organization_membership"]], "search_inventory() (in module seed.search)": [[19, "seed.search.search_inventory"]], "search_properties() (in module seed.search)": [[19, "seed.search.search_properties"]], "search_taxlots() (in module seed.search)": [[19, "seed.search.search_taxlots"]], "seed": [[19, "module-seed"]], "seed.decorators": [[19, "module-seed.decorators"]], "seed.models": [[19, "module-seed.models"], [34, "module-seed.models"]], "seed.search": [[19, "module-seed.search"]], "seed.tasks": [[19, "module-seed.tasks"]], "seed.token_generators": [[19, "module-seed.token_generators"]], "seed.utils": [[19, "module-seed.utils"]], "seed.views": [[19, "module-seed.views"], [45, "module-seed.views"]], "send_salesforce_error_log() (in module seed.tasks)": [[19, "seed.tasks.send_salesforce_error_log"]], "comparisonerror": [[20, "seed.models.data_quality.ComparisonError"]], "data_types (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.DATA_TYPES"]], "default_rules (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.DEFAULT_RULES"]], "dataqualitycheck (class in seed.models.data_quality)": [[20, "seed.models.data_quality.DataQualityCheck"]], "dataqualitycheck.doesnotexist": [[20, "seed.models.data_quality.DataQualityCheck.DoesNotExist"]], "dataqualitycheck.multipleobjectsreturned": [[20, "seed.models.data_quality.DataQualityCheck.MultipleObjectsReturned"]], "dataqualitytypecasterror": [[20, "seed.models.data_quality.DataQualityTypeCastError"]], "required_fields (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.REQUIRED_FIELDS"]], "rule_exclude (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_EXCLUDE"]], "rule_include (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_INCLUDE"]], "rule_not_null (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_NOT_NULL"]], "rule_range (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_RANGE"]], "rule_required (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_REQUIRED"]], "rule_type (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_TYPE"], [20, "seed.models.data_quality.Rule.rule_type"]], "rule_type_custom (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_TYPE_CUSTOM"]], "rule_type_default (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_TYPE_DEFAULT"]], "rule (class in seed.models.data_quality)": [[20, "seed.models.data_quality.Rule"]], "rule.doesnotexist": [[20, "seed.models.data_quality.Rule.DoesNotExist"]], "rule.multipleobjectsreturned": [[20, "seed.models.data_quality.Rule.MultipleObjectsReturned"]], "severity (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY"], [20, "seed.models.data_quality.Rule.severity"]], "severity_error (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY_ERROR"]], "severity_valid (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY_VALID"]], "severity_warning (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY_WARNING"]], "type_area (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_AREA"]], "type_date (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_DATE"]], "type_eui (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_EUI"]], "type_number (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_NUMBER"]], "type_string (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_STRING"]], "type_year (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_YEAR"]], "unitmismatcherror": [[20, "seed.models.data_quality.UnitMismatchError"]], "add_invalid_geometry_entry_provided() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_invalid_geometry_entry_provided"]], "add_result_comparison_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_comparison_error"]], "add_result_dimension_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_dimension_error"]], "add_result_is_null() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_is_null"]], "add_result_max_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_max_error"]], "add_result_min_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_min_error"]], "add_result_missing_and_none() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_missing_and_none"]], "add_result_missing_req() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_missing_req"]], "add_result_string_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_string_error"]], "add_result_type_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_type_error"]], "add_rule() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_rule"]], "add_rule_if_new() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_rule_if_new"]], "cache_key() (seed.models.data_quality.dataqualitycheck static method)": [[20, "seed.models.data_quality.DataQualityCheck.cache_key"]], "check_data() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.check_data"]], "condition (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.condition"]], "data_quality_check (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.data_quality_check"]], "data_quality_check_id (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.data_quality_check_id"]], "data_type (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.data_type"]], "description (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.description"]], "enabled (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.enabled"]], "field (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.field"]], "for_derived_column (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.for_derived_column"]], "format_pint_violation() (in module seed.models.data_quality)": [[20, "seed.models.data_quality.format_pint_violation"]], "format_strings() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.format_strings"]], "get_data_type_display() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.get_data_type_display"]], "get_fieldnames() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.get_fieldnames"]], "get_rule_type_display() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.get_rule_type_display"]], "get_severity_display() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.get_severity_display"]], "id (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.id"]], "id (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.id"]], "initialize_cache() (seed.models.data_quality.dataqualitycheck static method)": [[20, "seed.models.data_quality.DataQualityCheck.initialize_cache"]], "initialize_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.initialize_rules"]], "max (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.max"]], "maximum_valid() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.maximum_valid"]], "min (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.min"]], "minimum_valid() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.minimum_valid"]], "name (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.name"]], "name (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.name"]], "not_null (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.not_null"]], "objects (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.objects"]], "objects (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.objects"]], "organization (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.organization"]], "organization_id (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.organization_id"]], "remove_all_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.remove_all_rules"]], "remove_status_label() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.remove_status_label"]], "required (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.required"]], "reset_all_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.reset_all_rules"]], "reset_default_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.reset_default_rules"]], "reset_results() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.reset_results"]], "retrieve() (seed.models.data_quality.dataqualitycheck class method)": [[20, "seed.models.data_quality.DataQualityCheck.retrieve"]], "retrieve_result_by_address() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.retrieve_result_by_address"]], "retrieve_result_by_tax_lot_id() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.retrieve_result_by_tax_lot_id"]], "rules (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.rules"]], "save_to_cache() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.save_to_cache"]], "seed.models.data_quality": [[20, "module-seed.models.data_quality"]], "status_label (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.status_label"]], "status_label_id (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.status_label_id"]], "str_to_data_type() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.str_to_data_type"]], "table_name (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.table_name"]], "text_match (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.text_match"]], "units (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.units"]], "update_status_label() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.update_status_label"]], "valid_text() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.valid_text"]], "notdeletedmanager (class in seed.data_importer.managers)": [[22, "seed.data_importer.managers.NotDeletedManager"]], "get_all() (seed.data_importer.managers.notdeletedmanager method)": [[22, "seed.data_importer.managers.NotDeletedManager.get_all"]], "get_queryset() (seed.data_importer.managers.notdeletedmanager method)": [[22, "seed.data_importer.managers.NotDeletedManager.get_queryset"]], "kbtu_thermal_conversion_factors() (in module seed.data_importer.utils)": [[22, "seed.data_importer.utils.kbtu_thermal_conversion_factors"]], "seed.data_importer": [[22, "module-seed.data_importer"]], "seed.data_importer.managers": [[22, "module-seed.data_importer.managers"]], "seed.data_importer.utils": [[22, "module-seed.data_importer.utils"]], "usage_point_id() (in module seed.data_importer.utils)": [[22, "seed.data_importer.utils.usage_point_id"]], "use_for_related_fields (seed.data_importer.managers.notdeletedmanager attribute)": [[22, "seed.data_importer.managers.NotDeletedManager.use_for_related_fields"]], "customcreateuserform (class in seed.landing.forms)": [[24, "seed.landing.forms.CustomCreateUserForm"]], "customcreateuserform.meta (class in seed.landing.forms)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta"]], "loginform (class in seed.landing.forms)": [[24, "seed.landing.forms.LoginForm"]], "required_fields (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.REQUIRED_FIELDS"]], "seeduser (class in seed.landing.models)": [[24, "seed.landing.models.SEEDUser"]], "seeduser.doesnotexist": [[24, "seed.landing.models.SEEDUser.DoesNotExist"]], "seeduser.multipleobjectsreturned": [[24, "seed.landing.models.SEEDUser.MultipleObjectsReturned"]], "username_field (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.USERNAME_FIELD"]], "userlogintest (class in seed.landing.tests)": [[24, "seed.landing.tests.UserLoginTest"]], "account_activation_sent() (in module seed.landing.views)": [[24, "seed.landing.views.account_activation_sent"]], "activate() (in module seed.landing.views)": [[24, "seed.landing.views.activate"]], "analysis_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.analysis_set"]], "api_key (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.api_key"]], "base_fields (seed.landing.forms.customcreateuserform attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.base_fields"]], "base_fields (seed.landing.forms.loginform attribute)": [[24, "seed.landing.forms.LoginForm.base_fields"]], "columnmapping_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.columnmapping_set"]], "create_account() (in module seed.landing.views)": [[24, "seed.landing.views.create_account"]], "cycle_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.cycle_set"]], "date_joined (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.date_joined"]], "deactivate_user() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.deactivate_user"]], "declared_fields (seed.landing.forms.customcreateuserform attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.declared_fields"]], "declared_fields (seed.landing.forms.loginform attribute)": [[24, "seed.landing.forms.LoginForm.declared_fields"]], "default_building_detail_custom_columns (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_building_detail_custom_columns"]], "default_custom_columns (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_custom_columns"]], "default_organization (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_organization"]], "default_organization_id (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_organization_id"]], "email (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.email"]], "email_user() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.email_user"]], "fields (seed.landing.forms.customcreateuserform.meta attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta.fields"]], "first_name (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.first_name"]], "generate_key() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.generate_key"]], "get_absolute_url() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_absolute_url"]], "get_full_name() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_full_name"]], "get_next_by_date_joined() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_next_by_date_joined"]], "get_previous_by_date_joined() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_previous_by_date_joined"]], "get_short_name() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_short_name"]], "greenassessmentpropertyauditlog_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.greenassessmentpropertyauditlog_set"]], "groups (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.groups"]], "id (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.id"]], "importrecord_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.importrecord_set"]], "is_staff (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.is_staff"]], "landing_page() (in module seed.landing.views)": [[24, "seed.landing.views.landing_page"]], "last_name (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.last_name"]], "logentry_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.logentry_set"]], "media (seed.landing.forms.customcreateuserform property)": [[24, "seed.landing.forms.CustomCreateUserForm.media"]], "media (seed.landing.forms.loginform property)": [[24, "seed.landing.forms.LoginForm.media"]], "model (seed.landing.forms.customcreateuserform.meta attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta.model"]], "modified_import_records (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.modified_import_records"]], "notes (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.notes"]], "oauth2_provider_accesstoken (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.oauth2_provider_accesstoken"]], "oauth2_provider_application (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.oauth2_provider_application"]], "oauth2_provider_grant (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.oauth2_provider_grant"]], "oauth2_provider_refreshtoken (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.oauth2_provider_refreshtoken"]], "objects (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.objects"]], "organizationuser_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.organizationuser_set"]], "orgs (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.orgs"]], "password_reset() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset"]], "password_reset_complete() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset_complete"]], "password_reset_confirm() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset_confirm"]], "password_reset_done() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset_done"]], "password_set() (in module seed.landing.views)": [[24, "seed.landing.views.password_set"]], "postofficeemail_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.postofficeemail_set"]], "postofficeemailtemplate_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.postofficeemailtemplate_set"]], "process_header_request() (seed.landing.models.seeduser class method)": [[24, "seed.landing.models.SEEDUser.process_header_request"]], "save() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.save"]], "seed.landing": [[24, "module-seed.landing"]], "seed.landing.forms": [[24, "module-seed.landing.forms"]], "seed.landing.models": [[24, "module-seed.landing.models"]], "seed.landing.tests": [[24, "module-seed.landing.tests"]], "seed.landing.urls": [[24, "module-seed.landing.urls"]], "seed.landing.views": [[24, "module-seed.landing.views"]], "setup() (seed.landing.tests.userlogintest method)": [[24, "seed.landing.tests.UserLoginTest.setUp"]], "show_shared_buildings (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.show_shared_buildings"]], "signup() (in module seed.landing.views)": [[24, "seed.landing.views.signup"]], "test_simple_login() (seed.landing.tests.userlogintest method)": [[24, "seed.landing.tests.UserLoginTest.test_simple_login"]], "user_permissions (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.user_permissions"]], "username (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.username"]], "widgets (seed.landing.forms.customcreateuserform.meta attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta.widgets"]], "seed.landing.management": [[25, "module-seed.landing.management"]], "command (class in seed.landing.management.commands.update_eula)": [[26, "seed.landing.management.commands.update_eula.Command"]], "handle() (seed.landing.management.commands.update_eula.command method)": [[26, "seed.landing.management.commands.update_eula.Command.handle"]], "help (seed.landing.management.commands.update_eula.command attribute)": [[26, "seed.landing.management.commands.update_eula.Command.help"]], "seed.landing.management.commands": [[26, "module-seed.landing.management.commands"]], "seed.landing.management.commands.update_eula": [[26, "module-seed.landing.management.commands.update_eula"]], "seed.lib": [[27, "module-seed.lib"]], "seed.lib.mappings": [[27, "module-seed.lib.mappings"], [28, "module-seed.lib.mappings"]], "seed.lib.merging": [[27, "module-seed.lib.merging"], [29, "module-seed.lib.merging"]], "mappingcolumns (class in seed.lib.mappings.mapping_columns)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns"]], "add_mappings() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.add_mappings"]], "apply_threshold() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.apply_threshold"]], "create_column_regexes() (in module seed.lib.mappings.mapper)": [[28, "seed.lib.mappings.mapper.create_column_regexes"]], "duplicates (seed.lib.mappings.mapping_columns.mappingcolumns property)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.duplicates"]], "final_mappings (seed.lib.mappings.mapping_columns.mappingcolumns property)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.final_mappings"]], "first_suggested_mapping() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.first_suggested_mapping"]], "get_pm_mapping() (in module seed.lib.mappings.mapper)": [[28, "seed.lib.mappings.mapper.get_pm_mapping"]], "resolve_duplicate() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.resolve_duplicate"]], "seed.lib.mappings.mapper": [[28, "module-seed.lib.mappings.mapper"]], "seed.lib.mappings.mapping_columns": [[28, "module-seed.lib.mappings.mapping_columns"]], "set_initial_mapping_cmp() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.set_initial_mapping_cmp"]], "sort_duplicates() (in module seed.lib.mappings.mapping_columns)": [[28, "seed.lib.mappings.mapping_columns.sort_duplicates"]], "get_attrs_with_mapping() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_attrs_with_mapping"]], "get_propertystate_attrs() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_propertystate_attrs"]], "get_state_attrs() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_state_attrs"]], "get_state_to_state_tuple() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_state_to_state_tuple"]], "get_taxlotstate_attrs() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_taxlotstate_attrs"]], "merge_state() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.merge_state"]], "seed.lib.merging.merging": [[29, "module-seed.lib.merging.merging"]], "seed.management": [[30, "module-seed.management"]], "blue_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.BLUE_CHOICE"]], "color_choices (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.COLOR_CHOICES"]], "column_exclude_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_EXCLUDE_FIELDS"]], "column_merge_favor_existing (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_MERGE_FAVOR_EXISTING"]], "column_merge_favor_new (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_MERGE_FAVOR_NEW"]], "column_merge_protection (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_MERGE_PROTECTION"]], "column (class in seed.models.columns)": [[34, "seed.models.columns.Column"]], "column.doesnotexist": [[34, "seed.models.columns.Column.DoesNotExist"]], "column.multipleobjectsreturned": [[34, "seed.models.columns.Column.MultipleObjectsReturned"]], "columncastexception": [[34, "seed.models.columns.ColumnCastException"]], "cycle (class in seed.models.cycles)": [[34, "seed.models.cycles.Cycle"]], "cycle.doesnotexist": [[34, "seed.models.cycles.Cycle.DoesNotExist"]], "cycle.multipleobjectsreturned": [[34, "seed.models.cycles.Cycle.MultipleObjectsReturned"]], "database_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.DATABASE_COLUMNS"]], "data_type_parsers (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.DATA_TYPE_PARSERS"]], "date (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.DATE"]], "datetime (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.DATETIME"]], "decimal (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.DECIMAL"]], "default_labels (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.DEFAULT_LABELS"]], "excluded_api_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_API_FIELDS"]], "excluded_column_return_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_COLUMN_RETURN_FIELDS"]], "excluded_mapping_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_MAPPING_FIELDS"]], "excluded_rename_from_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_RENAME_FROM_FIELDS"]], "excluded_rename_to_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_RENAME_TO_FIELDS"]], "float (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.FLOAT"]], "gray_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.GRAY_CHOICE"]], "green_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.GREEN_CHOICE"]], "integer (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.INTEGER"]], "internal_type_to_data_type (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.INTERNAL_TYPE_TO_DATA_TYPE"]], "light_blue_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.LIGHT_BLUE_CHOICE"]], "orange_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.ORANGE_CHOICE"]], "pinned_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.PINNED_COLUMNS"]], "property (class in seed.models.properties)": [[34, "seed.models.properties.Property"]], "property.doesnotexist": [[34, "seed.models.properties.Property.DoesNotExist"]], "property.multipleobjectsreturned": [[34, "seed.models.properties.Property.MultipleObjectsReturned"]], "propertyauditlog (class in seed.models.properties)": [[34, "seed.models.properties.PropertyAuditLog"]], "propertyauditlog.doesnotexist": [[34, "seed.models.properties.PropertyAuditLog.DoesNotExist"]], "propertyauditlog.multipleobjectsreturned": [[34, "seed.models.properties.PropertyAuditLog.MultipleObjectsReturned"]], "propertystate (class in seed.models.properties)": [[34, "seed.models.properties.PropertyState"]], "propertystate.doesnotexist": [[34, "seed.models.properties.PropertyState.DoesNotExist"]], "propertystate.multipleobjectsreturned": [[34, "seed.models.properties.PropertyState.MultipleObjectsReturned"]], "propertyview (class in seed.models.properties)": [[34, "seed.models.properties.PropertyView"]], "propertyview.doesnotexist": [[34, "seed.models.properties.PropertyView.DoesNotExist"]], "propertyview.multipleobjectsreturned": [[34, "seed.models.properties.PropertyView.MultipleObjectsReturned"]], "quantity_unit_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.QUANTITY_UNIT_COLUMNS"]], "red_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.RED_CHOICE"]], "shared_field_types (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.SHARED_FIELD_TYPES"]], "shared_none (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.SHARED_NONE"]], "shared_public (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.SHARED_PUBLIC"]], "string (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.STRING"]], "statuslabel (class in seed.models.models)": [[34, "seed.models.models.StatusLabel"]], "statuslabel.doesnotexist": [[34, "seed.models.models.StatusLabel.DoesNotExist"]], "statuslabel.multipleobjectsreturned": [[34, "seed.models.models.StatusLabel.MultipleObjectsReturned"]], "taxlot (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLot"]], "taxlot.doesnotexist": [[34, "seed.models.tax_lots.TaxLot.DoesNotExist"]], "taxlot.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLot.MultipleObjectsReturned"]], "taxlotauditlog (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLotAuditLog"]], "taxlotauditlog.doesnotexist": [[34, "seed.models.tax_lots.TaxLotAuditLog.DoesNotExist"]], "taxlotauditlog.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLotAuditLog.MultipleObjectsReturned"]], "taxlotstate (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLotState"]], "taxlotstate.doesnotexist": [[34, "seed.models.tax_lots.TaxLotState.DoesNotExist"]], "taxlotstate.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLotState.MultipleObjectsReturned"]], "taxlotview (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLotView"]], "taxlotview.doesnotexist": [[34, "seed.models.tax_lots.TaxLotView.DoesNotExist"]], "taxlotview.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLotView.MultipleObjectsReturned"]], "unit_types (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.UNIT_TYPES"]], "unmappable_property_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.UNMAPPABLE_PROPERTY_FIELDS"]], "unmappable_taxlot_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.UNMAPPABLE_TAXLOT_FIELDS"]], "unit (class in seed.models.models)": [[34, "seed.models.models.Unit"]], "unit.doesnotexist": [[34, "seed.models.models.Unit.DoesNotExist"]], "unit.multipleobjectsreturned": [[34, "seed.models.models.Unit.MultipleObjectsReturned"]], "white_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.WHITE_CHOICE"]], "account_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.account_name_column"]], "actual_emission_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.actual_emission_column"]], "actual_energy_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.actual_energy_column"]], "address_line_1 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.address_line_1"]], "address_line_1 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.address_line_1"]], "address_line_2 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.address_line_2"]], "address_line_2 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.address_line_2"]], "analysispropertyview (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.analysispropertyview"]], "analysispropertyview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.analysispropertyview_set"]], "analysispropertyview_set (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.analysispropertyview_set"]], "and_filter_groups (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.and_filter_groups"]], "audit_template_building_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.audit_template_building_id"]], "benchmark_id_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.benchmark_id_column"]], "block_number (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.block_number"]], "bounding_box (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.bounding_box"]], "bounding_box (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.bounding_box"]], "building_certification (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.building_certification"]], "building_count (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.building_count"]], "building_files (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.building_files"]], "cast() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.cast"]], "cast_column_value() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.cast_column_value"]], "centroid (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.centroid"]], "centroid (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.centroid"]], "city (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.city"]], "city (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.city"]], "clean() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.clean"]], "clean() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.clean"]], "color (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.color"]], "column_description (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.column_description"]], "column_list_profiles (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.column_list_profiles"]], "column_name (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.column_name"]], "column_set (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.column_set"]], "columnlistprofilecolumn_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.columnlistprofilecolumn_set"]], "compliance_label (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.compliance_label"]], "comstock_mapping (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.comstock_mapping"]], "conditioned_floor_area (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.conditioned_floor_area"]], "conditioned_floor_area_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.conditioned_floor_area_orig"]], "contact_email_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.contact_email_column"]], "contact_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.contact_name_column"]], "coparent() (seed.models.properties.propertystate class method)": [[34, "seed.models.properties.PropertyState.coparent"]], "coparent() (seed.models.tax_lots.taxlotstate class method)": [[34, "seed.models.tax_lots.TaxLotState.coparent"]], "copy_meters() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.copy_meters"]], "create_mappings() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.create_mappings"]], "create_mappings_from_file() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.create_mappings_from_file"]], "created (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.created"]], "created (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.created"]], "created (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.created"]], "created (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.created"]], "created (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.created"]], "created (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.created"]], "created (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.created"]], "created (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.created"]], "custom_id_1 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.custom_id_1"]], "custom_id_1 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.custom_id_1"]], "cycle (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.cycle"]], "cycle (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.cycle"]], "cycle_id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.cycle_id"]], "cycle_id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.cycle_id"]], "cycles (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.cycles"]], "data_admin_account_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_admin_account_name_column"]], "data_admin_email_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_admin_email_column"]], "data_admin_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_admin_name_column"]], "data_loggers (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.data_loggers"]], "data_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.data_state"]], "data_state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.data_state"]], "data_type (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_type"]], "dataview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.dataview_set"]], "dataviewparameter_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.dataviewparameter_set"]], "delete_all() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.delete_all"]], "derived_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derived_column"]], "derived_column_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derived_column_id"]], "derivedcolumn_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derivedcolumn_set"]], "derivedcolumnparameter_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derivedcolumnparameter_set"]], "description (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.description"]], "description (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.description"]], "display_name (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.display_name"]], "district (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.district"]], "egrid_subregion_code (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.egrid_subregion_code"]], "end (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.end"]], "energy_alerts (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.energy_alerts"]], "energy_score (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.energy_score"]], "event_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.event_set"]], "events (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.events"]], "exclude_filter_groups (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.exclude_filter_groups"]], "extra_data (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.extra_data"]], "extra_data (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.extra_data"]], "gapauditlog_view (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.gapauditlog_view"]], "generation_date (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.generation_date"]], "geocoding_confidence (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.geocoding_confidence"]], "geocoding_confidence (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.geocoding_confidence"]], "geocoding_order (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.geocoding_order"]], "get_color_display() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_color_display"]], "get_data_state_display() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_data_state_display"]], "get_data_state_display() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_data_state_display"]], "get_merge_protection_display() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_merge_protection_display"]], "get_merge_state_display() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_merge_state_display"]], "get_merge_state_display() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_merge_state_display"]], "get_next_by_created() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_next_by_created"]], "get_next_by_created() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_next_by_created"]], "get_next_by_created() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_next_by_created"]], "get_next_by_created() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_next_by_created"]], "get_next_by_created() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_next_by_created"]], "get_next_by_created() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_next_by_created"]], "get_next_by_created() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_next_by_created"]], "get_next_by_end() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_next_by_end"]], "get_next_by_modified() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_next_by_modified"]], "get_next_by_modified() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_next_by_modified"]], "get_next_by_start() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_next_by_start"]], "get_next_by_updated() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_next_by_updated"]], "get_next_by_updated() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_next_by_updated"]], "get_next_by_updated() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_next_by_updated"]], "get_next_by_updated() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_next_by_updated"]], "get_or_create_default() (seed.models.cycles.cycle class method)": [[34, "seed.models.cycles.Cycle.get_or_create_default"]], "get_previous_by_created() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_previous_by_created"]], "get_previous_by_created() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_previous_by_created"]], "get_previous_by_created() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_previous_by_created"]], "get_previous_by_created() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_previous_by_created"]], "get_previous_by_created() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_previous_by_created"]], "get_previous_by_created() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_previous_by_created"]], "get_previous_by_created() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_previous_by_created"]], "get_previous_by_end() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_previous_by_end"]], "get_previous_by_modified() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_previous_by_modified"]], "get_previous_by_modified() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_previous_by_modified"]], "get_previous_by_start() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_previous_by_start"]], "get_previous_by_updated() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_previous_by_updated"]], "get_previous_by_updated() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_previous_by_updated"]], "get_previous_by_updated() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_previous_by_updated"]], "get_previous_by_updated() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_previous_by_updated"]], "get_record_type_display() (seed.models.properties.propertyauditlog method)": [[34, "seed.models.properties.PropertyAuditLog.get_record_type_display"]], "get_record_type_display() (seed.models.tax_lots.taxlotauditlog method)": [[34, "seed.models.tax_lots.TaxLotAuditLog.get_record_type_display"]], "get_shared_field_type_display() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_shared_field_type_display"]], "get_source_type_display() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_source_type_display"]], "get_unit_type_display() (seed.models.models.unit method)": [[34, "seed.models.models.Unit.get_unit_type_display"]], "greenassessmentproperty_set (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.greenassessmentproperty_set"]], "gross_floor_area (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.gross_floor_area"]], "gross_floor_area_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.gross_floor_area_orig"]], "hash_object (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.hash_object"]], "hash_object (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.hash_object"]], "history() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.history"]], "history() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.history"]], "home_energy_score_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.home_energy_score_id"]], "id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.id"]], "id (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.id"]], "id (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.id"]], "id (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.id"]], "id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.id"]], "id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.id"]], "id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.id"]], "id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.id"]], "id (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.id"]], "id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.id"]], "id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.id"]], "id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.id"]], "import_file (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.import_file"]], "import_file (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.import_file"]], "import_file (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.import_file"]], "import_file_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.import_file_id"]], "import_file_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.import_file_id"]], "import_file_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.import_file_id"]], "import_filename (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.import_filename"]], "import_filename (seed.models.properties.propertyview property)": [[34, "seed.models.properties.PropertyView.import_filename"]], "import_filename (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.import_filename"]], "import_filename (seed.models.tax_lots.taxlotview property)": [[34, "seed.models.tax_lots.TaxLotView.import_filename"]], "importfile_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.importfile_set"]], "indication_label (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.indication_label"]], "initialize_audit_logs() (seed.models.properties.propertyview method)": [[34, "seed.models.properties.PropertyView.initialize_audit_logs"]], "initialize_audit_logs() (seed.models.tax_lots.taxlotview method)": [[34, "seed.models.tax_lots.TaxLotView.initialize_audit_logs"]], "inventory_documents (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.inventory_documents"]], "is_extra_data (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.is_extra_data"]], "is_matching_criteria (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.is_matching_criteria"]], "jurisdiction_property_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.jurisdiction_property_id"]], "jurisdiction_tax_lot_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.jurisdiction_tax_lot_id"]], "labels (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.labels"]], "labels (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.labels"]], "latitude (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.latitude"]], "latitude (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.latitude"]], "long_lat (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.long_lat"]], "long_lat (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.long_lat"]], "longitude (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.longitude"]], "longitude (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.longitude"]], "lot_number (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.lot_number"]], "mapped_mappings (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.mapped_mappings"]], "measure_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.measure_set"]], "measures (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.measures"]], "merge_protection (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.merge_protection"]], "merge_relationships() (seed.models.properties.propertystate class method)": [[34, "seed.models.properties.PropertyState.merge_relationships"]], "merge_relationships() (seed.models.tax_lots.taxlotstate class method)": [[34, "seed.models.tax_lots.TaxLotState.merge_relationships"]], "merge_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.merge_state"]], "merge_state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.merge_state"]], "meters (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.meters"]], "modified (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.modified"]], "name (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.name"]], "name (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.name"]], "name (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.name"]], "name (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.name"]], "normalized_address (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.normalized_address"]], "normalized_address (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.normalized_address"]], "notes (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.notes"]], "notes (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.notes"]], "number_properties (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.number_properties"]], "objects (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.objects"]], "objects (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.objects"]], "objects (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.objects"]], "objects (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.objects"]], "objects (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.objects"]], "objects (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.objects"]], "objects (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.objects"]], "objects (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.objects"]], "objects (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.objects"]], "objects (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.objects"]], "objects (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.objects"]], "objects (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.objects"]], "occupied_floor_area (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.occupied_floor_area"]], "occupied_floor_area_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.occupied_floor_area_orig"]], "or_filter_groups (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.or_filter_groups"]], "organization (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.organization"]], "organization (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.organization"]], "organization (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.organization"]], "organization (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.organization"]], "organization (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.organization"]], "organization (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.organization"]], "organization (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.organization"]], "organization (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.organization"]], "organization_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.organization_id"]], "organization_id (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.organization_id"]], "organization_id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.organization_id"]], "organization_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.organization_id"]], "organization_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.organization_id"]], "organization_id (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.organization_id"]], "organization_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.organization_id"]], "organization_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.organization_id"]], "owner (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner"]], "owner_address (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_address"]], "owner_city_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_city_state"]], "owner_email (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_email"]], "owner_postal_code (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_postal_code"]], "owner_telephone (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_telephone"]], "parent1 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent1"]], "parent1 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent1"]], "parent1_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent1_id"]], "parent1_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent1_id"]], "parent2 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent2"]], "parent2 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent2"]], "parent2_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent2_id"]], "parent2_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent2_id"]], "parent_property (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.parent_property"]], "parent_property_id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.parent_property_id"]], "parent_state1 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state1"]], "parent_state1 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.parent_state1"]], "parent_state1 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state1"]], "parent_state1_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state1_id"]], "parent_state1_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state1_id"]], "parent_state2 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state2"]], "parent_state2 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.parent_state2"]], "parent_state2 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state2"]], "parent_state2_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state2_id"]], "parent_state2_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state2_id"]], "pm_parent_property_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.pm_parent_property_id"]], "pm_property_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.pm_property_id"]], "post_save_property_state() (in module seed.models.properties)": [[34, "seed.models.properties.post_save_property_state"]], "post_save_property_view() (in module seed.models.properties)": [[34, "seed.models.properties.post_save_property_view"]], "post_save_taxlot_state() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.post_save_taxlot_state"]], "post_save_taxlot_view() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.post_save_taxlot_view"]], "postal_code (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.postal_code"]], "postal_code (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.postal_code"]], "pre_delete_state() (in module seed.models.properties)": [[34, "seed.models.properties.pre_delete_state"]], "promote() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.promote"]], "promote() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.promote"]], "property (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.property"]], "property_footprint (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_footprint"]], "property_id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.property_id"]], "property_name (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_name"]], "property_notes (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_notes"]], "property_set (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.property_set"]], "property_states() (seed.models.tax_lots.taxlotview method)": [[34, "seed.models.tax_lots.TaxLotView.property_states"]], "property_timezone (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_timezone"]], "property_type (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_type"]], "property_views() (seed.models.tax_lots.taxlotview method)": [[34, "seed.models.tax_lots.TaxLotView.property_views"]], "propertyauditlog_parent1 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.propertyauditlog_parent1"]], "propertyauditlog_parent2 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.propertyauditlog_parent2"]], "propertyauditlog_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.propertyauditlog_state"]], "propertyauditlog_view (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.propertyauditlog_view"]], "propertymeasure_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.propertymeasure_set"]], "propertyview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.propertyview_set"]], "propertyview_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.propertyview_set"]], "propertyview_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.propertyview_set"]], "raw_mappings (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.raw_mappings"]], "recent_sale_date (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.recent_sale_date"]], "recognize_empty (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.recognize_empty"]], "record_type (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.record_type"]], "record_type (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.record_type"]], "release_date (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.release_date"]], "rename_column() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.rename_column"]], "retrieve_all() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_all"]], "retrieve_all_by_tuple() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_all_by_tuple"]], "retrieve_db_field_name_for_hash_comparison() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_field_name_for_hash_comparison"]], "retrieve_db_field_table_and_names_from_db_tables() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_field_table_and_names_from_db_tables"]], "retrieve_db_fields() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_fields"]], "retrieve_db_fields_from_db_tables() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_fields_from_db_tables"]], "retrieve_db_types() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_types"]], "retrieve_mapping_columns() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_mapping_columns"]], "retrieve_priorities() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_priorities"]], "rule_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.rule_set"]], "salesforce_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.salesforce_column"]], "save() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.save"]], "save() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.save"]], "save() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.save"]], "save_column_names() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.save_column_names"]], "scenarios (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.scenarios"]], "seed.models.auditlog": [[34, "module-seed.models.auditlog"]], "seed.models.columns": [[34, "module-seed.models.columns"]], "seed.models.cycles": [[34, "module-seed.models.cycles"]], "seed.models.models": [[34, "module-seed.models.models"]], "seed.models.properties": [[34, "module-seed.models.properties"]], "seed.models.tax_lots": [[34, "module-seed.models.tax_lots"]], "shared_field_type (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.shared_field_type"]], "show_in_list (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.show_in_list"]], "simulation (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.simulation"]], "site_eui (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui"]], "site_eui_modeled (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_modeled"]], "site_eui_modeled_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_modeled_orig"]], "site_eui_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_orig"]], "site_eui_weather_normalized (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_weather_normalized"]], "site_eui_weather_normalized_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_weather_normalized_orig"]], "source_eui (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui"]], "source_eui_modeled (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_modeled"]], "source_eui_modeled_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_modeled_orig"]], "source_eui_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_orig"]], "source_eui_weather_normalized (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_weather_normalized"]], "source_eui_weather_normalized_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_weather_normalized_orig"]], "source_type (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_type"]], "space_alerts (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.space_alerts"]], "start (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.start"]], "state (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.state"]], "state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.state"]], "state (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.state"]], "state (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.state"]], "state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.state"]], "state (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.state"]], "state_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.state_id"]], "state_id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.state_id"]], "state_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.state_id"]], "state_id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.state_id"]], "super_organization (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.super_organization"]], "super_organization_id (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.super_organization_id"]], "sync_latitude_longitude_and_long_lat() (in module seed.models.properties)": [[34, "seed.models.properties.sync_latitude_longitude_and_long_lat"]], "sync_latitude_longitude_and_long_lat() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.sync_latitude_longitude_and_long_lat"]], "table_name (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.table_name"]], "target_emission_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.target_emission_column"]], "target_energy_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.target_energy_column"]], "tax_lot_states() (seed.models.properties.propertyview method)": [[34, "seed.models.properties.PropertyView.tax_lot_states"]], "tax_lot_views() (seed.models.properties.propertyview method)": [[34, "seed.models.properties.PropertyView.tax_lot_views"]], "taxlot (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlot"]], "taxlot_footprint (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlot_footprint"]], "taxlot_id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlot_id"]], "taxlotauditlog_parent1 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.taxlotauditlog_parent1"]], "taxlotauditlog_parent2 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.taxlotauditlog_parent2"]], "taxlotauditlog_parent_state1 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotauditlog_parent_state1"]], "taxlotauditlog_parent_state2 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotauditlog_parent_state2"]], "taxlotauditlog_state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotauditlog_state"]], "taxlotauditlog_view (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlotauditlog_view"]], "taxlotproperty_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.taxlotproperty_set"]], "taxlotproperty_set (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.taxlotproperty_set"]], "taxlotproperty_set (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlotproperty_set"]], "taxlotview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.taxlotview_set"]], "taxlotview_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.taxlotview_set"]], "taxlotview_set (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotview_set"]], "to_dict() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.to_dict"]], "to_dict() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.to_dict"]], "to_dict() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.to_dict"]], "total_ghg_emissions (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_ghg_emissions"]], "total_ghg_emissions_intensity (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_ghg_emissions_intensity"]], "total_marginal_ghg_emissions (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_marginal_ghg_emissions"]], "total_marginal_ghg_emissions_intensity (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_marginal_ghg_emissions_intensity"]], "ubid (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.ubid"]], "ubid (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.ubid"]], "ubidmodel_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.ubidmodel_set"]], "ubidmodel_set (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.ubidmodel_set"]], "unit (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.unit"]], "unit_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.unit_id"]], "unit_name (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.unit_name"]], "unit_type (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.unit_type"]], "units_pint (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.units_pint"]], "updated (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.updated"]], "updated (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.updated"]], "updated (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.updated"]], "updated (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.updated"]], "use_description (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.use_description"]], "user (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.user"]], "user_id (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.user_id"]], "validate_model() (in module seed.models.columns)": [[34, "seed.models.columns.validate_model"]], "view (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.view"]], "view (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.view"]], "view_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.view_id"]], "view_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.view_id"]], "views (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.views"]], "views (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.views"]], "violation_label (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.violation_label"]], "x_axis_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.x_axis_columns"]], "year_built (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.year_built"]], "year_ending (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.year_ending"]], "seed.public": [[35, "module-seed.public"]], "celerydatetimeserializer (class in seed.serializers.celery)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer"]], "labelserializer (class in seed.serializers.labels)": [[36, "seed.serializers.labels.LabelSerializer"]], "labelserializer.meta (class in seed.serializers.labels)": [[36, "seed.serializers.labels.LabelSerializer.Meta"]], "default() (seed.serializers.celery.celerydatetimeserializer method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.default"]], "extra_kwargs (seed.serializers.labels.labelserializer.meta attribute)": [[36, "seed.serializers.labels.LabelSerializer.Meta.extra_kwargs"]], "fields (seed.serializers.labels.labelserializer.meta attribute)": [[36, "seed.serializers.labels.LabelSerializer.Meta.fields"]], "get_is_applied() (seed.serializers.labels.labelserializer method)": [[36, "seed.serializers.labels.LabelSerializer.get_is_applied"]], "model (seed.serializers.labels.labelserializer.meta attribute)": [[36, "seed.serializers.labels.LabelSerializer.Meta.model"]], "seed.serializers": [[36, "module-seed.serializers"]], "seed.serializers.celery": [[36, "module-seed.serializers.celery"]], "seed.serializers.labels": [[36, "module-seed.serializers.labels"]], "seed_decoder() (seed.serializers.celery.celerydatetimeserializer static method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.seed_decoder"]], "seed_dumps() (seed.serializers.celery.celerydatetimeserializer static method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.seed_dumps"]], "seed_loads() (seed.serializers.celery.celerydatetimeserializer static method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.seed_loads"]], "to_representation() (seed.serializers.labels.labelserializer method)": [[36, "seed.serializers.labels.LabelSerializer.to_representation"]], "breadcrumbnode (class in seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.BreadcrumbNode"]], "urlbreadcrumbnode (class in seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.UrlBreadcrumbNode"]], "breadcrumb() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb"]], "breadcrumb_root() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb_root"]], "breadcrumb_url() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb_url"]], "breadcrumb_url_root() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb_url_root"]], "create_crumb() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.create_crumb"]], "create_crumb_first() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.create_crumb_first"]], "render() (seed.templatetags.breadcrumbs.breadcrumbnode method)": [[37, "seed.templatetags.breadcrumbs.BreadcrumbNode.render"]], "render() (seed.templatetags.breadcrumbs.urlbreadcrumbnode method)": [[37, "seed.templatetags.breadcrumbs.UrlBreadcrumbNode.render"]], "seed.templatetags.breadcrumbs": [[37, "module-seed.templatetags.breadcrumbs"]], "seed.test_helpers": [[38, "module-seed.test_helpers"]], "djangofunctionalfactory (class in seed.test_helpers.factory.helpers)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory"]], "invalid_test_cc_number() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.invalid_test_cc_number"]], "rand_bool() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_bool"]], "rand_city() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_city"]], "rand_city_suffix() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_city_suffix"]], "rand_currency() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_currency"]], "rand_date() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_date"]], "rand_domain() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_domain"]], "rand_email() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_email"]], "rand_float() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_float"]], "rand_int() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_int"]], "rand_name() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_name"]], "rand_phone() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_phone"]], "rand_plant_name() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_plant_name"]], "rand_str() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_str"]], "rand_street_address() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_street_address"]], "rand_street_suffix() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_street_suffix"]], "seed.test_helpers.factory.helpers": [[39, "module-seed.test_helpers.factory.helpers"]], "test_cc_number() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.test_cc_number"]], "valid_test_cc_number() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.valid_test_cc_number"]], "adminviewstest (class in seed.tests.test_admin_views)": [[41, "seed.tests.test_admin_views.AdminViewsTest"]], "assertdictsubsetmixin (class in seed.tests.util)": [[41, "seed.tests.util.AssertDictSubsetMixin"]], "classdecoratortests (class in seed.tests.test_decorators)": [[41, "seed.tests.test_decorators.ClassDecoratorTests"]], "datamappingbasetestcase (class in seed.tests.util)": [[41, "seed.tests.util.DataMappingBaseTestCase"]], "deletemodelstestcase (class in seed.tests.util)": [[41, "seed.tests.util.DeleteModelsTestCase"]], "fakeclient (class in seed.tests.util)": [[41, "seed.tests.util.FakeClient"]], "fakerequest (class in seed.tests.util)": [[41, "seed.tests.util.FakeRequest"]], "get (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.GET"]], "getdatasetsviewstests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.GetDatasetsViewsTests"]], "importfileviewstests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.ImportFileViewsTests"]], "inventoryviewtests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.InventoryViewTests"]], "meta (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.META"]], "mainviewtests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.MainViewTests"]], "post (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.POST"]], "requireorganizationidtests (class in seed.tests.test_decorators)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests"]], "testdecorators (class in seed.tests.test_decorators)": [[41, "seed.tests.test_decorators.TestDecorators"]], "testexception": [[41, "seed.tests.test_decorators.TestException"]], "testmcmviews (class in seed.tests.test_views)": [[41, "seed.tests.test_views.TestMCMViews"]], "testtasks (class in seed.tests.test_tasks)": [[41, "seed.tests.test_tasks.TestTasks"]], "assertdictcontainssubset() (seed.tests.util.assertdictsubsetmixin method)": [[41, "seed.tests.util.AssertDictSubsetMixin.assertDictContainsSubset"]], "assert_expected_mappings() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.assert_expected_mappings"]], "body (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.body"]], "create_import_file() (seed.tests.util.datamappingbasetestcase method)": [[41, "seed.tests.util.DataMappingBaseTestCase.create_import_file"]], "expected_mappings (seed.tests.test_views.testmcmviews attribute)": [[41, "seed.tests.test_views.TestMCMViews.expected_mappings"]], "get() (seed.tests.util.fakeclient method)": [[41, "seed.tests.util.FakeClient.get"]], "locked (seed.tests.test_decorators.testdecorators attribute)": [[41, "seed.tests.test_decorators.TestDecorators.locked"]], "path (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.path"]], "pk (seed.tests.test_decorators.testdecorators attribute)": [[41, "seed.tests.test_decorators.TestDecorators.pk"]], "post() (seed.tests.util.fakeclient method)": [[41, "seed.tests.util.FakeClient.post"]], "raw_columns_expected (seed.tests.test_views.testmcmviews attribute)": [[41, "seed.tests.test_views.TestMCMViews.raw_columns_expected"]], "seed.tests.test_admin_views": [[41, "module-seed.tests.test_admin_views"]], "seed.tests.test_decorators": [[41, "module-seed.tests.test_decorators"]], "seed.tests.test_tasks": [[41, "module-seed.tests.test_tasks"]], "seed.tests.test_views": [[41, "module-seed.tests.test_views"]], "seed.tests.util": [[41, "module-seed.tests.util"]], "setup() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.setUp"]], "setup() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.setUp"]], "setup() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.setUp"]], "setup() (seed.tests.test_tasks.testtasks method)": [[41, "seed.tests.test_tasks.TestTasks.setUp"]], "setup() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.setUp"]], "setup() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.setUp"]], "setup() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.setUp"]], "setup() (seed.tests.test_views.mainviewtests method)": [[41, "seed.tests.test_views.MainViewTests.setUp"]], "setup() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.setUp"]], "setup() (seed.tests.util.deletemodelstestcase method)": [[41, "seed.tests.util.DeleteModelsTestCase.setUp"]], "set_up() (seed.tests.util.datamappingbasetestcase method)": [[41, "seed.tests.util.DataMappingBaseTestCase.set_up"]], "teardown() (seed.tests.util.deletemodelstestcase method)": [[41, "seed.tests.util.DeleteModelsTestCase.tearDown"]], "test_add_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_org"]], "test_add_org_dupe() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_org_dupe"]], "test_add_user_existing_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_user_existing_org"]], "test_add_user_new_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_user_new_org"]], "test_add_user_no_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_user_no_org"]], "test_ajax_request_class_dict() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_dict"]], "test_ajax_request_class_dict_status_error() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_dict_status_error"]], "test_ajax_request_class_dict_status_false() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_dict_status_false"]], "test_ajax_request_class_format_type() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_format_type"]], "test_create_dataset() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_create_dataset"]], "test_delete_dataset() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_delete_dataset"]], "test_delete_file() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.test_delete_file"]], "test_delete_organization() (seed.tests.test_tasks.testtasks method)": [[41, "seed.tests.test_tasks.TestTasks.test_delete_organization"]], "test_get_column_mapping_suggestions() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_column_mapping_suggestions"]], "test_get_column_mapping_suggestions_pm_file() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_column_mapping_suggestions_pm_file"]], "test_get_column_mapping_suggestions_with_columns() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_column_mapping_suggestions_with_columns"]], "test_get_cycles() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_cycles"]], "test_get_dataset() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_dataset"]], "test_get_datasets() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_datasets"]], "test_get_datasets_count() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_datasets_count"]], "test_get_datasets_count_invalid() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_datasets_count_invalid"]], "test_get_import_file() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.test_get_import_file"]], "test_get_matching_and_geocoding_results() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.test_get_matching_and_geocoding_results"]], "test_get_prog_key() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_get_prog_key"]], "test_get_properties() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties"]], "test_get_properties_cycle_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_cycle_id"]], "test_get_properties_empty_page() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_empty_page"]], "test_get_properties_page_not_an_integer() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_page_not_an_integer"]], "test_get_properties_pint_fields() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_pint_fields"]], "test_get_properties_profile_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_profile_id"]], "test_get_properties_property_extra_data() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_property_extra_data"]], "test_get_properties_select_all() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_select_all"]], "test_get_properties_taxlot_extra_data() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_taxlot_extra_data"]], "test_get_properties_with_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_with_taxlots"]], "test_get_properties_with_taxlots_with_footprints() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_with_taxlots_with_footprints"]], "test_get_properties_wrong_query_params() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_wrong_query_params"]], "test_get_property() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_property"]], "test_get_property_columns() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_property_columns"]], "test_get_property_multiple_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_property_multiple_taxlots"]], "test_get_raw_column_names() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_raw_column_names"]], "test_get_taxlot() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlot"]], "test_get_taxlot_columns() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlot_columns"]], "test_get_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots"]], "test_get_taxlots_empty_page() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_empty_page"]], "test_get_taxlots_extra_data() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_extra_data"]], "test_get_taxlots_multiple_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_multiple_taxlots"]], "test_get_taxlots_no_cycle_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_no_cycle_id"]], "test_get_taxlots_page_not_an_integer() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_page_not_an_integer"]], "test_get_taxlots_profile_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_profile_id"]], "test_home() (seed.tests.test_views.mainviewtests method)": [[41, "seed.tests.test_views.MainViewTests.test_home"]], "test_increment_cache() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_increment_cache"]], "test_locking() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_locking"]], "test_locking_w_exception() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_locking_w_exception"]], "test_postoffice() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_postoffice"]], "test_progress() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_progress"]], "test_progress() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_progress"]], "test_require_organization_id_class_no_org_id() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_require_organization_id_class_no_org_id"]], "test_require_organization_id_class_org_id() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_require_organization_id_class_org_id"]], "test_require_organization_id_class_org_id_not_int() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_require_organization_id_class_org_id_not_int"]], "test_require_organization_id_fail_no_key() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_fail_no_key"]], "test_require_organization_id_fail_not_numeric() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_fail_not_numeric"]], "test_require_organization_id_success_integer() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_success_integer"]], "test_require_organization_id_success_string() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_success_string"]], "test_save_column_mappings() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_save_column_mappings"]], "test_save_column_mappings_idempotent() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_save_column_mappings_idempotent"]], "test_signup_process() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_signup_process"]], "test_signup_process_force_lowercase_email() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_signup_process_force_lowercase_email"]], "test_update_dataset() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_update_dataset"]], "test_update_pint_fields_with_modified_display_settings() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_update_pint_fields_with_modified_display_settings"]], "unlocked (seed.tests.test_decorators.testdecorators attribute)": [[41, "seed.tests.test_decorators.TestDecorators.unlocked"]], "apibypasscsrfmiddleware (class in seed.utils.api)": [[44, "seed.utils.api.APIBypassCSRFMiddleware"]], "orgcreatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgCreateMixin"]], "orgcreateupdatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgCreateUpdateMixin"]], "orgmixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgMixin"]], "orgquerysetmixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgQuerySetMixin"]], "orgupdatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgUpdateMixin"]], "orgvalidatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgValidateMixin"]], "orgvalidator (class in seed.utils.api)": [[44, "seed.utils.api.OrgValidator"]], "profileidmixin (class in seed.utils.api)": [[44, "seed.utils.api.ProfileIdMixin"]], "api_endpoint() (in module seed.utils.api)": [[44, "seed.utils.api.api_endpoint"]], "api_endpoint_class() (in module seed.utils.api)": [[44, "seed.utils.api.api_endpoint_class"]], "clean_api_regex() (in module seed.utils.api)": [[44, "seed.utils.api.clean_api_regex"]], "convert_datestr() (in module seed.utils.time)": [[44, "seed.utils.time.convert_datestr"]], "convert_to_js_timestamp() (in module seed.utils.time)": [[44, "seed.utils.time.convert_to_js_timestamp"]], "create_organization() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.create_organization"]], "create_suborganization() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.create_suborganization"]], "default_pm_mappings() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.default_pm_mappings"]], "drf_api_endpoint() (in module seed.utils.api)": [[44, "seed.utils.api.drf_api_endpoint"]], "field (seed.utils.api.orgvalidator attribute)": [[44, "seed.utils.api.OrgValidator.field"]], "format_api_docstring() (in module seed.utils.api)": [[44, "seed.utils.api.format_api_docstring"]], "get_all_urls() (in module seed.utils.api)": [[44, "seed.utils.api.get_all_urls"]], "get_api_endpoints() (in module seed.utils.api)": [[44, "seed.utils.api.get_api_endpoints"]], "get_api_request_user() (in module seed.utils.api)": [[44, "seed.utils.api.get_api_request_user"]], "get_org_id_from_validator() (in module seed.utils.api)": [[44, "seed.utils.api.get_org_id_from_validator"]], "get_organization() (seed.utils.api.orgmixin method)": [[44, "seed.utils.api.OrgMixin.get_organization"]], "get_parent_org() (seed.utils.api.orgmixin method)": [[44, "seed.utils.api.OrgMixin.get_parent_org"]], "get_queryset() (seed.utils.api.orgquerysetmixin method)": [[44, "seed.utils.api.OrgQuerySetMixin.get_queryset"]], "get_show_columns() (seed.utils.api.profileidmixin method)": [[44, "seed.utils.api.ProfileIdMixin.get_show_columns"]], "get_source_type() (in module seed.utils.buildings)": [[44, "seed.utils.buildings.get_source_type"]], "key (seed.utils.api.orgvalidator attribute)": [[44, "seed.utils.api.OrgValidator.key"]], "parse_datetime() (in module seed.utils.time)": [[44, "seed.utils.time.parse_datetime"]], "perform_create() (seed.utils.api.orgcreatemixin method)": [[44, "seed.utils.api.OrgCreateMixin.perform_create"]], "perform_update() (seed.utils.api.orgupdatemixin method)": [[44, "seed.utils.api.OrgUpdateMixin.perform_update"]], "rgetattr() (in module seed.utils.api)": [[44, "seed.utils.api.rgetattr"]], "seed.utils.api": [[44, "module-seed.utils.api"]], "seed.utils.buildings": [[44, "module-seed.utils.buildings"]], "seed.utils.organizations": [[44, "module-seed.utils.organizations"]], "seed.utils.time": [[44, "module-seed.utils.time"]], "validate() (seed.utils.api.orgvalidatemixin method)": [[44, "seed.utils.api.OrgValidateMixin.validate"]], "validate_org() (seed.utils.api.orgvalidatemixin method)": [[44, "seed.utils.api.OrgValidateMixin.validate_org"]]}}) \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/setup_docker.html b/docs/code_documentation/2.22.0/setup_docker.html new file mode 100644 index 00000000..b9298e7f --- /dev/null +++ b/docs/code_documentation/2.22.0/setup_docker.html @@ -0,0 +1,254 @@ + + + + + + + Installation using Docker — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Installation using Docker

+

Docker works natively on Linux, Mac OSX, and Windows 10. If you are using an older version of +Windows (and some older versions of Mac OSX), you will need to install Docker Toolbox.

+

Choose either Docker Native (Windows/OSX) or Docker Native (Ubuntu) to +install Docker.

+
+

Docker Native (Ubuntu)

+

Follow instructions here.

+ +
+
+

Docker Native (Windows/OSX)

+

Following instructions for Mac or +for Windows. Note that for OSX you must have docker desktop version 3.0 or later <https://github.com/concourse/concourse/issues/6038>.

+ +
+
+

Building and Running Containers for Non-Development

+
    +
  • Run Docker Compose

    +
    +
    docker-compose build
    +
    +
    +

    Be Patient … If the containers build successfully, then start the containers

    +
    docker volume create --name=seed_pgdata
    +docker volume create --name=seed_media
    +docker-compose up
    +
    +
    +

    Note that you may need to build the containers a couple times for everything to converge

    +
    +
  • +
  • Login to container

    +
    +

    The docker-compose file creates a default user and password. Below are the defaults but can +be overridden by setting environment variables.

    +
    username: user@seed-platform.org
    +password: super-secret-password
    +
    +
    +
    +
  • +
+
+

Note

+

Don’t forget that you need to reset your default username and password if you are going +to use these Docker images in production mode!

+
+
+
+

Using Docker for Development

+

The development environment is configured for live reloading (i.e., restart webserver when files change) +and debugging. It builds off the base docker-compose.yml, so it’s necessary +to specify the files being used in docker-compose commands as seen below.

+
+

Build

+
# create volumes for the database and media directory
+docker volume create --name=seed_pgdata
+docker volume create --name=seed_media
+
+# build the images
+docker-compose -f docker-compose.yml -f docker-compose.dev.yml build
+
+
+
+
+

Running the Server

+

NOTE: the server config is sourced from config.settings.docker_dev, which will include +your local_untracked.py if it exists. If you have a local_untracked.py, make sure it doesn’t +overwrite the database or celery configuration!

+
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up
+
+
+

If the server doesn’t start successfully, and docker-compose logs doesn’t help, +the django development server probably failed to start due to an error in your config or code. +Unfortunately docker/django logging doesn’t appear to work when the container is first started. +Just try running the server yourself with docker exec, and see what the output is.

+

The development docker-compose file has some configurable parameters for specifying volumes to use:

+
    +
  • SEED_DB_VOLUME: the name of the docker volume to mount for postgres

  • +
  • SEED_MEDIA_VOLUME: the name of the docker volume to mount for the seed media folder

  • +
+

Docker will use environment variables from the shell or from a .env file to set these values.

+

This is useful if you want to switch between different databases for testing. +For example, if you want to create a separate volume for storing a production backup, you could do the following

+
docker volume create --name=seed_pgdata_prod
+SEED_DB_VOLUME=seed_pgdata_prod docker-compose -f docker-compose.yml -f docker-compose.dev.yml up
+
+
+

NOTE: you’ll need to run docker-compose down to remove the containers before you +can restart the containers connecting to different volumes.

+
+
+

Running Tests

+

While the containers are running (i.e., after running the docker-compose up command), use docker exec to run tests in the web container:

+
docker exec -it seed_web ./manage.py test --settings config.settings.docker_dev
+
+
+

Add the setting --nocapture in order to see stdout while running tests. You will need to do this in order to make use of debugging as described below or the output to your debug commands will not display until after the break point has passed and the tests are finished.

+

Also worth noting: output from logging (_log.debug, etc) will not display in any situation unless a test fails.

+
+
+

Debugging

+

To use pdb on the server, the web container has remote-pdb installed. +In your code, insert the following

+
import remote_pdb; remote_pdb.set_trace()
+
+
+

Once the breakpoint is triggered, you should see the web container log something like “RemotePdb session open at 127.0.0.1:41653, waiting for connection …”. +To connect to the remote session, run netcat from inside the container (using the appropriate port).

+
docker exec -it seed_web nc 127.0.0.1:41653
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/setup_osx.html b/docs/code_documentation/2.22.0/setup_osx.html new file mode 100644 index 00000000..ac1e8498 --- /dev/null +++ b/docs/code_documentation/2.22.0/setup_osx.html @@ -0,0 +1,467 @@ + + + + + + + Installation on OSX — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Installation on OSX

+

These instructions are for installing and running SEED on Mac OSX in +development mode.

+
+

Quick Installation Instructions

+

This section is intended for developers who may already have their machine +ready for general development. If this is not the case, skip to Prerequisites. Note that SEED uses python 3.

+
    +
  • install Postgres 11.1 and redis for cache and message broker

  • +
  • install PostGIS 2.5 and enable it on the database using CREATE EXTENSION postgis;

  • +
  • install TimescaleDB 1.5.0

  • +
  • use a virtualenv (if desired)

  • +
  • git clone git@github.com:seed-platform/seed.git

  • +
  • create a local_untracked.py in the config/settings folder and add CACHE and DB config (example local_untracked.py.dist)

  • +
  • to enable geocoding, get MapQuest API key and attach it to your organization

  • +
  • export DJANGO_SETTINGS_MODULE=config.settings.dev in all terminals used by SEED (celery terminal and runserver terminal)

  • +
  • +
    pip install -r requirements/local.txt
      +
    • for condas python, you way need to run this command to get pip install to succeed: conda install -c conda-forge python-crfsuite

    • +
    +
    +
    +
  • +
  • npm install

  • +
  • ./manage.py migrate

  • +
  • ./manage.py create_default_user

  • +
  • ./manage.py runserver

  • +
  • DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 4 –max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler

  • +
  • navigate to http://127.0.0.1:8000/app/#/profile/admin in your browser to add users to organizations

  • +
  • main app runs at 127.0.0.1:8000/app

  • +
+

The python manage.py create_default_user will setup a default superuser +which must be used to access the system the first time. The management command +can also create other superusers.

+
./manage.py create_default_user --username=demo@seed-platform.org --organization=lbl --password=demo123
+
+
+
+
+

Prerequisites

+

These instructions assume you have MacPorts or Homebrew. Your system +should have the following dependencies already installed:

+
    +
  • git (port install git or brew install git)

  • +
  • graphviz (brew install graphviz)

  • +
  • pyenv (Recommended)

    +
    +
    +

    Note

    +

    Although you could install Python packages globally, this is the +easiest way to install Python packages. Setting these up first will +help avoid polluting your base Python installation and make it much +easier to switch between different versions of the code.

    +
    +
    brew install pyenv
    +brew install pyenv-virtualenv
    +pyenv install <python3 version you want>
    +pyenv virtualenv <python3 version you want> seed
    +pyenv local seed
    +
    +
    +
    +
  • +
+
+
+

PostgreSQL 11.1

+

MacPorts:

+
sudo su - root
+port install postgresql94-server postgresql94 postgresql94-doc
+# init db
+mkdir -p /opt/local/var/db/postgresql94/defaultdb
+chown postgres:postgres /opt/local/var/db/postgresql94/defaultdb
+su postgres -c '/opt/local/lib/postgresql94/bin/initdb -D /opt/local/var/db/postgresql94/defaultdb'
+
+# At this point, you may want to add start/stop scripts or aliases to
+# ~/.bashrc or your virtualenv ``postactivate`` script
+# (in ``~/.virtualenvs/{env-name}/bin/postactivate``).
+
+alias pg_start='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \
+    -D /opt/local/var/db/postgresql94/defaultdb \
+    -l /opt/local/var/db/postgresql94/defaultdb/postgresql.log start"'
+alias pg_stop='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \
+    -D /opt/local/var/db/postgresql94/defaultdb stop"'
+
+pg_start
+
+sudo su - postgres
+PATH=$PATH:/opt/local/lib/postgresql94/bin/
+
+
+

Homebrew:

+
brew install postgres
+# follow the post install instructions to add to launchagents or call
+# manually with `postgres -D /usr/local/var/postgres`
+# Skip the remaining Postgres instructions!
+
+
+

Configure PostgreSQL. Replace ‘seeddb’, ‘seeduser’ with desired db/user. By +default use password seedpass when prompted. Use the code block below in development only since +the seeduser is a SUPERUSER.

+
createuser -P seeduser
+createdb `whoami`
+psql -c 'CREATE DATABASE "seeddb" WITH OWNER = "seeduser";'
+psql -c 'GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO seeduser;'
+psql -c 'ALTER ROLE seeduser SUPERUSER;'
+
+
+
+
+

PostGIS 2.5

+

MacPorts:

+
# Assuming you're still root from installing PostgreSQL,
+port install postgis2
+
+
+

Homebrew:

+
brew install postgis
+
+
+

Configure PostGIS:

+
psql -d seeddb -c "CREATE EXTENSION postgis;"
+
+# For testing, give seed user superuser access:
+# psql -c 'ALTER USER seeduser CREATEDB;'
+
+
+

If upgrading from an existing database or existing local_untracked.py file, make sure to add the +MapQuest API Key and set the database engine to ‘ENGINE’: ‘django.contrib.gis.db.backends.postgis’.

+

Now exit any root environments, becoming just yourself (even though it’s not +that easy being green), for the remainder of these instructions.

+
+
+

TimescaleDB 1.5.0

+

Note, as of version 1.5.0, dumping and restoring databases requires that both the source and target +database have the same version of TimescaleDB.

+

Downloading From Source:

+
# Note: Installing from source should only be done
+# if you have a Postgres installation not maintained by Homebrew.
+# This installation requires C compiler (e.g., gcc or clang) and CMake version 3.4 or greater.
+
+git clone https://github.com/timescale/timescaledb.git
+cd timescaledb
+git checkout 1.5.0
+
+# Bootstrap the build system
+./bootstrap
+
+# If OpenSSL can't be found by cmake - run the following instead
+# ./bootstrap -DOPENSSL_ROOT_DIR=<location of OpenSSL> # e.g., -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl
+
+# To build the extension
+cd build && make
+
+# To install
+make install
+
+# Find postgresql.conf
+# Then uncomment the shared_preload_libraries line changing it to the following
+# shared_preload_libraries = 'timescaledb'
+psql -d postgres -c "SHOW config_file;"
+
+# Restart PostgreSQL instance
+
+
+
+
+

Python Packages

+

Run these commands as your normal user id.

+

Change to a virtualenv (using virtualenvwrapper) or do the following as a +superuser. A virtualenv is usually better for development. Set the virtualenv +to seed.

+
workon seed
+
+
+

Make sure PostgreSQL command line scripts are in your PATH (if using MacPorts)

+
export PATH=$PATH:/opt/local/lib/postgresql94/bin
+
+
+

Some packages (uWSGI) may need to find your C compiler. Make sure you have +‘gcc’ on your system, and then also export this to the CC environment +variable:

+
export CC=gcc
+
+
+

Install requirements with pip

+
pip install -r requirements/local.txt
+
+
+
+
+

NodeJS/npm

+

Install npm. You can do this by installing from nodejs.org, MacPorts, or +Homebrew:

+

MacPorts:

+
sudo port install npm
+
+
+

Homebrew:

+
brew install npm
+
+
+
+
+

Configure Django and Databases

+

In the config/settings directory, there must be a file called +local_untracked.py that sets up databases and a number of other things. +To create and edit this file, start by copying over the template

+
cd config/settings
+cp local_untracked.py.dist local_untracked.py
+
+
+

Edit local_untracked.py. Open the file you created in your favorite editor. The PostgreSQL config section will look something like this:

+
# postgres DB config
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.contrib.gis.db.backends.postgis',
+        'NAME': 'seeddb',
+        'USER': 'seeduser',
+        'PASSWORD': 'seedpass',
+        'HOST': 'localhost',
+        'PORT': '5432',
+    }
+}
+
+
+

You may want to comment out the AWS settings.

+

For Redis, edit the CACHES and CELERY_BROKER_URL values to look like this:

+
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+
+
+
+

MapQuest API Key

+

Register for a MapQuest API key: +https://developer.mapquest.com/plan_purchase/steps/business_edition/business_edition_free/register

+

Visit the Manage Keys page: +https://developer.mapquest.com/user/me/apps +Either create a new key or use the key initially provided. +Copy the “Consumer Key” into the target organizations MapQuest API Key field under the organization’s settings page or directly within the DB.

+
+
+

Run Django Migrations

+

Change back to the root of the repository. Now run the migration script to set +up the database tables

+
export DJANGO_SETTINGS_MODULE=config.settings.dev
+./manage.py migrate
+
+
+
+
+

Django Admin User

+

You need a Django admin (super) user.

+
./manage.py create_default_user --username=admin@my.org --organization=seedorg --password=badpass
+
+
+

Of course, you need to save this user/password somewhere, since this is what +you will use to login to the SEED website.

+

If you want to do any API testing (and of course you do!), you will need to +add an API KEY for this user. You can do this in postgresql directly:

+
psql seeddb seeduser
+seeddb=> update landing_seeduser set api_key='DEADBEEF' where id=1;
+
+
+

The ‘secret’ key DEADBEEF is hard-coded into the test scripts.

+
+
+

Install Redis

+

You need to manually install Redis for Celery to work.

+

MacPorts:

+
sudo port install redis
+
+
+

Homebrew:

+
brew install redis
+# follow the post install instructions to add to launchagents or
+# call manually with `redis-server`
+
+
+
+
+

Install JavaScript Dependencies

+

The JS dependencies are installed using node.js package management (npm).

+
npm install
+
+
+
+
+

Start the Server

+

You should put the following statement in ~/.bashrc or add it to the +virtualenv post-activation script (e.g., in +~/.virtualenvs/seed/bin/postactivate).

+
export DJANGO_SETTINGS_MODULE=config.settings.dev
+
+
+

The combination of Redis, Celery, and Django have been encapsulated in a +single shell script, which examines existing processes and does not start +duplicate instances:

+
./bin/start-seed.sh
+
+
+

When this script is done, the Django stand-alone server will be running in +the foreground.

+
+
+

Login

+

Open your browser and navigate to http://127.0.0.1:8000

+

Login with the user/password you created before, e.g., admin@my.org and +badpass.

+
+

Note

+

these steps have been combined into a script called start-seed.sh. +The script will also not start Celery or Redis if they already seem +to be running.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/2.22.0/translation.html b/docs/code_documentation/2.22.0/translation.html new file mode 100644 index 00000000..f363549a --- /dev/null +++ b/docs/code_documentation/2.22.0/translation.html @@ -0,0 +1,218 @@ + + + + + + + Translating SEED — SEED Platform 2.22.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Translating SEED

+
    +
  1. Update translations on lokalise.

  2. +
  3. Copy lokalise.yml.example to lokalise.yml. Update API token.

  4. +
  5. Install lokalise locally

    +
    brew tap lokalise/cli-2
    +brew install lokalise2
    +
    +
    +
  6. +
+
    +
  1. Run scripts if you have Lokalise CLI installed. If not, see scripts for manual steps.

    +
    script/get_python_translations.sh
    +script/get_angular_translations.sh
    +
    +
    +
  2. +
  3. Uncomment the useMissingTranslationHandlerLog line seed.js to log untranslated strings to the console for review

  4. +
  5. Verify and commit changes

  6. +
+

Note: The lokalize website is the canonical source of data. If you +change the locale files locally, then you need to push them to +lokalize.

+

TL;DR

+

SEED is localized for more than just English, so a little more care is +needed as we add new UI. All translatable strings are held in either +per-language .json files (for Angular-controlled strings, which are +the majority), or .mo files (for strings supplied by Django).

+

At render time, SEED will sniff out the browser’s Accept: header. +Based on that, we choose the right file. The language files themselves +are key->value mappings from a translation “key” to a translated value. +Either Angular or Django will then swap that value into the DOM wherever +it sees the key. If no translation is available, the key remains in the +DOM. (There are some wrinkles with HTML styling and pluralization that +we’ll review below).

+

So, the basic flow on top of any new UI features is now:

+
    +
  1. Tag any user-visible strings in the UI as “translatable.” There are +currently 12 (!) ways in which to do this; see below.

  2. +
  3. Create the translation key at lokalise. We’re using lokalise +because it can smooth over differences in the file formats that +Angular and Django require, and is a nice tool for managing the +process of getting translations done by a native speaker: we can put +up screenshots to clarify how the translated phrase is used, track +translation progress, etc.

  4. +
  5. Get a translation done. As a placeholder, lokalise can provide an +auto-filled translation from Google Translate or a few other +services, but it’s fairly straightforward to order a professional +translation through lokalise.

  6. +
  7. Pull new translation files into the right places in the source tree +and commit them. There are scripts under /scripts to make this +mostly automatic.

  8. +
  9. Visually check that the containing UI looks OK with the translated +string(s). Some languages (e.g., French, German) can be wordy relative +to English and cause UI elements like buttons to expand oddly. Adjust +the layout or adjust the translation as needed.

  10. +
+
+

General philosophies / style

+
+

Don’t go crazy with indirection and interpolation

+

It’s probably better to err on the side of too many keys than to get +clever with interpolation or Angular expressions to avoid +near-duplicates of keys. The aim should be that there is at least one +place where a competent translator can see the whole string at once.

+

Compare:

+
<h2>{$:: inventory_type == 'taxlots' ?
+      translations['INCLUDE_SHARED_TAXLOTS'] :
+      translations['INCLUDE_SHARED']
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/.buildinfo b/docs/code_documentation/3.0.0-beta.0/.buildinfo new file mode 100644 index 00000000..5d8f2ebc --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: b6fe0beb7d79d3eb95508e5bc32819ed +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/api.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/api.doctree new file mode 100644 index 00000000..572883d8 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/api.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/aws.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/aws.doctree new file mode 100644 index 00000000..df526559 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/aws.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/data_model.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/data_model.doctree new file mode 100644 index 00000000..bf35dcf4 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/data_model.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/data_quality.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/data_quality.doctree new file mode 100644 index 00000000..19e84b77 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/data_quality.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/deployment.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/deployment.doctree new file mode 100644 index 00000000..1022e318 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/deployment.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/developer_resources.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/developer_resources.doctree new file mode 100644 index 00000000..cf98e977 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/developer_resources.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/docker.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/docker.doctree new file mode 100644 index 00000000..0bdbc528 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/docker.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/environment.pickle b/docs/code_documentation/3.0.0-beta.0/.doctrees/environment.pickle new file mode 100644 index 00000000..4468e549 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/environment.pickle differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/faq.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/faq.doctree new file mode 100644 index 00000000..7f064dd8 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/faq.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/getting_started.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/getting_started.doctree new file mode 100644 index 00000000..1da9e919 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/getting_started.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/help.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/help.doctree new file mode 100644 index 00000000..ad88a505 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/help.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/index.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/index.doctree new file mode 100644 index 00000000..f2608346 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/index.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/kubernetes_deployment.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/kubernetes_deployment.doctree new file mode 100644 index 00000000..df2c5c02 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/kubernetes_deployment.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/license.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/license.doctree new file mode 100644 index 00000000..4d3a65b9 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/license.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/linux.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/linux.doctree new file mode 100644 index 00000000..fe7d8058 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/linux.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/mapping.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/mapping.doctree new file mode 100644 index 00000000..b224d875 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/mapping.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/matching.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/matching.doctree new file mode 100644 index 00000000..7d078ee3 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/matching.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/migrations.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/migrations.doctree new file mode 100644 index 00000000..95e7fa15 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/migrations.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules.doctree new file mode 100644 index 00000000..d41b263e Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/config.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/config.doctree new file mode 100644 index 00000000..8993b747 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/config.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.cleansing.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.cleansing.doctree new file mode 100644 index 00000000..6d146c2c Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.cleansing.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.data.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.data.doctree new file mode 100644 index 00000000..a39e4aab Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.data.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.data_importer.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.data_importer.doctree new file mode 100644 index 00000000..14c92983 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.data_importer.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.doctree new file mode 100644 index 00000000..6fd2ce84 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.features.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.features.doctree new file mode 100644 index 00000000..48e0fb6c Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.features.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.landing.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.landing.doctree new file mode 100644 index 00000000..6296c553 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.landing.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.landing.management.commands.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.landing.management.commands.doctree new file mode 100644 index 00000000..fceaf89c Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.landing.management.commands.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.landing.management.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.landing.management.doctree new file mode 100644 index 00000000..9036aa6a Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.landing.management.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.lib.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.lib.doctree new file mode 100644 index 00000000..d8f0ab5d Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.lib.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.lib.mappings.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.lib.mappings.doctree new file mode 100644 index 00000000..23770ef3 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.lib.mappings.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.lib.merging.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.lib.merging.doctree new file mode 100644 index 00000000..b0aa834b Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.lib.merging.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.management.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.management.doctree new file mode 100644 index 00000000..b0cd06a6 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.management.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.managers.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.managers.doctree new file mode 100644 index 00000000..02c82493 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.managers.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.managers.tests.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.managers.tests.doctree new file mode 100644 index 00000000..387f3d6d Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.managers.tests.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.mappings.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.mappings.doctree new file mode 100644 index 00000000..fc03c342 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.mappings.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.models.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.models.doctree new file mode 100644 index 00000000..7e33f6f5 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.models.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.public.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.public.doctree new file mode 100644 index 00000000..4b72a5dc Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.public.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.serializers.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.serializers.doctree new file mode 100644 index 00000000..820cb828 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.serializers.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.templatetags.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.templatetags.doctree new file mode 100644 index 00000000..b131b844 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.templatetags.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.test_helpers.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.test_helpers.doctree new file mode 100644 index 00000000..dbf7d6ad Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.test_helpers.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.test_helpers.factory.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.test_helpers.factory.doctree new file mode 100644 index 00000000..be581475 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.test_helpers.factory.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.test_helpers.factory.lib.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.test_helpers.factory.lib.doctree new file mode 100644 index 00000000..53e13ff9 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.test_helpers.factory.lib.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.tests.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.tests.doctree new file mode 100644 index 00000000..fc322fad Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.tests.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.tests.functional.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.tests.functional.doctree new file mode 100644 index 00000000..8728c0e9 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.tests.functional.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.urls.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.urls.doctree new file mode 100644 index 00000000..d75717df Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.urls.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.utils.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.utils.doctree new file mode 100644 index 00000000..5dae040e Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.utils.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.views.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.views.doctree new file mode 100644 index 00000000..b2882a32 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/modules/seed.views.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/setup_docker.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/setup_docker.doctree new file mode 100644 index 00000000..4935b5d9 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/setup_docker.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/setup_osx.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/setup_osx.doctree new file mode 100644 index 00000000..54f00403 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/setup_osx.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/.doctrees/translation.doctree b/docs/code_documentation/3.0.0-beta.0/.doctrees/translation.doctree new file mode 100644 index 00000000..8b7c03ad Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/.doctrees/translation.doctree differ diff --git a/docs/code_documentation/3.0.0-beta.0/_images/case-a.png b/docs/code_documentation/3.0.0-beta.0/_images/case-a.png new file mode 100644 index 00000000..e9a0f9f3 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_images/case-a.png differ diff --git a/docs/code_documentation/3.0.0-beta.0/_images/case-b.png b/docs/code_documentation/3.0.0-beta.0/_images/case-b.png new file mode 100644 index 00000000..75f236cb Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_images/case-b.png differ diff --git a/docs/code_documentation/3.0.0-beta.0/_images/case-c.png b/docs/code_documentation/3.0.0-beta.0/_images/case-c.png new file mode 100644 index 00000000..adb4a776 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_images/case-c.png differ diff --git a/docs/code_documentation/3.0.0-beta.0/_images/case-d.png b/docs/code_documentation/3.0.0-beta.0/_images/case-d.png new file mode 100644 index 00000000..c9c58726 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_images/case-d.png differ diff --git a/docs/code_documentation/3.0.0-beta.0/_images/data-model.png b/docs/code_documentation/3.0.0-beta.0/_images/data-model.png new file mode 100644 index 00000000..c4151cfe Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_images/data-model.png differ diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/api.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/api.rst.txt new file mode 100644 index 00000000..5cfde4e2 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/api.rst.txt @@ -0,0 +1,68 @@ +API +=== + +Authentication +-------------- +Authentication is handled via an encoded authorization token set in a HTTP header. +To request an API token, go to ``/app/#/profile/developer`` and click 'Get a New API Key'. + +Authenticate every API request with your username (email, all lowercase) and the API key via `Basic Auth`_. +The header is sent in the form of ``Authorization: Basic ``, where credentials is the base64 encoding of the email and key joined by a single colon ``:``. + +.. _Basic Auth: https://en.wikipedia.org/wiki/Basic_access_authentication + +Using Python, use the requests library:: + + import requests + + result = requests.get('https://seed-platform.org/api/version/', auth=(user_email, api_key)) + print result.json() + +Using curl, pass the username and API key as follows:: + + curl -u user_email:api_key http://seed-platform.org/api/version/ + +If authentication fails, the response's status code will be 302, redirecting the user to ``/app/login``. + +Payloads +-------- + +Many requests require a JSON-encoded payload and parameters in the query string of the url. A frequent +requirement is including the organization_id of the org you belong to. For example:: + + curl -u user_email:api_key https://seed-platform.org/api/v2/organizations/12/ + +Or in a JSON payload:: + + curl -u user_email:api_key \ + -d '{"organization_id":6, "role": "viewer"}' \ + https://seed-platform.org/api/v2/users/12/update_role/ + +Using Python:: + + params = {'organization_id': 6, 'role': 'viewer'} + result = requests.post('https://seed-platform.org/api/v2/users/12/update_role/', + data=json.dumps(params), + auth=(user_email, api_key)) + print result.json() + +Responses +--------- + +Responses from all requests will be JSON-encoded objects, as specified in each endpoint's documentation. +In the case of an error, most endpoints will return this instead of the expected payload (or an HTTP status code):: + + { + "status": "error", + "message": "explanation of the error here" + } + +API Endpoints +------------- + +A list of interactive endpoints are available by accessing the API menu item on the left navigation +pane within you account on your SEED instance. + +To view a list of non-interactive endpoints without an account, view swagger_ on the development server. + +.. _swagger: https://seed-platform.org/api/swagger/ diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/aws.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/aws.rst.txt new file mode 100644 index 00000000..eccace1f --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/aws.rst.txt @@ -0,0 +1,183 @@ +========= +AWS Setup +========= + +Amazon Web Services (`AWS`_) provides the preferred hosting for the SEED Platform. + +**seed** is a `Django Project`_ and Django's documentation is an excellent place for general +understanding of this project's layout. + +.. _Django Project: https://www.djangoproject.com/ + +.. _AWS: http://aws.amazon.com/ + +Prerequisites +^^^^^^^^^^^^^ + +Ubuntu server 18.04 LTS + +.. note:: These instructions have not been updated for Ubuntu 18.04. It is recommended to use Docker-based deployments. + +.. code-block:: console + + sudo apt-get update + sudo apt-get upgrade + sudo apt-get install -y libpq-dev python-dev python-pip libatlas-base-dev \ + gfortran build-essential g++ npm libxml2-dev libxslt1-dev git mercurial \ + libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python + + +PostgreSQL and Redis are not included in the above commands. For a quick installation on AWS it +is okay to install PostgreSQL and Redis locally on the AWS instance. If a more permanent and +scalable solution, it is recommended to use AWS's hosted Redis (ElastiCache) and PostgreSQL service. + +.. note:: postgresql ``>=9.4`` is required to support `JSON Type`_ + +.. code-block:: console + + # To install PostgreSQL and Redis locally + sudo apt-get install redis-server + sudo apt-get install postgresql postgresql-contrib + +.. _`JSON Type`: https://www.postgresql.org/docs/9.4/datatype-json.html + +Amazon Web Services (AWS) Dependencies +++++++++++++++++++++++++++++++++++++++ + +The following AWS services can be used for **SEED** but are not required: + +* RDS (PostgreSQL >=9.4) +* ElastiCache (redis) +* SES + + +Python Dependencies +^^^^^^^^^^^^^^^^^^^ + +Clone the **SEED** repository from **github** + +.. code-block:: console + + $ git clone git@github.com:SEED-platform/seed.git + +enter the repo and install the python dependencies from `requirements`_ + +.. _requirements: https://github.com/SEED-platform/seed/blob/main/requirements/aws.txt + +.. code-block:: console + + $ cd seed + $ sudo pip install -r requirements/aws.txt + + +JavaScript Dependencies +^^^^^^^^^^^^^^^^^^^^^^^ + +``npm`` is required to install the JS dependencies. + +.. code-block:: console + + $ sudo apt-get install build-essential + $ sudo apt-get install curl + + +.. code-block:: console + + $ npm install + + +Database Configuration +^^^^^^^^^^^^^^^^^^^^^^ + +Copy the ``local_untracked.py.dist`` file in the ``config/settings`` directory to +``config/settings/local_untracked.py``, and add a ``DATABASES`` configuration with your database username, +password, host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database +instance you have manually installed within your infrastructure. + +.. code-block:: python + + # Database + DATABASES = { + 'default': { + 'ENGINE':'django.db.backends.postgresql_psycopg2', + 'NAME': 'seed', + 'USER': '', + 'PASSWORD': '', + 'HOST': '', + 'PORT': '', + } + } + + +.. note:: + + In the above database configuration, ``seed`` is the database name, this + is arbitrary and any valid name can be used as long as the database exists. + +create the database within the postgres ``psql`` shell: + +.. code-block:: psql + + CREATE DATABASE seed; + +or from the command line: + +.. code-block:: console + + createdb seed + + +create the database tables and migrations: + +.. code-block:: console + + python manage.py syncdb + python manage.py migrate + + +create a superuser to access the system + +.. code-block:: console + + $ python manage.py create_default_user --username=demo@example.com --organization=example --password=demo123 + + +.. note:: + + Every user must be tied to an organization, visit ``/app/#/profile/admin`` + as the superuser to create parent organizations and add users to them. + +Cache and Message Broker +^^^^^^^^^^^^^^^^^^^^^^^^ + +The SEED project relies on `redis`_ for both cache and message brokering, and +is available as an AWS `ElastiCache`_ service. +``local_untracked.py`` should be updated with the ``CACHES`` and ``CELERY_BROKER_URL`` +settings. + +.. _ElastiCache: https://aws.amazon.com/elasticache/ + +.. _redis: http://redis.io/ + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://seed-core-cache.ntmprk.0001.usw2.cache.amazonaws.com:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + +Running Celery the Background Task Worker +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +`Celery`_ is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, ``celery`` +can be started: + +.. code-block:: console + + celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler + +.. _Celery: http://www.celeryproject.org/ diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/data_model.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/data_model.rst.txt new file mode 100644 index 00000000..c7e2ea1f --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/data_model.rst.txt @@ -0,0 +1,415 @@ +Data Model +========== + +.. image:: images/case-a.png + +.. image:: images/case-b.png + +.. image:: images/case-c.png + +.. image:: images/case-d.png + +.. image:: images/data-model.png + + +.. todo:: Documentation below is out of state and needs updated. + +Our primary data model is based on a tree structure with BuildingSnapshot +instances as nodes of the tree and the tip of the tree referenced by a +CanonicalBuilding. + +Take the following example: a user has loaded a CSV file containing information +about one building and created the first BuildingSnapshot (BS0). At this point +in time, BS0 is linked to the first CanonicalBuilding (CB0), and CB0 is also +linked to BS0. + +.. code-block:: shell + + BS0 <-- CB0 + BS0 --> CB0 + +These relations are represented in the database as foreign keys from the +BuildingSnapshot table to the CanonicalBuilding table, and from the +CanonicalBuilding table to the BuildingSnapshot table. + +The tree structure comes to fruition when a building, BS0 in our case, is +matched with a new building, say BS1, enters the system and is auto-matched. + +Here BS1 entered the system and was matched with BS0. When a match occurs, +a new BuildingSnapshot is created, BS2, with the fields from the existing +BuildingSnapshot, BS0, and the new BuildingSnapshot, BS1, merged +together. If both the existing and new BuildingSnapshot have data for a +given field, the new record's fields are preferred and merged into the child, B3. + +The fields from new snapshot are preferred because that is the newer of the +two records from the perspective of the system. By preferring the most recent fields +this allows for evolving building snapshots over time. For example, if an existing +canonical record has a Site EUI value of 75 and some changes happen to a building +that cause this to change to 80 the user can submit a new record with that change. + +All BuildingSnapshot instances point to a CanonicalBuilding. + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 <-- CB0 + + BS0 --> CB0 + BS1 --> CB0 + BS2 --> CB0 + + +parents and children +^^^^^^^^^^^^^^^^^^^^ + +BuildingSnapshots also have linkage to other BuildingSnapshots in order to +keep track of their *parents* and *children*. This is represented in the +Django model as a many-to-many relation from BuildingSnapshot to BuildingSnapshot. +It is represented in the PostgreSQL database as an additional seed_buildingsnapshot_children +table. + + +In our case here, BS0 and BS1 would both have *children* BS2, and BS2 would +have *parents* BS0 and BS1. + +.. note:: + + throughout most of the application, the ``search_buildings`` endpoint + is used to search or list active building. This is to say, buildings that + are pointed to by an active CanonicalBuilding. + The ``search_mapping_results`` endpoint allows the search of buildings + regardless of whether the BuildingSnapshot is pointed to by an active + CanonicalBuilding or not and this search is needed during the mapping + preview and matching sections of the application. + + + +For illustration purposes let's suppose BS2 and a new building BS3 match to form a child BS4. + ++--------+-------+ +| parent | child | ++========+=======+ +| BS0 | BS2 | ++--------+-------+ +| BS1 | BS2 | ++--------+-------+ +| BS2 | BS4 | ++--------+-------+ +| BS3 | BS4 | ++--------+-------+ + + +And the corresponding tree would look like: + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 BS3 + \ / + BS4 <-- CB0 + + BS0 --> CB0 + BS1 --> CB0 + BS2 --> CB0 + BS3 --> CB0 + BS4 --> CB0 + +matching +-------- + +During the auto-matching process, if a *raw* BuildingSnapshot matches an +existing BuildingSnapshot instance, then it will point to the existing +BuildingSnapshot instance's CanonicalBuilding. In the case where there is no +existing BuildingSnapshot to match, a new CanonicalBuilding will be created, as +happened to B0 and C0 above. + ++-------+--------+--------+-------------+ +| field | BS0 | BS1 | BS2 (child) | ++=======+========+========+=============+ +| id1 | **11** | 11 | 11 | ++-------+--------+--------+-------------+ +| id2 | | **12** | 12 | ++-------+--------+--------+-------------+ +| id3 | **13** | | 13 | ++-------+--------+--------+-------------+ +| id4 | 14 | **15** | 15 | ++-------+--------+--------+-------------+ + + +manual-matching vs auto-matching +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Since BuildingSnapshots can be manually matched, there is the possibility for +two BuildingSnapshots each with an active CanonicalBuilding to match and the +system has to choose to move only one CanonicalBuilding to the tip of the tree +for the primary BuildingSnapshot and *deactivate* the secondary +BuildingSnapshot's CanonicalBuilding. + +Take for example: + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 BS3 + \ / + BS4 <-- CB0 (active: True) BS5 <-- CB1 (active: True) + +If a user decides to manually match BS4 and BS5, the system will take the +primary BuildingSnapshot's CanonicalBuilding and have it point to their +child and deactivate CB1. The deactivation is handled by setting a field +on the CanonicalBuilding instance, *active*, from ``True`` to ``False``. + +Here is what the tree would look like after the manual match of **BS4** and +**BS5**: + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 BS3 + \ / + BS4 BS5 <-- CB1 (active: False) + \ / + BS6 <-- CB0 (active: True) + +Even though BS5 is pointed to by a CanonicalBuilding, CB1, BS5 will not be +returned by the normal ``search_buildings`` endpoint because the +CanonicalBuilding pointing to it has its field ``active`` set to ``False``. + +.. note:: + anytime a match is **unmatched** the system will create a new + CanonicalBuilding or set an existing CanonicalBuilding's active field to + ``True`` for any leaf BuildingSnapshot trees. + +what really happens to the BuildingSnapshot table on import (and when) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The above is conceptually what happens but sometimes the devil is in the details. +Here is what happens to the BuildingSnapshot table in the database when records +are imported. + +Every time a record is added at least two BuildingSnapshot records are created. + +Consider the following simple record: + ++-------------+-------------+---------------------+-----------+--------------+ +| Property Id | Year Ending | Property Floor Area | Address 1 | Release Date | ++=============+=============+=====================+===========+==============+ +| 499045 | 2000 | 1234 | 1 fake st | 12/12/2000 | ++-------------+-------------+---------------------+-----------+--------------+ + +The first thing the user is upload the file. When the user sees the +"Successful Upload!" dialog one record has been added to the +BuildingSnapshot table. + +This new record has an id (73700 in this case) and a created and +modified timestamp. Then there are a lot of empty fields and a +source_type of 0. Then there is the extra_data column which contains +the contents of the record in key-value form: + +:Address 1: "1 fake st" +:Property Id: "499045" +:Year Ending: "2000" +:Release Date: "12/12/2000" +:Property Floor Area: "1234" + +And a corresponding extra_data_sources that looks like + +:Address 1: 73700 +:Property Id: 73700 +:Year Ending: 73700 +:Release Date: 73700 +:Property Floor Area: 73700 + + +All of the fields that look like _source_id are also populated +with 73700 E.G. owner_postal_code_source_id. + +The other fields of interest are the organization field which +is populated with the user's default organization and the import_file_id +field which is populated with a reference to a data_importer_importfile record. + +At this point the record has been created before the user hits the +"Continue to data mapping" button. + +The second record (id = 73701) is created by the time the user gets to the screen +with the "Save Mappings" button. This second record has the following fields populated: + +- id +- created +- modified +- pm_property_id +- year_ending +- gross_floor_area +- address_line_1 +- release_date +- source_type (this is 2 instead of 0 as with the other record) +- import_file_id +- organization_id. + +That is all. All other fields are empty. In this case that is all that happens. + +Now consider the same user uploading a new file from the next year that looks like + ++-------------+-------------+---------------------+-----------+--------------+ +| Property Id | Year Ending | Property Floor Area | Address 1 | Release Date | ++=============+=============+=====================+===========+==============+ +| 499045 | 2000 | 1234 | 1 fake st | 12/12/2001 | ++-------------+-------------+---------------------+-----------+--------------+ + +As before one new record is created on upload. This has id 73702 and follows the same +pattern as 73700. And similarly 73703 is created like 73701 before the "Save Mappings" +button appears. + +However this time the system was able to make a match with an existing record. +After the user clicks the "Confirm mappings & start matching" button a new record +is created with ID 73704. + +73704 is identical to 73703 (in terms of contents of the BuildingSnapshot table only) +with the following exceptions: + +- created and modified timestamps are different +- match type is populated and has a value of 1 +- confidence is populated and has a value of .9 +- source_type is 4 instead of 2 +- canonical_building_id is populated with a value +- import_file_id is NULL +- last_modified_by_id is populated with value 2 (This is a key into the landing_seeduser table) +- address_line_1_source_id is 73701 +- gross_floor_area_source_id is populated with value 73701 +- pm_property_id_source_id is populated with 73701 +- release_date_source_id is populated with 73701 +- year_ending_source_id is populated with 73701 + +what really happens to the CanonicalBuilding table on import (and when) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In addition to the BuildingSnapshot table the CanonicalBuilding table is also updated +during the import process. To summarize the above 5 records were created in the +BuildingSnapshot table: + +1. 73700 is created from the raw 2000 data +2. 73701 is the mapped 2000 data, +3. 73702 is created from the raw 2001 data +4. 73703 is the mapped 2001 data +5. 73704 is the result of merging the 2000 and 2001 data. + +In this process CanonicalBuilding is updated twice. First when the 2000 record is imported the +CanonicalBuilding gets populated with one new row at the end of the matching step. +I.E. when the user sees the "Load More Data" screen. At this point there is a new row that looks like + ++--------+--------+-----------------------+ +| id | active | canonical_building_id | ++========+========+=======================+ +| 20505 | TRUE | 73701 | ++--------+--------+-----------------------+ + +At this point there is one new canonical building and that is the BuildingSnapshot with +id 73701. Next the user uploads the 2001 data. When the "Matching Results" screen +appears the CanonicalBuilding table has been updated. Now it looks like + ++--------+--------+-----------------------+ +| id | active | canonical_building_id | ++========+========+=======================+ +| 20505 | TRUE | 73704 | ++--------+--------+-----------------------+ + +There is still only one canonical building but now it is the BuildingSnapshot record +that is the result of merging the 2000 and 2001 data: id = 73704. + +organization +^^^^^^^^^^^^ + +BuildingSnapshots belong to an Organization field that is a foreign key into the organization +model (orgs_organization in Postgres). + +Many endpoints filter the buildings based on the organizations the requesting user +belongs to. E.G. get_buildings changes which fields are returned based on the +requesting user's membership in the BuildingSnapshot's organization. + +\*_source_id fields +^^^^^^^^^^^^^^^^^^^ + +Any field in the BuildingSnapshot table that is populated with data from a +submitted record will have a corresponding _source_id field. E.G +pm_property_id has pm_property_id_source_id, +address_line_1 has address_line_1_source_id, +etc... + +These are foreign keys into the BuildingSnapshot that is the source of that +value. To extend the above table + ++-------+--------+--------+-------------+------------------------+ +| field | BS0 | BS1 | BS2 (child) | BS2 (child) _source_id | ++=======+========+========+=============+========================+ +| id1 | **11** | | 11 | BS0 | ++-------+--------+--------+-------------+------------------------+ +| id2 | | **12** | 12 | BS1 | ++-------+--------+--------+-------------+------------------------+ + +**NOTE:** The BuildingSnapshot records made from the raw input file have all the +_source_id fields populated with that record's ID. The non-canonical BuildingSnapshot +records created from the mapped data have none set. The canonical BuildingSnapshot +records that are the result of merging two records have only the _source_id fields +set where the record itself has data. E.G. in the above address_line_1 is set to +"1 fake st." so there is a value in the canonical BuildingSnapshot's address_line_1_source_id +field. However there is no block number so block_number_source_id is empty. This +is unlike the two raw BuildingSnapshot records who also have no block_number but +nevertheless have a block_number_source_id populated. + +extra_data +^^^^^^^^^^ + +The BuildingSnapshot model has many "named" fields. Fields like "address_line_1", +"year_built", and "pm_property_id". However the users are allowed to submit files +with arbitrary fields. Some of those arbitrary fields can be mapped to "named" +fields. E.G. "Street Address" can usually be mapped to "Address Line 1". +For all the fields that cannot be mapped like that there is the extra_data field. + +extra_data is Django json field that serves as key-value storage for other +user-submitted fields. As with the other "named" fields there is a corresponding +extra_data_sources field that serves the same role as the other _source_id fields. +E.G. If a BuildingSnapshot has an extra_data field that looks like + +:an_unknown_field: 1 +:something_else: 2 + +It should have an extra_data_sources field that looks like + +:an_unknown_field: some_BuildingSnapshot_id +:something_else: another_BuildingSnapshot_id + +saving and possible data loss +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When saving a Property file some fields that are truncated if too long. +The following are truncated to 255 characters + +- jurisdiction_tax_lot_id +- pm_property_id +- custom_id_1 +- ubid +- lot_number +- block_number +- district +- owner +- owner_email +- owner_telephone +- owner_address +- owner_city_state +- owner_postal_code + +And the following are truncated to 255: + +- property_name +- address_line_1 +- address_line_2 +- city +- postal_code +- state_province +- building_certification + +No truncation happens to any of the fields stored in extra_data. diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/data_quality.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/data_quality.rst.txt new file mode 100644 index 00000000..49e06799 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/data_quality.rst.txt @@ -0,0 +1,9 @@ +Data Quality +============ + +Data quality checks are run after the data are paired, during import of Properties/TaxLots, or on-demand by selecting rows in the inventory +page and clicking the action button. This checks whether any default or user-defined Rules are broken or satisfied by Property/TaxLot records. + +Notably, in most cases when data quality checks are run, Labels can be applied for any broken Rules that have a Label. +To elaborate, Rules can have an attached Label. When a data quality check is run, records that break one of these "Labeled Rules" +are then given that Label. The case where this Label attachment does not happen is during import due to performance reasons. diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/deployment.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/deployment.rst.txt new file mode 100644 index 00000000..e2e3d347 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/deployment.rst.txt @@ -0,0 +1,57 @@ +Deployment Guide +================ + +SEED is intended to be installed on Linux instances in the cloud (e.g., AWS), and on local hardware. SEED Platform does not officially support Windows for production deployment. If this is desired, see the Django `notes`_. + +.. _notes: https://docs.djangoproject.com/en/1.7/howto/windows/ + +.. toctree:: + :maxdepth: 2 + + aws + linux + docker + kubernetes_deployment + +Migrations +---------- + +Migrations are handles through Django; however, various versions have customs actions for the migrations. See the :doc:`migrations page ` for more information. + + +Monitoring +---------- + +Sentry +^^^^^^ + +Sentry can monitor your webservers for any issues. To enable sentry add the following to +your local_untracked.py files after setting up your Sentry account on sentry.io. + +The RAVEN_CONFIG is used for the backend and the SENTRY_JS_DSN is used for the frontend. At the moment, +it is recommended to setup two sentry projects, one for backend and one for frontend. + +.. code-block:: python + + import sentry_sdk + from sentry_sdk.integrations.django import DjangoIntegration + from sentry_sdk.integrations.celery import CeleryIntegration + + sentry_sdk.init( + dsn="https://@.ingest.sentry.io/", + integrations=[ + DjangoIntegration(), + CeleryIntegration(), + ], + + # Set traces_sample_rate to 1.0 to capture 100% + # of transactions for performance monitoring. + # We recommend adjusting this value in production. + traces_sample_rate=1.0, + + # If you wish to associate users to errors (assuming you are using + # django.contrib.auth) you may enable sending PII data. + send_default_pii=True + ) + + SENTRY_JS_DSN = 'https://@sentry.io/' diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/developer_resources.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/developer_resources.rst.txt new file mode 100644 index 00000000..62b565ad --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/developer_resources.rst.txt @@ -0,0 +1,450 @@ +Developer Resources +=================== + +.. toctree:: + migrations + translation + +General Notes +------------- + +Pre-commit +^^^^^^^^^^ +We use precommit commits for formatting. Set it up locally with + +.. code-block:: bash + + pre-commit install + +Ruff Settings +^^^^^^^^^^^^^^ + +Ruff is used to statically verify code syntax. To run ruff locally call: + +.. code-block:: bash + + tox -e precommit -- ruff + tox -e precommit -- ruff-format + +Python Type Hints +^^^^^^^^^^^^^^^^^ + +Python type hints are beginning to be added to the SEED codebase. The benefits are +eliminating some accidental typing mistakes to prevent bugs as well as a better IDE +experience. + +Usage +***** + +SEED does not require exhaustive type annotations, but it is recommended you add them if you +create any new functions or refactor any existing code where it might be beneficial (e.g. types +that appear ambiguous or that the IDE can't determine) and not require a ton of additional effort. + +When applicable, we recommend you use `built-in collection types `_ +such as :code:`list`, :code:`dict` or :code:`tuple` instead of the capitalized types +from the :code:`typing` module. You can also use ``TypedDict`` and ``NotRequired`` from the ``typing_extensions`` +package to specify the types of required/optional keys of dictionaries. + +Common gotchas: + +- If trying to annotate a class method with the class itself, import :code:`from __future__ import annotations` +- If you're getting warnings about runtime errors due to a type name, make sure your IDE is set up to point to an environment with python 3.9 +- If you're wasting time trying to please the type checker, feel free to throw :code:`# type: ignore` on the problematic line (or at the top of the file to ignore all issues for that file) + +Type Checking +************* + +CI currently runs static type checking on the codebase using `mypy `_. For +your own IDE, we recommend the following extensions: + +- VSCode: `Pylance `_ (uses Microsoft's Pyright type checking) + +To run the same typechecking applied in CI (i.e., using mypy) you can run the following + +.. code-block:: bash + + tox -e mypy + + +Django Notes +------------ + +Adding New Fields to Database +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Adding new fields to SEED can be complicated since SEED has a mix of typed fields (database fields) and extra data +fields. Follow the steps below to add new fields to the SEED database: + +#. Add the field to the PropertyState or the TaxLotState model. Adding fields to the Property or TaxLot models is more complicated and not documented yet. +#. Add field to list in the following locations: + +- models/columns.py: Column.DATABASE_COLUMNS +- TaxLotState.coparent or PropertyState.coparent: SQL query and keep_fields + +#. Run `./manage.py makemigrations` +#. Add in a Python script in the new migration to add in the new column into every organizations list of columns. Note that the new_db_fields will be the same as the data in the Column.DATABASE_COLUMNS that were added. + + .. code-block:: python + + def forwards(apps, schema_editor): + Column = apps.get_model("seed", "Column") + Organization = apps.get_model("orgs", "Organization") + + new_db_fields = [ + { + 'column_name': 'geocoding_confidence', + 'table_name': 'PropertyState', + 'display_name': 'Geocoding Confidence', + 'column_description': 'Geocoding Confidence', + 'data_type': 'number', + }, { + 'column_name': 'geocoding_confidence', + 'table_name': 'TaxLotState', + 'display_name': 'Geocoding Confidence', + 'column_description': 'Geocoding Confidence', + 'data_type': 'number', + } + ] + + # Go through all the organizations + for org in Organization.objects.all(): + for new_db_field in new_db_fields: + columns = Column.objects.filter( + organization_id=org.id, + table_name=new_db_field['table_name'], + column_name=new_db_field['column_name'], + is_extra_data=False, + ) + + if not columns.count(): + new_db_field['organization_id'] = org.id + Column.objects.create(**new_db_field) + elif columns.count() == 1: + # If the column exists, then update the display_name and data_type if empty + c = columns.first() + if c.display_name is None or c.display_name == '': + c.display_name = new_db_field['display_name'] + if c.data_type is None or c.data_type == '' or c.data_type == 'None': + c.data_type = new_db_field['data_type'] + for col in columns: + # If the column exists, then update the column_description if empty + if c.column_description is None or c.column_description == '': + c.column_description = new_db_field['column_description'] + c.save() + else: + print(" More than one column returned") + + + class Migration(migrations.Migration): + dependencies = [ + ('seed', '0090_auto_20180425_1154'), + ] + + operations = [ + ... existing db migrations ..., + migrations.RunPython(forwards), + ] + + +#. Run migrations `./manage.py migrate` +#. Run unit tests, fix failures. Below is a list of files that need to be fixed (this is not an exhaustive list) + +- test_mapping_data.py:test_keys +- test_columns.py:test_column_retrieve_schema +- test_columns.py:test_column_retrieve_db_fields + +#. (Optional) Update example files to include new fields +#. Test import workflow with mapping to new fields + + +NGINX Notes +----------- + +Toggle *maintenance mode* to display a maintenance page and prevent access to all site resources including API endpoints: + +.. code-block:: bash + + docker exec seed_web ./docker/maintenance.sh on + docker exec seed_web ./docker/maintenance.sh off + + +AngularJS Integration Notes +--------------------------- + +Template Tags +^^^^^^^^^^^^^ + +Angular and Django both use `{{` and `}}` as variable delimiters, and thus the AngularJS variable delimiters are +renamed `{$` and `$}`. + +.. code-block:: JavaScript + + window.BE.apps.seed = angular.module('BE.seed', ['$interpolateProvider', ($interpolateProvider) => { + $interpolateProvider.startSymbol('{$'); + $interpolateProvider.endSymbol('$}'); + }]); + +Django CSRF Token and AJAX Requests +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For ease of making angular `$http` requests, we automatically add the CSRF token to all `$http` requests as +recommended by http://django-angular.readthedocs.io/en/latest/integration.html#xmlhttprequest + +.. code-block:: JavaScript + + window.BE.apps.seed.run(($http, $cookies) => { + $http.defaults.headers.common['X-CSRFToken'] = $cookies['csrftoken']; + }); + + +Routes and Partials or Views +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Routes in `static/seed/js/seed.js` (the normal angularjs `app.js`) + + +.. code-block:: JavaScript + + SEED_app.config(['stateHelperProvider', '$urlRouterProvider', '$locationProvider', (stateHelperProvider, $urlRouterProvider, $locationProvider) => { + stateHelperProvider + .state({ + name: 'home', + url: '/', + templateUrl: static_url + 'seed/partials/home.html' + }) + .state({ + name: 'profile', + url: '/profile', + templateUrl: static_url + 'seed/partials/profile.html', + controller: 'profile_controller', + resolve: { + auth_payload: ['auth_service', '$q', 'user_service', function (auth_service, $q, user_service) { + var organization_id = user_service.get_organization().id; + return auth_service.is_authorized(organization_id, ['requires_superuser']); + }], + user_profile_payload: ['user_service', function (user_service) { + return user_service.get_user_profile(); + }] + } + }); + }]); + +HTML partials in `static/seed/partials/` + +Logging +------- + +Information about error logging can be found here - https://docs.djangoproject.com/en/1.7/topics/logging/ + +Below is a standard set of error messages from Django. + +A logger is configured to have a log level. This log level describes the severity of +the messages that the logger will handle. Python defines the following log levels: + +.. code-block:: bash + + DEBUG: Low level system information for debugging purposes + INFO: General system information + WARNING: Information describing a minor problem that has occurred. + ERROR: Information describing a major problem that has occurred. + CRITICAL: Information describing a critical problem that has occurred. + +Each message that is written to the logger is a Log Record. The log record is stored +in the web server & Celery + + +BEDES Compliance and Managing Columns +------------------------------------- + +Columns that do not represent hardcoded fields in the application are represented using +a Django database model defined in the seed.models module. The goal of adding new columns +to the database is to create seed.models.Column records in the database for each column to +import. Currently, the list of Columns is dynamically populated by importing data. + +There are default mappings for ESPM are located here: + + https://github.com/SEED-platform/seed/blob/develop/seed/lib/mappings/data/pm-mapping.json + + +Resetting the Database +---------------------- + +This is a brief description of how to drop and re-create the database +for the seed application. + +The first two commands below are commands distributed with the +Postgres database, and are not part of the SEED application. The third +command below will create the required database tables for SEED and +setup initial data that the application expects (e.g. initial columns for +BEDES). The last command below (spanning multiple lines) will create a +new superuser and organization that you can use to login to the +application, and from there create any other users or organizations +that you require. + +Below are the commands for resetting the database and creating a new +user: + +.. code-block:: bash + + createuser -U seed seeduser + + psql -d postgres -U seeduser -c 'DROP DATABASE seed;' + psql -d postgres -U seeduser -c 'CREATE DATABASE seed;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;' + + ./manage.py migrate + ./manage.py create_default_user \ + --username=demo@seed-platform.org \ + --password=password \ + --organization=testorg + +Restoring a Database Dump +------------------------- + +.. code-block:: bash + + psql -d postgres -U seeduser -c 'DROP DATABASE seed;' + psql -d postgres -U seeduser -c 'CREATE DATABASE seed;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;' + psql -d seed -U seeduser -c 'SELECT timescaledb_pre_restore();' + + # restore a previous database dump (must be pg_restore 12+) + pg_restore -d seed -U seeduser /backups/prod-backups/prod_20191203_000002.dump + # if any errors appear during the pg_restore process check that the `installed_version` of the timescaledb extension where the database was dumped matches the extension version where it's being restored + # `SELECT default_version, installed_version FROM pg_available_extensions WHERE name = 'timescaledb';` + + psql -d seed -U seeduser -c 'SELECT timescaledb_post_restore();' + + ./manage.py migrate + + # if needed add a user to the database + ./manage.py create_default_user \ + --username=demo@seed-platform.org \ + --password=password \ + --organization=testorg + +If restoring a production backup to a different deployment update the site settings for password reset emails, and disable celerybeat Salesforce updates/emails: + +.. code-block:: bash + + ./manage.py shell + + from django.contrib.sites.models import Site + site = Site.objects.first() + site.domain = 'dev1.seed-platform.org' + site.name = 'SEED Dev1' + site.save() + + from seed.models import Organization + Organization.objects.filter(salesforce_enabled=True).update(salesforce_enabled=False) + + from django_celery_beat.models import PeriodicTask, PeriodicTasks + PeriodicTask.objects.filter(enabled=True, name__startswith='salesforce_sync_org-').update(enabled=False) + PeriodicTasks.update_changed() + + +Migrating the Database +---------------------- + +Migrations are handles through Django; however, various versions have customs actions for the migrations. See the :doc:`migrations page ` for more information based on the version of SEED. + + +Testing +------- + +JS tests can be run with Jasmine at the url `/angular_js_tests/`. + +Python unit tests are run with + +.. code-block:: bash + + python manage.py test --settings=config.settings.test + +Note on geocode-related testing: + Most of these tests use VCR.py and cassettes to capture and reuse recordings of HTTP requests and responses. Given that, unless you want to make changes and/or refresh the cassettes/recordings, there isn't anything needed to run the geocode tests. + + In the case that the geocoding logic/code is changed or you'd like to the verify the MapQuest API is still working as expected, you'll need to run the tests with a small change. Namely, you'll want to provide the tests with an API key via an environment variable called "TESTING_MAPQUEST_API_KEY" or within your local_untracked.py file with that same variable name. + + In order to refresh the actual cassettes, you'll just need to delete or move the old ones which can be found at ".seed/tests/data/vcr_cassettes". The API key should be hidden within the cassettes, so these new cassettes can and should be pushed to GitHub. + +Run coverage using + +.. code-block:: bash + + coverage run manage.py test --settings=config.settings.test + coverage report --fail-under=83 + +Python compliance uses Ruff + +.. code-block:: bash + + tox -e precommit -- ruff + tox -e precommit -- ruff-format + +JavaScript compliance uses ESLint, SCSS compliance uses StyleLint, and HTML compliance uses Prettier + +.. code-block:: bash + + npm run lint + npm run lint:fix + +Building Documentation +---------------------- + +Older versions of the source code documentation are (still) on readthedocs; however, newer versions are built and pushed to the seed-website repository manually. To build the documentation follow the script below: + +.. code-block:: bash + + cd docs + rm -rf htmlout + sphinx-build -b html source htmlout + +For releasing, copy the ``htmlout`` directory into the seed-platform's website repository under ``docs/code_documentation/``. Make sure to add the new documentation to the table in the ``docs/developer_resources.md``. + +Contribution Instructions / Best Practices +------------------------------------------ + +If this is the first time contributing and you are outside of the DOE National Lab system, then you will need to review and fill out the contribution agreement which is found in `SEED's Contribution Agreement in the GitHub repository`_ + +The desired workflow for development and submitting changes is the following: + +#. Fork the repository on GitHub if you do not have access to the repository, otherwise, work within the https://github.com/seed-platform/seed repository. +#. Ensure there is a ticket/issue created for the work you are doing. Verify that the ticket is assigned to you and that it is part of the latest project board on the GitHub site (https://github.com/orgs/SEED-platform/projects). +#. Move the ticket/issue to 'In Progress' in the GitHub project tracker when you begin work +#. Create a branch off of develop (unless it is a hotfix, then branch of the appropriate tag). The recommended naming convention is -short-descriptive-name. +#. Make changes and write a test for the code added. +#. Make sure tests pass locally. Most branches created and pushed to GitHub will be tested automatically. +#. Upon completion of the work, create a pull request (PR) against the develop branch (or hotfix branch if applicable). In the PR description fill out the requested information and include the issue number (e.g., #1234). +#. Assign one label to the PR (not the ticket/issue) in order to auto-populate change logs (e.g., Bug, Feature, Maintenance, Performance, DoNotPublish) This is required and CI will fail if not present. + * **Bug** (these will appear as "Bug Fixes" in the change log) + * **Feature** (features will appear as “New Features” item in the change log) + * **Enhancement** (these will appear as “Improvements" in the change log) + * **Maintenance** (these will appear under “Maintenance" in the change log) + * **Performance** (these will appear under “Maintenance" in the change log) + * **Documentation** (these will appear under “Maintenance" in the change log) + * **Do not publish** (these will no appear in the change log) +#. Ensure all tests pass. +#. Assign a reviewer to the PR. +#. If the reviewer requests changes, then addresses changes and re-assign the reviewer as needed. +#. Once approved, merge the PR! +#. Move the related ticket(s)/issue(s) to the 'Ready to Deploy' column in the GitHub project tracker. + +Release Instructions +-------------------- + +To make a release do the following: + +#. Create a branch from develop to prepare the updates (e.g., 2.21.0-release-prep). +#. Update the root ``package.json`` file with the release version number, and then run ``npm install``. Always use MAJOR.MINOR.RELEASE. +#. Update the ``docs/sources/migrations.rst`` file with any required actions. +#. Commit the changes and push the release prep branch to GitHub, then go to the Releases page to draft a new release which will generate the changelog. +#. Copy the GitHub changelog results into ``CHANGELOG.md``. Cleanup the formatting and items as needed (make sure the spelling is correct, starts with a capital letter, if any PRs were missing the ``Do not publish`` label, etc.) and push the changelog update. +#. Make sure that any new UI needing localization has been tagged for translation, and that any new translation keys exist in the lokalise.com project. (see :doc:`translation documentation `). +#. Create PR for release preparation and merge after tests/reviews pass. +#. Create a new Release using the develop branch and new release number as the tag (https://github.com/SEED-platform/seed/releases). Include list of changes since previous release (e.g., the additions to ``CHANGELOG.md``). +#. Locally, merge the ``develop`` branch into the ``main`` branch and push. +#. Verify that the Docker versions are built and pushed to Docker Hub (https://hub.docker.com/r/seedplatform/seed/tags/). +#. Publish the new documentation in the seed-platform website repository (see instructions above under Building Documentation). + +.. _`SEED's Contribution Agreement in the GitHub repository`: https://github.com/SEED-platform/seed/blob/develop/.github/CONTRIBUTING.md diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/docker.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/docker.rst.txt new file mode 100644 index 00000000..a0208c34 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/docker.rst.txt @@ -0,0 +1,128 @@ +======================== +Docker Deployment on AWS +======================== + +Amazon Web Services (`AWS`_) provides the preferred hosting for the SEED Platform. + +**seed** is a `Django Project`_ and Django's documentation is an excellent place for general +understanding of this project's layout. + +.. _Django Project: https://www.djangoproject.com/ + +.. _AWS: http://aws.amazon.com/ + +Installation +^^^^^^^^^^^^ + +Ubuntu server 18.04 or newer with a m5ad.xlarge (if using in Production instance) + +* After launching the instance, run the following commands to install docker. + +.. code-block:: console + + # Install any upgrades + sudo apt-get update + sudo apt-get upgrade -y + + # Remove any old docker engines + sudo apt-get remove docker docker-engine docker.io containerd runc + + # Install docker community edition + sudo apt-get update + sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + sudo add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) \ + stable" + + sudo apt-get update + sudo apt-get install -y docker-ce docker-ce-cli containerd.io + # Add your user to the docker group + sudo groupadd docker + sudo usermod -aG docker $USER + newgrp docker + +.. note:: It is okay if the first command fails + +* Verify that the DNS is working correctly. Run the following and verify the response lists IPs (v6 most likely) + +.. code-block:: console + + # verify that the dns resolves + docker run --rm seedplatform/seed getent hosts seed-platform.org + # or + docker run --rm tutum/dnsutils nslookup email.us-west-2.amazonaws.com + +* Install Docker compose + +.. code-block:: console + + sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose + +* Checkout SEED (or install from the releases). + +.. code-block:: console + + git clone + +* Add in the Server setting into profile.d. For example add the content below (appropriately filled out) into /etc/profile.d/seed.sh + +.. code-block:: console + + export POSTGRES_USER=seed + export POSTGRES_DB=seed + export POSTGRES_PASSWORD=GDEus3fasd1askj89QkAldjfX + export POSTGRES_PORT=5432 + export SECRET_KEY="96=7jg%_&1-z9c9qwwu2@w$hb3r322yf3lz@*ekw-1@ly-%+^" + + # The admin user is only valid only until the database is restored + export SEED_ADMIN_USER=user@seed-platform.org + export SEED_ADMIN_PASSWORD="7FeBWal38*&k3jlfa92lakj8ih4" + export SEED_ADMIN_ORG=default + + # For SES + export AWS_ACCESS_KEY_ID= + export AWS_SECRET_ACCESS_KEY= + export AWS_SES_REGION_NAME=us-west-2 + export AWS_SES_REGION_ENDPOINT=email.us-west-2.amazonaws.com + export SERVER_EMAIL=user@seed-platform.org + + +* Before launching the first time, make sure the persistent volumes and the backup directory exist. + +.. code-block:: console + + docker volume create --name=seed_pgdata + docker volume create --name=seed_media + + mkdir -p $HOME/seed-backups + +.. note:: Make sure to have the seed-backups in your path, otherwise the db-postgres container will not launch. + +* Launch the project + +.. code-block:: console + + cd + ./deploy.sh + + +Deploying with Docker +^^^^^^^^^^^^^^^^^^^^^ + +The preferred way to deploy with Docker is using docker swarm and docker stack. +Look at the `deploy.sh script`_ for implementation details. + +The short version is to simply run the command below. Note that the passing of the docker-compose.yml filename is not required if using docker-compose.local.yml. + +```bash +./deploy.sh docker-compose.local.yml +``` + +If deploying using a custom docker-compose yml file, then simple replace the name in the command above. + + +.. _`deploy.sh script`: https://github.com/SEED-platform/seed/blob/develop/deploy.sh +.. _`JSON Type`: https://www.postgresql.org/docs/9.4/datatype-json.html diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/faq.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/faq.rst.txt new file mode 100644 index 00000000..8c3231be --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/faq.rst.txt @@ -0,0 +1,68 @@ +Frequently Asked Questions +########################## + +Here are some frequently asked questions and/or issues. + +.. contents:: + :local: + :depth: 2 + + + +Questions +========= +.. _whatisseed: + +What is the SEED Platform? +-------------------------- + +The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity. + +The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL. + +The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions. + +Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy. + + +Issues +====== + +.. _domain: + +Why is the domain set to example.com? +------------------------------------- + +If you see example.com in the emails that are sent from your hosted version of SEED then you will +need to update your django sites object in the database. + +.. code-block:: bash + + $ ./manage.py shell + + from django.contrib.sites.models import Site + one = Site.objects.all()[0] + one.domain = 'newdomain.org' + one.name = 'SEED' + one.save() + + +.. _staticfiles: + +Why aren't the static assets being served correctly? +---------------------------------------------------- + +Make sure that your local_untracked.py file does not have STATICFILES_STORAGE set to anything. If so, +then comment out that section and redeploy/recollect/compress your static assets. diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/getting_started.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/getting_started.rst.txt new file mode 100644 index 00000000..d0ae9497 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/getting_started.rst.txt @@ -0,0 +1,11 @@ +Getting Started +=============== + +Development Setup +----------------- + +.. toctree:: + :maxdepth: 2 + + setup_osx + setup_docker diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/help.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/help.rst.txt new file mode 100644 index 00000000..add7485b --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/help.rst.txt @@ -0,0 +1,28 @@ +Help +==== + +For SEED Platform Users +^^^^^^^^^^^^^^^^^^^^^^^ + +Please visit our website for information, tutorials, and documentation to help you learn how to use SEED. + +https://seed-platform.org + +The SEED Users Forum is where you can review user announcements, workflow questions, and join to connect with other users. + +https://lists.buildingenergytools.org/g/SEEDusers/topics + +For general inquiries or help on a specific problem, please fill out a request on the building data tools website help desk and select SEED as the relevant tool: + +https://buildingdata.energy.gov/#/help-desk + +For SEED Platform Developers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The open-source code is available on the GitHub organization SEED-Platform and contains various repositories for the different components of the platform such as the main SEED application, a Python SEED client to communicate to SEED's API and various example datasets. + +https://github.com/SEED-platform + +The SEED Developers Forum contains various topics and joining enables you to connect with other developers. It is recommended to join this forum to submit developer questions, features requests, and report issues as needed. Also, submitting issues on GitHub is encouraged. + +https://lists.buildingenergytools.org/g/SEEDdevelopers/topics diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/index.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/index.rst.txt new file mode 100644 index 00000000..68ea4f7e --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/index.rst.txt @@ -0,0 +1,51 @@ +.. SEED Platform documentation master file, created by + sphinx-quickstart on Tue Mar 1 14:43:22 2016. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Standard Energy Efficiency Data (SEED) Platform +=============================================== + +The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity. + +The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL. + +The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions. + +Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy. + + +.. toctree:: + :maxdepth: 2 + + getting_started + deployment + api + data_model + data_quality + mapping + matching + modules + developer_resources + license + help + faq + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/kubernetes_deployment.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/kubernetes_deployment.rst.txt new file mode 100644 index 00000000..3f70fdc1 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/kubernetes_deployment.rst.txt @@ -0,0 +1,251 @@ +Kubernetes Deployment Guide with Helm +===================================== + +Kubernetes is a robust container orchestration system for easy application deployment and management. Helm takes that a step further with by packaging up required helm "charts" into one deployment command. + +Setup +----- + +Cluster +^^^^^^^ +In order to deploy the SEED platform on a Kubernetes you will need "cluster" which will be configured by your cloud service of choice. Each installation will be slightly different depending on the service. +Below are links to quick-start guides for provisioning a cluster and connecting. These instructions are specifically for AWS, but after the Kubernetes cluster is launched, the helm commands can be used in +the same way. + +* Amazon Web Services (`AWS`_) +* Google Cloud Platform (`GCP`_) +* Azure (`AKS`_) + +AWS CLI Configuration +~~~~~~~~~~~~~~~~~~~~~ +Download and configure the AWS CLI with instructions: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html + +.. code-block:: console + + aws configure + AWS Access Key ID [None]: (from account) + AWS Secret Access Key [None]: (from account) + Default region name [None]: us-east-1 + Default output format [None]: json + +Kubectl +^^^^^^^ +Download and install Kubectl: + +- `Windows `_ +- Mac (with Homebrew) :code:`brew install kubectl` + ``` + brew install kubectl + ``` + +Kubectl is the main function in which you will be interfacing with your deployed application on your cluster. This CLI is what connects you to your cluster that you have just provisioned. +If your cloud service did not have you configure kubectl in your cluster setup, you can download it `here `_. Once kubectl is installed and configured to your cluster +you can run some simple commands to ensure its working properly: + +.. code-block:: console + + #View the cluster + kubectl cluster-info + + #View pods, services and replicasets (will be empty until deploying an app) + kubectl get all + +All of the common kubectl commands can be found in these `docs `_ + +.. note:: For those unfamiliar with CLIs, there are a number of GUI applications that are able to deploy on your stack with ease. One of which is Kubernetes native application called `Dashboard UI`_ or a third-party application called Octant :code:`brew install octant`. + +Helm +^^^^ +Helm organizes all of your Kubernetes deployment, service, and volume yml files into "charts" that can be deployed, managed, and published with simple commands. +To install Helm: + +* `Windows eksctl `_ +* Mac (with Homebrew) :code:`brew install helm` + +EKS Control (AWS Specific) +^^^^^^^^^^^^^^^^^^^^^^^^^^ +EKSCtl is a command line tool to manage Elastic Kubernetes clusters on AWS. If not using AWS, then disregard this section. + +* `Windows eksctl config `_ +* Mac (with Homebrew) :code:`brew install eksctl` + +To launch a cluster on using EKSCts, run the following command in the terminal (assuming adequate permissions for the user). Also make sure to replace items in the `<>` brackets. + +.. code-block:: yaml + + eksctl create cluster \ + --name \ + --version 1.21 \ + --region us-east-1 \ + --node-type m5.large \ + --nodes 1 \ + --nodes-min 1 \ + --nodes-max 1 \ + --managed \ + --tags environment= + +Charts +^^^^^^ +SEED stores its charts in the `charts directory`_ of the Github Repo. There are two main charts that are deployed when starting SEED on Kubernetes. + +* persistentvolumes - these are the volumes to store SEED media data and SEED Postgres data +* seed - this stores all of the other deployment and service files for the application + +Unlike persistentvolumes, the seed charts must be modified with user environment variables that will be forwarded to the docker container for deployment. +Before deployment, the user **MUST** set these variables to their desired values. + +web-deployment.yaml +******************* +This chart contains the deployment specification for the SEED web container. Replace all the values in <>. + +.. code-block:: yaml + + # Environment variables for the web container + - env: + # AWS Email service variables to send emails to new users - can be removed if not using this functionality. + - name: AWS_ACCESS_KEY_ID + value: + - name: AWS_SECRET_ACCESS_KEY + value: + - name: AWS_SES_REGION_NAME + value: us-west-2 + - name: AWS_SES_REGION_ENDPOINT + value: email.us-west-2.amazonaws.com + - name: SERVER_EMAIL + value: info@seed-platform.org + # Django Variables + - name: DJANGO_SETTINGS_MODULE + value: config.settings.docker + - name: SECRET_KEY + value: + - name: SEED_ADMIN_ORG + value: default + - name: SEED_ADMIN_PASSWORD + value: + - name: SEED_ADMIN_USER + value: + # Postgres variables + - name: POSTGRES_DB + value: seed + - name: POSTGRES_PASSWORD + value: # must match db-postgres-deployment.yaml and web-celery-deployment.yaml + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_USER + value: seeduser + # Bsyncr analysis variables + - name: BSYNCR_SERVER_PORT + value: "5000" + - name: BSYNCR_SERVER_HOST + value: bsyncr + # Sentry monitoring - remove if not applicable + - name: SENTRY_JS_DSN + value: + - name: SENTRY_RAVEN_DSN + value: + # Google self registration security - remove if not applicable + - name: GOOGLE_RECAPTCHA_SITE_KEY + value: + - name: GOOGLE_RECAPTCHA_SECRET_KEY + value: + image: seedplatform/seed: + #versions can be found here https://github.com/SEED-platform/seed/releases/tag/v2.9.3 + +web-celery-deployment.yaml +************************** +This chart contains the deployment specification for the Celery container to connect to Postgres. Replace the Postgres password to match web-deployment. + +.. code-block:: yaml + + - name: POSTGRES_PASSWORD + value: # must match db-postgres-deployment.yaml and web-celery-deployment.yaml + +bsyncr-deployment.yaml +********************** +This chart contains the deployment specification for the bsyncr analysis server. Request a NOAA token from `this website `_. + +.. code-block:: yaml + + - name: NOAA_TOKEN + value: + +Deployment +---------- +Once you are connected to your cluster and have your settings configured with the environment variables of you choice in the charts, you are ready to deploy the app. +First, make sure that the correct context is selected which is needed if there is more than one cluster: + +.. code-block:: bash + + kubectl config get-contexts + kubectl config use-context + +Deploy the site using the helm commands in the root of the charts directory. + +* :code:`helm install --generate-name persistentvolumes` +* :code:`helm install --generate-name seed` + +You will be able to see SEED coming online with statuses like container creating, and running with: + +* :code:`kubectl get all` + +Once all of the pods are running you will be able to hit the external ingress through the URL listed in the web service information. It should look something like + +.. code-block:: bash + + service/web LoadBalancer 10.100.154.227 80:32291/TCP + +Managing Existing Clusters +-------------------------- + +Upgrade/Redeploy the Helm Stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To upgrade or dedeploy a helm chart, first find the helm release that you want to upgrade, then run the upgrade with the selected chart. + +.. code-block:: bash + + helm list + helm upgrade ./seed + +Managing the Kubernetes Cluster (AWS Specific) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Enable kubectl to talk to one of the created clusters by running the following command in the terminal after configuring the AWS credentials and cli. + +.. code-block:: bash + + aws eks --region update-kubeconfig --name + +Logging In +^^^^^^^^^^ +After a successful deployment in order to login you will need to create yourself as a user in the web container. To do this, we will exec into the container and run some Django commands. +* View all deployments and services, :code:`kubectl get all` +* :code:`kubectl get pods` +* :code:`kubectl exec -it -- bash` + +Now that we are in the container, we can make a user. +.. code-block:: bash + + ./manage.py create_default_user --username=admin@my.org --organization=seedorg --password=badpass + +You can now use these credentials to log in to the SEED website. + +Update web and web-celery +^^^^^^^^^^^^^^^^^^^^^^^^^ +The command below will restart the pods and re-pull the docker images. + +.. code-block:: bash + + kubectl rollout restart deployment web && kubectl rollout restart deployment web-celery + + +Other Resources +--------------- +Common kubectl actions can be found `on the kubernetes website `_ + + +.. _AWS: https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html +.. _GCP: https://cloud.google.com/kubernetes-engine/docs/quickstart +.. _AKS: https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough#connect-to-the-cluster + +.. _Dashboard UI: https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/ + +.. _charts directory: https://github.com/SEED-platform/seed/tree/develop/charts diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/license.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/license.rst.txt new file mode 100644 index 00000000..f29b1ce4 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/license.rst.txt @@ -0,0 +1,5 @@ +============== +License +============== + +.. include:: ../../LICENSE.md diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/linux.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/linux.rst.txt new file mode 100644 index 00000000..1843f0f6 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/linux.rst.txt @@ -0,0 +1,334 @@ +General Linux Setup +=================== + +While Amazon Web Services (`AWS`_) provides the preferred hosting for SEED, +running on a bare-bones Linux server follows a similar setup, replacing the +AWS services with their Linux package counterparts, namely: PostgreSQL and +Redis. + +**SEED** is a `Django project`_ and Django's documentation +is an excellent place to general understanding of this project's layout. + +.. _Django project: https://www.djangoproject.com/ + +.. _AWS: http://aws.amazon.com/ + +Prerequisites +^^^^^^^^^^^^^^ + +Ubuntu server/desktop 16.04 or newer (18.04 recommended) + +Install the following base packages to run SEED: + +.. code-block:: console + + sudo add-apt-repository ppa:timescale/timescaledb-ppa + sudo apt update + sudo apt upgrade + sudo apt install libpq-dev python3-dev python3-pip libatlas-base-dev \ + gfortran build-essential nodejs npm libxml2-dev libxslt1-dev git \ + libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python mercurial + sudo apt install gdal-bin postgis + sudo apt install redis-server + sudo apt install timescaledb-postgresql-10 postgresql-contrib + + # For running selenium/protractor + sudo apt install default-jre + +.. note:: postgresql ``>=9.3`` is required to support `JSON Type`_ + +.. _JSON Type: http://www.postgresql.org/docs/9.3/static/datatype-json.html + +Configure PostgreSQL +^^^^^^^^^^^^^^^^^^^^ + +Replace 'seeddb', 'seeduser' with desired db/user. By +default use password `seedpass` when prompted + +.. code-block:: console + + $ sudo timescaledb-tune + $ sudo service postgresql restart + $ sudo su - postgres + $ createuser -P "seeduser" + $ createdb "seeddb" --owner="seeduser" + $ psql + postgres=# GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO "seeduser"; + postgres=# ALTER USER "seeduser" CREATEDB CREATEROLE SUPERUSER; + postgres=# \q + $ exit + + +Python Dependencies +^^^^^^^^^^^^^^^^^^^ + +clone the **seed** repository from **github** + +.. code-block:: console + + $ git clone git@github.com:SEED-platform/seed.git + +enter the repo and install the python dependencies from `requirements`_ + +.. _requirements: https://github.com/SEED-platform/seed/blob/main/requirements/local.txt + +.. code-block:: console + + $ cd seed + $ pip3 install -r requirements/local.txt + + +JavaScript Dependencies +^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: console + + $ npm install + + +Django Database Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Copy the ``local_untracked.py.dist`` file in the ``config/settings`` directory to +``config/settings/local_untracked.py``, and add a ``DATABASES`` configuration with your database username, password, +host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database instance +you have manually installed within your infrastructure. + +.. code-block:: python + + # Database + DATABASES = { + 'default': { + 'ENGINE': 'django.contrib.gis.db.backends.postgis', + 'NAME': 'seeddb', + 'USER': 'seeduser', + 'PASSWORD': '', + 'HOST': 'localhost', + 'PORT': '5432', + } + } + + +.. note:: + + Other databases could be used such as MySQL, but are not supported + due to the postgres-specific `JSON Type`_ + +In in the above database configuration, ``seed`` is the database name, this is arbitrary and any valid name can be +used as long as the database exists. Enter the database name, user, password you set above. + +The database settings can be tested using the Django management command, ``python3 manage.py dbshell`` to connect to the +configured database. + +create the database tables and migrations: + +.. code-block:: console + + $ python3 manage.py migrate + +Cache and Message Broker +^^^^^^^^^^^^^^^^^^^^^^^^ + +The SEED project relies on `redis`_ for both cache and message brokering, and +is available as an AWS `ElastiCache`_ service or with the ``redis-server`` +Linux package. (``sudo apt install redis-server``) + +``local_untracked.py`` should be updated with the ``CACHES`` and ``CELERY_BROKER_URL`` +settings. + +.. _ElastiCache: https://aws.amazon.com/elasticache/ + +.. _redis: http://redis.io/ + + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + + +Creating the initial user +^^^^^^^^^^^^^^^^^^^^^^^^^ + +create a superuser to access the system + +.. code-block:: console + + $ python3 manage.py create_default_user --username=admin@my.org --organization=lbnl --password=badpass + + +.. note:: + + Of course, you need to save this user/password somewhere, since this is what + you will use to login to the SEED website. + + Every user must be tied to an organization, visit ``/app/#/profile/admin`` + as the superuser to create parent organizations and add users to them. + + + +Running celery the background task worker +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +`Celery`_ is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, ``celery`` +can be started: + +.. code-block:: console + + DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler + +.. _Celery: http://www.celeryproject.org/ + + +Running the development web server +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The Django dev server (not for production use) can be a quick and easy way to +get an instance up and running. The dev server runs by default on port 8000 +and can be run on any port. See Django's `runserver documentation`_ for more +options. + +.. _runserver documentation: https://docs.djangoproject.com/en/1.6/ref/django-admin/#django-admin-runserver + +.. code-block:: console + + $ python3 manage.py runserver --settings=config.settings.dev + + +Running a production web server +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Our recommended web server is uwsgi sitting behind nginx. The python package ``uwsgi`` is needed for this, and +should install to ``/usr/local/bin/uwsgi`` We recommend using ``dj-static`` to load static files. + +.. note:: + + The use of the ``dev`` settings file is production ready, and should be + used for non-AWS installs with ``DEBUG`` set to ``False`` for production use. + + +.. code-block:: console + + $ pip3 install uwsgi dj-static + + +Generate static files: + +.. code-block:: console + + $ python3 manage.py collectstatic --settings=config.settings.prod -i package.json -i package-lock.json -i node_modules/openlayers-ext/index.html + +Update ``config/settings/local_untracked.py``: + +.. code-block:: python + + DEBUG = False + # static files + STATIC_ROOT = 'collected_static' + STATIC_URL = '/static/' + +Start the web server (this also starts celery): + +.. code-block:: console + + $ ./bin/start-seed + +.. warning:: + + Note that uwsgi has port set to ``80``. In a production setting, a dedicated web server such as nginx would be + receiving requests on port 80 and passing requests to uwsgi running on a different port, e.g 8000. + + + + +Environment Variables +^^^^^^^^^^^^^^^^^^^^^ + +The following environment variables can be set within the ``~/.bashrc`` file to +override default Django settings. + +.. code-block:: bash + + export SENTRY_DSN=https://xyz@app.getsentry.com/123 + export DEBUG=False + export ONLY_HTTPS=True + + +Mail Services +^^^^^^^^^^^^^ + +AWS SES Service +--------------- + +In the AWS setup, we can use SES to provide an email service for Django. The service is +configured in the config/settings/local_untracked.py: + +.. code-block:: python + + EMAIL_BACKEND = 'django_ses.SESBackend' + + +In general, the following steps are needed to configure SES: + +1. Access Amazon SES Console - `Quickstart `_ +2. Login to Amazon SES Console. Verify which region we are using (e.g., us-east-1) +3. Decide on email address that will be sending the emails and add them to the `SES Verified Emails `_. +4. Test that SES works as expected (while in the SES sandbox). Note that you will need to add the sender and recipient emails to the verified emails while in the sandbox. +5. Update the local_untracked.py file or set the environment variables for the docker file. +6. Once ready, move the SES instance out of the sandbox. Following instructions `here `_ +7. (Optional) Set up Amazon Simple Notification Service (Amazon SNS) to notify you of bounced emails and other issues. +8. (Optional) Use the AWS Management Console to set up Easy DKIM, which is a way to authenticate your emails. Amazon SES console will have the values for SPF and DKIM that you need to put into your DNS. + +SMTP service +------------ + +Many options for setting up your own `SMTP`_ service/server or using other SMTP +third party services are available and compatible including `gmail`_. SMTP is not configured for working within Docker at the moment. + +.. _SMTP: https://docs.djangoproject.com/en/2.0/ref/settings/#email-backend +.. _gmail: http://stackoverflow.com/questions/19264907/python-django-gmail-smtp-setup + +.. code-block:: python + + EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' + +local_untracked.py +^^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + # PostgreSQL DB config + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'seed', + 'USER': 'your-username', + 'PASSWORD': 'your-password', + 'HOST': 'your-host', + 'PORT': 'your-port', + } + } + + # config for local storage backend + DOMAIN_URLCONFS = {'default': 'config.urls'} + + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + + # SMTP config + EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' + + # static files + STATIC_ROOT = 'collected_static' + STATIC_URL = '/static/' diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/mapping.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/mapping.rst.txt new file mode 100644 index 00000000..077593ec --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/mapping.rst.txt @@ -0,0 +1,42 @@ +========= +Mapping +========= + +This document describes the set of calls that occur from the web client or API +down to the back-end for the process of mapping data into SEED. + +An overview of the process is: + +1. Import - A file is uploaded to the server +2. Save - The file is batched saved into the database as JSON data +3. Mapping - Mapping occurs on that file +4. Matching / Merging +5. Pairing + +Import +------ + +From the web UI, the import process invokes `seed.views.main.save_raw_data` to save the data. When the data is +done uploading, we need to know whether it is a Portfolio Manager file, so we can add metadata to the record in the +database. The end of the upload happens in `seed.data_importer.views.DataImportBackend.upload_complete`. At this +point, the request object has additional attributes for Portfolio Manager files. These are saved in the model +`seed.data_importer.models.ImportFile`. + +Mapping +------- + +Once files are uploaded, file header columns need to be mapped to SEED columns. Mappings can be specified/decided manually for any particular file import, +or mapping profiles can be created and subsequently applied to any file imports. + +When a column mapping profile is applied to an import file, file header columns defined in the profile must match exactly (spaces, lowercase, uppercase, etc.) +in order for the corresponding SEED column information to be used/mapped. + +Matching +-------- + +.. todo:: document + +Pairing +------- + +.. todo:: document diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/matching.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/matching.rst.txt new file mode 100644 index 00000000..2d28d935 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/matching.rst.txt @@ -0,0 +1,123 @@ +Matching +======== + +What is it? +----------- +Within SEED, matching refers to a possible relationship between at least 2 properties or at least 2 tax lots. +Two properties **match** if they have the same values for some specified field(s). +These specified fields are referred to as **matching criteria**, and each SEED organization has its +own set of matching criteria which is customizable by users. + +Why does it exist? +------------------ +At a high level, matching is used to identify if two or more property records are actually different +representations of the same property (or tax lots representing one tax lot). For example, within the same cycle, +two matching records, so one persists while the other is used and subsequently discarded to update the persisting record +(say if the building owner's phone number changed). Or across different cycles, it's possible that the +two records capture the same property at different times/cycles - this relationship is referred to as a **link**. + +How and when is it used? +------------------------ + +In-Cycle Merging +"""""""""""""""" +(This is different from manual merging.) + +For records within the same cycle, there really shouldn't be more than one +representation of the same property (or tax lot). As much as possible, the program +is set up to prevent this from happening by automatically **merging** matched +records together whenever they might occur in the same cycle. + +Specifically, a merge of matches might need to occur after any of the following events: + +1. The record has been manually edited. +2. The record was just created as a result of a manual merge (via the 'Actions' on the Properties or Tax Lots page). +3. The record has just been imported. + +The actual execution of merges includes a few additional, unrelated steps but, +in the scope of merging, the following occurs. + +The record in the scenarios listed above is the "target" record. Any and all +matches found, excluding the "target", are merged together first. If there are +overlapping values, priority is given to more recently updated records. + +Once these matches (excluding the target) are merged together, the final step is +to merge the "target" record. In all but one case, choosing between overlapping +values gives priority to the "target". That one case is when a record has just been +imported. Here, overlapping values follow merge protection rules set by +the user for an organization in this final step. + +Linking (Across Cycles) +""""""""""""""""""""""" +For records in different cycles, matches between these are considered links. +Links are used to connect snapshots of the same record year-over-year (at different time periods). +This allows for the analysis of how the record has changed over time. + +In the case of properties, these links are used to associate meters to properties. +This means that adding meters to a property in one cycle will make those meters +accessible to that same property's instance in all other cycles. + +This association can be viewed in aggregate; all of the records within some selected cycles are +grouped and displayed with their links. Alternatively, this association can be viewed for particular linked +group; the linked records of this group are displayed by themselves. + +Putting them Together, Match-Merge-Linking +"""""""""""""""""""""""""""""""""""""""""" +As mentioned earlier, there is a rule or assumption that at most one representation of +the same record can exist in any given cycle. + +This avoids unresolvable situations that would prevent year-over-year analysis. +In the most simple case, a record in `Cycle A` matches two records in `Cycle B`. +SEED wouldn't know which of the two records in `Cycle B` should be +the "snapshot" for this time period. + +For this reason, in-cycle match merging always occurs before cross-cycle match linking. +So when searches for links do happen, ambiguous cases have already been resolved. + +For an individual record, these are the following cases in which a +match-merge-link is automatically run: +1. Explicit triggering (from the Property/TaxLot Detail page) +2. After editing (in the Property/TaxLot Detail page) +3. After manual merging (in the Properties/Tax Lots list page). Explicitly +specified merges happen as chosen by the user. Then, if the resulting record has +matches, merges and/or linking happens. +4. When importing a record. If the incoming record has matches, +merges and/or linking happens. + +For a whole organization, a match-merge-link round for all records in that +organization is run in the following cases: +1. During the original deployment of this feature - This happens in order to +initially normalize the existing data and establish all initial links. +2. Whenever a user changes matching criteria - This happens in order to +re-normalize existing data and reestablish links. As of this writing, before +committing matching criteria changes, a user can view a preview of how their +records will be affected as these are difficult to reverse. + +Note on In-Cycle Not-merged Matches +""""""""""""""""""""""""""""""""""" +Even though the application tries it's best to have only one representative record per property +(or tax lot) per Cycle, it's possible for there to exist matches that were not merged. +This can happen if a user manually unmerges a record after a (manual or automatic) merge occurs. +If this happens, and there exists two records that match each other but are not merged, +both records are **completely unlinked**. Without user intervention such as editing +one of the matching criteria values, these will be merged and linked as described +above next time the system finds them during a match search. + +Match Searching in Depth +------------------------ +Though they accomplish the same goal, the process for merging is very different between the last case, importing, +and the first 2 cases, manual edit or manual merge. + +In the case of manual merging or editing, this process accounts for the fact that these are records that already exist. +Specifically, they may have associations such as labels, notes, pairings, and for properties, meters. +So during a subsequent match search leading to a merge of two or more records, all of these "old" associations are +carried over to the final record once merges are complete. + +In the case of importing, considerations must be taken for the fact that, in most cases, multiple records +are being imported together. Also, since this is the entry point for records, it's possible that a user might +accidentally try to import the same record snapshot twice - where all the record values are the same as another +existing record (as opposed to just having the same values for matching criteria fields). So on import, the process is as follows: + +1. Amongst only the incoming records, duplicates (of other incoming or existing) are flagged and ignored. +2. Amongst only the incoming records, matching records are merged together. +3. Amongst all records in the same Cycle, incoming records that match an existing record gets merged with priority to that existing record. If the incoming record has multiple existing matches, the existing matches are merged together in latest updated order first while also combining any other associations (labels, notes, etc.) just as in the manual merge or edit cases. Since the incoming record is new, it doesn't have any of the other associations. diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/migrations.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/migrations.rst.txt new file mode 100644 index 00000000..629cf659 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/migrations.rst.txt @@ -0,0 +1,291 @@ +Migrations +========== + +Django handles the migration of the database very well; however, there are various changes to SEED that may require some custom (manual) migrations. The migration documentation includes the required changes based on deployment and development for each release. + +Version Develop +--------------- + +In order to support Redis passwords, the configuration of the Redis/Celery settings changed a bit. +You will need to add the following to your local_untracked.py configuration file. If you are using +Docker then you will not need to do this. + +.. code-block:: python + + CELERY_RESULT_BACKEND = CELERY_BROKER_URL + +If you are using a password, then in your local_untracked.py configuration, add the password to +the CELERY_BROKER_URL. Your final configuration should look like the following in your +local_untracked.py file + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://:password@127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + + CELERY_RESULT_BACKEND = CELERY_BROKER_URL + CELERY_TASK_DEFAULT_QUEUE = 'seed-local' + CELERY_TASK_QUEUES = ( + Queue( + CELERY_TASK_DEFAULT_QUEUE, + Exchange(CELERY_TASK_DEFAULT_QUEUE), + routing_key=CELERY_TASK_DEFAULT_QUEUE + ), + ) + +Version 3.0.0-beta.0 +-------------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.22.0 +-------------- +- Run ``./manage.py migrate``. +- There is a Redis dependency update in this release that requires users and deployments to modify their settings' ``CACHES`` config. + #. Update your dependencies with pip install -r requirements/base.txt + #. Update the CACHES BACKEND property to django_redis.cache.RedisCache + #. Update the CACHES LOCATION property to match the redis-py native URL notation for connection strings, including the redis protocol and database number. e.g. redis://localhost:6379/1 + + Since the CELERY_BROKER_URL setting must also be in the same format, it may be helpful to configure that setting first and then reference it in the caches LOCATION parameter. +- See the `PR for an example migration `_. + +Version 2.21.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.20.1 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.20.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There is a single long running migration related to importing census tract disadvantaged community data. This migration should take around 7 minutes to complete. + +Version 2.19.0 +-------------- +- Run `./manage.py migrate`. +- There is a new migration in this release that requires column names to be unique across `organization`, `table_name`, and `is_extra_data`. This migration will fail if there are duplicate column names. If you have duplicate column names, you will need to manually fix them in your database before running the migration. The following steps will help you identify and fix the duplicate column names: + - Check the organization age to gauge the impact of the change. If it is a deprecated org, impact of the change will be low. Often this issue arose in older organizations when units were not part of the columns. The old mapping columns were not upserts with the units, so typically the columns impacted are the ones with units. + - Query the `seed_column` table for the organization and column name displayed on the screen (e.g., `organization_id = 300 and column_name = 'Source EUI (kBtu/ft2)'`). If there is no `table_name` set, it is likely an import file column name and can easily be cleaned up without causing issues. In such cases, there will be two rows, and you want to keep the one with the `units_pint` column set. + - More complex columns may require deleting or updating the `column_id` in the `seed_columnmapping_*` tables. If there is a foreign key constraint with `seed_columnmapping_*`, take note of the ID you want to remove and the ID you want it to be replaced with (preferably keep the one with units_pint). + - If the constraint is on `seed_columnmapping_column_raw`: + - The field should be an import file column (i.e., no `table_name` item). Query for the old column in `seed_columnmapping_column_raw` (e.g., `column_name = `). + - Replace the old ID with the new one. If it errors because it already exists, then the row can be deleted. + - Return to the `seed_column` table and remove the old ID. + - If the constraint is on `seed_columnmapping_column_mapped`: + - The mapped column should have a `table_name` in the field. If not, it is likely an older organization. + - If there is no `table_name`, remove the row from the `seed_columnmapping_column_mapped` table. + - Return to the `seed_column` table and remove the old ID. + +Version 2.18.1 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.18.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.17.4 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.17.3 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.17.2 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.17.1 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.17.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.16.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.15.2 +-------------- +- There are no migrations needed for this version. + +Version 2.15.1 +-------------- +- There are no migrations needed for this version. + +Version 2.15.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.14.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.13.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.12.0 - 2.12.4 +----------------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.11.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.10.0 +-------------- +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +Version 2.7.3 to 2.9.0 +---------------------- +- The migrations should work without additional support. Simply run `./manage.py migrate`. + +Version 2.7.2 +------------- +- The migrations should work without additional support. Simply run `./manage.py migrate`. There are no manual migrations needed. +- Note the **Important Note** in Version 2.7.1 migration below which may require the need to run a "fake" migration + +Version 2.7.1 +------------- + +- There are no special migrations needed for this version. Simply run `./manage.py migrate`. + +**Important Note:** + +If upgrading from `< 2.7.0` to `>= 2.7.1` you may encounter a failed migration with ``0118_match_merge_link_all_orgs``. This is expected if the database is several versions behind, and it effectively reorders migration 118 to run after all other migrations have completed to prepare your database to recognize properties and taxlots across multiple cycles. Run the following code manually to fully migrate: + +#. ``./manage.py migrate --fake seed 0118_match_merge_link_all_orgs`` + +#. ``./manage.py migrate`` + +#. ``./manage.py shell`` + + .. code-block:: python + + from seed.lib.superperms.orgs.models import Organization + from seed.utils.match import whole_org_match_merge_link + + for org in Organization.objects.all(): + whole_org_match_merge_link(org.id, 'PropertyState') + whole_org_match_merge_link(org.id, 'TaxLotState') + +Version 2.7.0 +------------- + +- This migration will run a match/merge/pair/link method upon migration. Make sure to run the migration manually and not inside of the docker container using the ./deploy.sh script. +- Make sure to backup the database before performing the migration. +- Run `./manage.py migrate`. + +Version 2.6.1 +------------- + +- The migrations should work without additional support. Simply run `./manage.py migrate`. There are no manual migrations needed for the 2.6.1 release. + + +Version 2.6.0 +------------- + +Version 2.6.0 includes support for meters and time series data storage. In order to use this release +you must first install `TimescaleDB`_. + +Docker-based Deployment +^^^^^^^^^^^^^^^^^^^^^^^ +Docker-based deployments shouldn't require running any additional commands for installation. The +timescaledb installation will happen automatically when updating the postgres container. Also, +the installation of the extension occurs in a Django migration. + +Ubuntu +^^^^^^ + +.. code-block:: console + + sudo add-apt-repository ppa:timescale/timescaledb-ppa + sudo apt update + sudo apt install timescaledb-postgresql-10 + sudo timescaledb-tune + sudo service postgresql restart + +Max OSX +^^^^^^^ + +.. code-block:: console + + brew tap timescale/tap + brew install timescaledb + /usr/local/bin/timescaledb_move.sh + timescaledb-tune + brew services restart postgresql + +Version 2.5.2 +------------- + +- There are no manual migrations that are needed. The `./manage.py migrate` command may take awhile to run since the migration requires the recalculation of all the normalized addresses to parse bldg correct and to cast the result as a string and not a bytestring. + +Version 2.5.1 +------------- + +- The migrations should work by simply running `./manage.py migrate`. There are no manual migrations needed for the 2.5.1 release. + +Version 2.5.0 +------------- + +Docker-based Deployment +^^^^^^^^^^^^^^^^^^^^^^^ + +- Add the MapQuest API key to your organization. +- On deployment, the error below is indicative that you need to install the extensions in the postgres database. Run `docker exec update-postgis.sh`. + + django.db.utils.OperationalError: could not open extension control file "/usr/share/postgresql/11/extension/postgis.control": No such file or directory + +- If you are using a copied version of the docker-compose.yml file, then you need to change `127.0.0.1:5000/postgres` to `127.0.0.1:5000/postgres-seed` + +Development +^^^^^^^^^^^ + +- **Delete** your bower directory `rm -rf seed/static/vendors`. +- **Delete** your css directory `rm -rf seed/static/seed/css`. +- **Remove** these lines from `local_untracked.py` if you have them. + +.. code-block:: python + + DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' + STATICFILES_STORAGE = DEFAULT_FILE_STORAGE + +- Run `pip3 install -r requirements/local.txt`. +- Run `npm install` from root checkout of SEED. + +- If testing geocoding, then sign up for as a `MapQuest Developer`_ and create a new `MapQuest Key`_. +- Add the key to the organization that you are using in development. + +- **Update** your DATABASES engine to be `django.contrib.gis.db.backends.postgis` + +.. code-block:: python + + DATABASES = { + 'default': { + 'ENGINE': 'django.contrib.gis.db.backends.postgis', + 'NAME': 'seeddb', + 'USER': 'seeduser', + 'PASSWORD': 'seedpass', + 'HOST': 'localhost', + 'PORT': '5432', + } + } + +- Run ``./manage.py migrate`` + +.. _`MapQuest Developer`: https://developer.mapquest.com/plan_purchase/steps/business_edition/business_edition_free/register + +.. _`MapQuest Key`: https://developer.mapquest.com/user/me/apps + +.. _`TimescaleDB`: https://docs.timescale.com/v1.2/getting-started diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules.rst.txt new file mode 100644 index 00000000..4c920b9e --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules.rst.txt @@ -0,0 +1,26 @@ +========= +Modules +========= + +.. toctree:: + :maxdepth: 3 + + modules/config + modules/seed.cleansing + modules/seed.data + modules/seed.data_importer + modules/seed.features + modules/seed.landing + modules/seed.lib + modules/seed.lib.mappings + modules/seed.lib.merging + modules/seed.mappings + modules/seed.managers + modules/seed.models + modules/seed.public + modules/seed + modules/seed.serializers + modules/seed.tests + modules/seed.urls + modules/seed.utils + modules/seed.views diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/config.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/config.rst.txt new file mode 100644 index 00000000..09215b7d --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/config.rst.txt @@ -0,0 +1,45 @@ +Configuration +============= + +Submodules +---------- + +Template Context +---------------- + +.. automodule:: config.template_context + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: config.tests + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: config.utils + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: config.views + :members: + :undoc-members: + :show-inheritance: + +WSGI +---- + +.. automodule:: config.wsgi + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.cleansing.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.cleansing.rst.txt new file mode 100644 index 00000000..e185fd8e --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.cleansing.rst.txt @@ -0,0 +1,35 @@ +Data Quality Package +==================== + +Inheritance +----------- + +.. inheritance-diagram:: seed.data_quality.models + :parts: 2 + +Submodules +---------- + +Models +------ + +.. automodule:: seed.models.data_quality + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: seed.tests.data_quality + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.views.data_quality + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.data.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.data.rst.txt new file mode 100644 index 00000000..cf066173 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.data.rst.txt @@ -0,0 +1,22 @@ +Data Package +============ + +Submodules +---------- + +BEDES +----- + +.. automodule:: seed.data.bedes + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.data + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.data_importer.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.data_importer.rst.txt new file mode 100644 index 00000000..a446d80d --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.data_importer.rst.txt @@ -0,0 +1,55 @@ +Data Importer Package +===================== + +Submodules +---------- + +Managers +-------- + +.. automodule:: seed.data_importer.managers + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. .. automodule:: seed.data_importer.models +.. :members: +.. :undoc-members: +.. :show-inheritance: + +URLs +---- + +.. automodule:: seed.data_importer.urls + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: seed.data_importer.utils + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.data_importer.views + :members: + :undoc-members: + :show-inheritance: + :noindex: + + +Module contents +--------------- + +.. automodule:: seed.data_importer + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.features.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.features.rst.txt new file mode 100644 index 00000000..ce361d2e --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.features.rst.txt @@ -0,0 +1,22 @@ +Features Package +================ + +Submodules +---------- + +.. Steps +.. -------------------------- + +.. .. automodule:: seed.features.steps +.. :members: +.. :undoc-members: +.. :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.features + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.landing.management.commands.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.landing.management.commands.rst.txt new file mode 100644 index 00000000..57da9c38 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.landing.management.commands.rst.txt @@ -0,0 +1,22 @@ +Landing Management Package +========================== + +Submodules +---------- + +Update EULA +----------- + +.. automodule:: seed.landing.management.commands.update_eula + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.landing.management.commands + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.landing.management.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.landing.management.rst.txt new file mode 100644 index 00000000..c17e2852 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.landing.management.rst.txt @@ -0,0 +1,17 @@ +seed.landing.management package +=============================== + +Subpackages +----------- + +.. toctree:: + + seed.landing.management.commands + +Module contents +--------------- + +.. automodule:: seed.landing.management + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.landing.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.landing.rst.txt new file mode 100644 index 00000000..8103b029 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.landing.rst.txt @@ -0,0 +1,61 @@ +Landing Package +=============== + +Subpackages +----------- + +.. toctree:: + + seed.landing.management + +Submodules +---------- + +Forms +----- + +.. automodule:: seed.landing.forms + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. automodule:: seed.landing.models + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: seed.landing.tests + :members: + :undoc-members: + :show-inheritance: + +URLs +---- + +.. automodule:: seed.landing.urls + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.landing.views + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.landing + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.lib.mappings.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.lib.mappings.rst.txt new file mode 100644 index 00000000..f7bbb15c --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.lib.mappings.rst.txt @@ -0,0 +1,62 @@ +seed.lib.mappings package +========================= + +Submodules +---------- + +seed.lib.mappings.mapper module +------------------------------- + +.. automodule:: seed.lib.mappings.mapper + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.mapping_columns module +---------------------------------------- + +.. automodule:: seed.lib.mappings.mapping_columns + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.mapping_data module +------------------------------------- + +.. automodule:: seed.lib.mappings.mapping_data + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.test_mapper module +------------------------------------ + +.. automodule:: seed.lib.mappings.test_mapper + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.test_mapping_columns module +--------------------------------------------- + +.. automodule:: seed.lib.mappings.test_mapping_columns + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.test_mapping_data module +------------------------------------------ + +.. automodule:: seed.lib.mappings.test_mapping_data + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.lib.mappings + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.lib.merging.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.lib.merging.rst.txt new file mode 100644 index 00000000..98b5be8a --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.lib.merging.rst.txt @@ -0,0 +1,22 @@ +seed.lib.merging package +======================== + +Submodules +---------- + +seed.lib.merging.merging module +------------------------------- + +.. automodule:: seed.lib.merging.merging + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.lib.merging + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.lib.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.lib.rst.txt new file mode 100644 index 00000000..8de8e0e6 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.lib.rst.txt @@ -0,0 +1,23 @@ +Library Packages +================ + +Submodules +---------- + +Module contents +--------------- + +.. automodule:: seed.lib + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: seed.lib.mappings + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: seed.lib.merging + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.management.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.management.rst.txt new file mode 100644 index 00000000..9b600793 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.management.rst.txt @@ -0,0 +1,17 @@ +Management Package +================== + +Subpackages +----------- + +.. toctree:: + + seed.management.commands + +Module contents +--------------- + +.. automodule:: seed.management + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.managers.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.managers.rst.txt new file mode 100644 index 00000000..d77c318c --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.managers.rst.txt @@ -0,0 +1,29 @@ +Managers Package +================ + +Subpackages +----------- + +.. toctree:: + + seed.managers.tests + +Submodules +---------- + +JSON +---- + +.. automodule:: seed.managers.json + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.managers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.managers.tests.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.managers.tests.rst.txt new file mode 100644 index 00000000..2ef2cc25 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.managers.tests.rst.txt @@ -0,0 +1,22 @@ +Manager Tests Package +===================== + +Submodules +---------- + +Test JSON Manager +----------------- + +.. automodule:: seed.managers.tests.test_json_manager + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.managers.tests + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.mappings.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.mappings.rst.txt new file mode 100644 index 00000000..e749754f --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.mappings.rst.txt @@ -0,0 +1,38 @@ +Mapping Package +=============== + +Submodules +---------- + +seed.mappings.mapper module +--------------------------- + +.. automodule:: seed.mappings.mapper + :members: + :undoc-members: + :show-inheritance: + +.. seed.mappings.reconcile_mappings module +.. --------------------------------------- + +.. .. automodule:: seed.mappings.reconcile_mappings +.. :members: +.. :undoc-members: +.. :show-inheritance: + +seed.mappings.seed_mappings module +---------------------------------- + +.. automodule:: seed.mappings.seed_mappings + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.mappings + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.models.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.models.rst.txt new file mode 100644 index 00000000..fb0187a3 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.models.rst.txt @@ -0,0 +1,71 @@ +Models +=================== + +Submodules +---------- + +AuditLog +--------------------------- + +.. automodule:: seed.models.auditlog + :members: + :undoc-members: + :show-inheritance: + +Columns +-------------------------- + +.. automodule:: seed.models.columns + :members: + :undoc-members: + :show-inheritance: + +Cycles +------------------------- + +.. automodule:: seed.models.cycles + :members: + :undoc-members: + :show-inheritance: + +Joins +------------------------ + +.. automodule:: seed.models.joins + :members: + :undoc-members: + :show-inheritance: + +Generic Models +------------------------- + +.. automodule:: seed.models.models + :members: + :undoc-members: + :show-inheritance: + + +Properties +----------------------------- + +.. automodule:: seed.models.properties + :members: + :undoc-members: + :show-inheritance: + +TaxLots +--------------------------- + +.. automodule:: seed.models.tax_lots + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.models + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.public.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.public.rst.txt new file mode 100644 index 00000000..8a292bdc --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.public.rst.txt @@ -0,0 +1,22 @@ +Public Package +============== + +Submodules +---------- + +Models +------ + +.. automodule:: seed.public.models + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.public + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.rst.txt new file mode 100644 index 00000000..771c0324 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.rst.txt @@ -0,0 +1,106 @@ +SEED Package +============ + +Subpackages +----------- + +.. toctree:: + + seed.features + seed.management + seed.mappings + seed.templatetags + seed.test_helpers + seed.tests + + +Inheritance +----------- + +.. inheritance-diagram:: seed.models + :parts: 2 + + +Submodules +---------- + +Decorators +---------- + +.. automodule:: seed.decorators + :members: + :undoc-members: + :show-inheritance: + +Factory +------- + +.. automodule:: seed.factory + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. automodule:: seed.models + :members: + :undoc-members: + :show-inheritance: + +.. Reconcile +.. --------- + +.. .. automodule:: seed.reconcile +.. :members: +.. :undoc-members: +.. :show-inheritance: + +Search +------ + +.. automodule:: seed.search + :members: + :undoc-members: + :show-inheritance: + +Tasks +----- + +.. automodule:: seed.tasks + :members: + :undoc-members: + :show-inheritance: + +Token Generator +--------------- + +.. automodule:: seed.token_generators + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: seed.utils + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.views + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.serializers.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.serializers.rst.txt new file mode 100644 index 00000000..5f3a7dcf --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.serializers.rst.txt @@ -0,0 +1,30 @@ +Serializers Package +=================== + +Submodules +---------- + +Serializers +----------- + +.. automodule:: seed.serializers.celery + :members: + :undoc-members: + :show-inheritance: + +Labels +------ + +.. automodule:: seed.serializers.labels + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.serializers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.templatetags.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.templatetags.rst.txt new file mode 100644 index 00000000..5f799d24 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.templatetags.rst.txt @@ -0,0 +1,13 @@ +Templatetags Package +========================= + +Submodules +---------- + +Breadcrumbs +----------- + +.. automodule:: seed.templatetags.breadcrumbs + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.test_helpers.factory.lib.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.test_helpers.factory.lib.rst.txt new file mode 100644 index 00000000..7cbfda51 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.test_helpers.factory.lib.rst.txt @@ -0,0 +1,13 @@ +Test Helper Factory Lib Package +=============================== + +Submodules +---------- + +Chomsky +------- + +.. automodule:: seed.test_helpers.factory.lib.chomsky + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.test_helpers.factory.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.test_helpers.factory.rst.txt new file mode 100644 index 00000000..3b3a5393 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.test_helpers.factory.rst.txt @@ -0,0 +1,20 @@ +Test Helper Factor Package +========================== + +Subpackages +----------- + +.. toctree:: + + seed.test_helpers.factory.lib + +Submodules +---------- + +Helpers +------- + +.. automodule:: seed.test_helpers.factory.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.test_helpers.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.test_helpers.rst.txt new file mode 100644 index 00000000..d0ebe883 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.test_helpers.rst.txt @@ -0,0 +1,17 @@ +Test Helpers Package +==================== + +Subpackages +----------- + +.. toctree:: + + seed.test_helpers.factory + +Module contents +--------------- + +.. automodule:: seed.test_helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.tests.functional.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.tests.functional.rst.txt new file mode 100644 index 00000000..774c5447 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.tests.functional.rst.txt @@ -0,0 +1,21 @@ +Tests (Functional) Package +========================== + +Submodules +---------- + +Base +---- +.. automodule:: seed.functional.tests.base + :members: + +Page +---- +.. automodule:: seed.functional.tests.page + :members: + +Pages +----- +.. automodule:: seed.functional.tests.pages + :members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.tests.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.tests.rst.txt new file mode 100644 index 00000000..dcbf1b28 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.tests.rst.txt @@ -0,0 +1,80 @@ +Tests Package +============= + +Submodules +---------- + +.. toctree:: + :maxdepth: 2 + + seed.test_helpers + seed.tests.functional + +Admin Views +----------- + +.. automodule:: seed.tests.test_admin_views + :members: + :undoc-members: + :show-inheritance: + +Decorators +---------- + +.. automodule:: seed.tests.test_decorators + :members: + :undoc-members: + :show-inheritance: + +Exporters +--------- + +.. automodule:: seed.tests.test_exporters + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. automodule:: seed.tests.test_models + :members: + :undoc-members: + :show-inheritance: + +Tasks +----- + +.. automodule:: seed.tests.test_tasks + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.tests.test_views + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: seed.tests.tests + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: seed.tests.functional + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: seed.tests.util + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.urls.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.urls.rst.txt new file mode 100644 index 00000000..ab11d6be --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.urls.rst.txt @@ -0,0 +1,29 @@ +URLs Package +============ + +Submodules +---------- + +Accounts +-------- + +.. automodule:: seed.urls.accounts + :members: + :undoc-members: + :show-inheritance: + +APIs +---- + +.. automodule:: seed.urls.api + :members: + :undoc-members: + :show-inheritance: + +Main +---- + +.. automodule:: seed.urls.main + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.utils.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.utils.rst.txt new file mode 100644 index 00000000..27fd9b6c --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.utils.rst.txt @@ -0,0 +1,37 @@ +Utilities Package +================= + +Submodules +---------- + +APIs +---- + +.. automodule:: seed.utils.api + :members: + :undoc-members: + :show-inheritance: + +Buildings +--------- + +.. automodule:: seed.utils.buildings + :members: + :undoc-members: + :show-inheritance: + +Organizations +------------- + +.. automodule:: seed.utils.organizations + :members: + :undoc-members: + :show-inheritance: + +Time +---- + +.. automodule:: seed.utils.time + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.views.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.views.rst.txt new file mode 100644 index 00000000..195e1ed6 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/modules/seed.views.rst.txt @@ -0,0 +1,49 @@ +Views Package +============= + +Submodules +---------- + +Accounts +-------------------------- + +.. automodule:: seed.views.accounts + :members: + :undoc-members: + :show-inheritance: + :noindex: + +APIs +---- + +.. automodule:: seed.views.api + :members: + :undoc-members: + :show-inheritance: + :noindex: + +Main +---- + +.. automodule:: seed.views.main + :members: + :undoc-members: + :show-inheritance: + :noindex: + +Meters +------ + +.. automodule:: seed.views.meters + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.views + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/setup_docker.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/setup_docker.rst.txt new file mode 100644 index 00000000..3f020794 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/setup_docker.rst.txt @@ -0,0 +1,149 @@ +Installation using Docker +========================= + +Docker works natively on Linux, Mac OSX, and Windows 10. If you are using an older version of +Windows (and some older versions of Mac OSX), you will need to install Docker Toolbox. + +Choose either `Docker Native (Windows/OSX)`_ or `Docker Native (Ubuntu)`_ to +install Docker. + +Docker Native (Ubuntu) +---------------------- + +Follow instructions `here `_. + +* `Install Docker Compose `_ + + +Docker Native (Windows/OSX) +--------------------------- + +Following instructions `for Mac `_ or +`for Windows `_. Note that for OSX you must have docker desktop version `3.0 or later `. + +* `Install Docker Compose `_ + + +Building and Running Containers for Non-Development +------------------------------------------------------- + +* Run Docker Compose + + .. code-block:: bash + + docker compose build + + `Be Patient`_ ... If the containers build successfully, then start the containers + + .. code-block:: bash + + docker volume create --name=seed_pgdata + docker volume create --name=seed_media + docker compose up + + **Note that you may need to build the containers a couple times for everything to converge** + +* Login to container + + The docker-compose file creates a default user and password. Below are the defaults but can + be overridden by setting environment variables. + + .. code-block:: bash + + username: user@seed-platform.org + password: super-secret-password + + +.. note:: + + Don't forget that you need to reset your default username and password if you are going + to use these Docker images in production mode! + +Using Docker for Development +---------------------------- + +The development environment is configured for live reloading (i.e., restart webserver when files change) +and debugging. It builds off the base docker-compose.yml, so it's necessary +to specify the files being used in docker-compose commands as seen below. + +Build +^^^^^ + +.. code-block:: bash + + # create volumes for the database and media directory + docker volume create --name=seed_pgdata + docker volume create --name=seed_media + + # build the images + docker compose -f docker-compose.yml -f docker-compose.dev.yml build + +Running the Server +^^^^^^^^^^^^^^^^^^ + +NOTE: the server config is sourced from config.settings.docker_dev, which will include +your local_untracked.py if it exists. If you have a local_untracked.py, make sure it doesn't +overwrite the database or celery configuration! + +.. code-block:: bash + + docker compose -f docker-compose.yml -f docker-compose.dev.yml up + +If the server doesn't start successfully, and :code:`docker compose logs` doesn't help, +the django development server probably failed to start due to an error in your config or code. +Unfortunately docker/django logging doesn't appear to work when the container is first started. +Just try running the server yourself with docker exec, and see what the output is. + +The development docker-compose file has some configurable parameters for specifying volumes to use: + +- SEED_DB_VOLUME: the name of the docker volume to mount for postgres +- SEED_MEDIA_VOLUME: the name of the docker volume to mount for the seed media folder + +Docker will use environment variables from the shell or from a .env file to set these values. + +This is useful if you want to switch between different databases for testing. +For example, if you want to create a separate volume for storing a production backup, you could do the following + +.. code-block:: bash + + docker volume create --name=seed_pgdata_prod + SEED_DB_VOLUME=seed_pgdata_prod docker compose -f docker-compose.yml -f docker-compose.dev.yml up + +NOTE: you'll need to run :code:`docker compose down` to remove the containers before you +can restart the containers connecting to different volumes. + +Running Tests +^^^^^^^^^^^^^ + +While the containers are running (i.e., after running the docker compose up command), use docker exec to run tests in the web container: + +.. code-block:: bash + + docker exec -it seed_web ./manage.py test --settings config.settings.docker_dev + +Add the setting :code:`--nocapture` in order to see :code:`stdout` while running tests. You will need to do this in order to make use of debugging as described below or the output to your debug commands will not display until after the break point has passed and the tests are finished. + +Also worth noting: output from logging (_log.debug, etc) will not display in any situation unless a test fails. + +Debugging +^^^^^^^^^ + +To use pdb on the server, the web container has `remote-pdb `_ installed. +In your code, insert the following + +.. code-block:: bash + + import remote_pdb; remote_pdb.set_trace() + +Once the breakpoint is triggered, you should see the web container log something like "RemotePdb session open at 127.0.0.1:41653, waiting for connection ...". +To connect to the remote session, run netcat from inside the container (using the appropriate port). + +.. code-block:: bash + + docker exec -it seed_web nc 127.0.0.1:41653 + +.. _MacPorts: https://www.macports.org/ +.. _Homebrew: http://brew.sh/ +.. _npm: https://www.npmjs.com/ +.. _nodejs.org: http://nodejs.org/ +.. _Be Patient: https://www.youtube.com/watch?v=f4hkPn0Un_Q diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/setup_osx.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/setup_osx.rst.txt new file mode 100644 index 00000000..9bc64be9 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/setup_osx.rst.txt @@ -0,0 +1,383 @@ +Installation on OSX +=================== + +.. _virtualenv: https://virtualenv.pypa.io/en/latest/ +.. _pyenv: https://github.com/pyenv/pyenv +.. _virtualenvwrapper: https://virtualenvwrapper.readthedocs.io/en/latest/ +.. _MacPorts: https://www.macports.org/ +.. _Homebrew: http://brew.sh/ +.. _npm: https://www.npmjs.com/ +.. _nodejs.org: http://nodejs.org/ + +These instructions are for installing and running SEED on Mac OSX in +development mode. + +Quick Installation Instructions +------------------------------- + +This section is intended for developers who may already have their machine +ready for general development. If this is not the case, skip to Prerequisites. Note that SEED uses python 3. + +* install Postgres 11.1 and redis for cache and message broker +* install PostGIS 2.5 and enable it on the database using `CREATE EXTENSION postgis;` +* install TimescaleDB 1.5.0 +* use a virtualenv (if desired) +* `git clone git@github.com:seed-platform/seed.git` +* create a `local_untracked.py` in the `config/settings` folder and add CACHE and DB config (example `local_untracked.py.dist`) +* to enable geocoding, get MapQuest API key and attach it to your organization +* `export DJANGO_SETTINGS_MODULE=config.settings.dev` in all terminals used by SEED (celery terminal and runserver terminal) +* `pip install -r requirements/local.txt` + * for condas python, you way need to run this command to get pip install to succeed: `conda install -c conda-forge python-crfsuite` +* npm install +* `./manage.py migrate` +* `./manage.py create_default_user` +* `./manage.py runserver` +* `DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 4 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler` +* navigate to `http://127.0.0.1:8000/app/#/profile/admin` in your browser to add users to organizations +* main app runs at `127.0.0.1:8000/app` + +The `python manage.py create_default_user` will setup a default `superuser` +which must be used to access the system the first time. The management command +can also create other superusers. + +.. code-block:: console + + ./manage.py create_default_user --username=demo@seed-platform.org --organization=lbl --password=demo123 + + +Prerequisites +------------- + +These instructions assume you have MacPorts_ or Homebrew_. Your system +should have the following dependencies already installed: + +* git (`port install git` or `brew install git`) +* graphviz (`brew install graphviz`) +* pyenv_ (Recommended) + + .. note:: + + Although you *could* install Python packages globally, this is the + easiest way to install Python packages. Setting these up first will + help avoid polluting your base Python installation and make it much + easier to switch between different versions of the code. + + .. code-block:: bash + + brew install pyenv + brew install pyenv-virtualenv + pyenv install + pyenv virtualenv seed + pyenv local seed + + +PostgreSQL 11.1 +--------------- + +MacPorts:: + + sudo su - root + port install postgresql94-server postgresql94 postgresql94-doc + # init db + mkdir -p /opt/local/var/db/postgresql94/defaultdb + chown postgres:postgres /opt/local/var/db/postgresql94/defaultdb + su postgres -c '/opt/local/lib/postgresql94/bin/initdb -D /opt/local/var/db/postgresql94/defaultdb' + + # At this point, you may want to add start/stop scripts or aliases to + # ~/.bashrc or your virtualenv ``postactivate`` script + # (in ``~/.virtualenvs/{env-name}/bin/postactivate``). + + alias pg_start='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \ + -D /opt/local/var/db/postgresql94/defaultdb \ + -l /opt/local/var/db/postgresql94/defaultdb/postgresql.log start"' + alias pg_stop='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \ + -D /opt/local/var/db/postgresql94/defaultdb stop"' + + pg_start + + sudo su - postgres + PATH=$PATH:/opt/local/lib/postgresql94/bin/ + +Homebrew:: + + brew install postgres + # follow the post install instructions to add to launchagents or call + # manually with `postgres -D /usr/local/var/postgres` + # Skip the remaining Postgres instructions! + + + +Configure PostgreSQL. Replace 'seeddb', 'seeduser' with desired db/user. By +default use password `seedpass` when prompted. Use the code block below in development only since +the seeduser is a SUPERUSER. + +.. code-block:: bash + + createuser -P seeduser + createdb `whoami` + psql -c 'CREATE DATABASE "seeddb" WITH OWNER = "seeduser";' + psql -c 'GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO seeduser;' + psql -c 'ALTER ROLE seeduser SUPERUSER;' + + + +PostGIS 2.5 +----------- + +MacPorts:: + + # Assuming you're still root from installing PostgreSQL, + port install postgis2 + + + +Homebrew:: + + brew install postgis + + + +Configure PostGIS:: + + psql -d seeddb -c "CREATE EXTENSION postgis;" + + # For testing, give seed user superuser access: + # psql -c 'ALTER USER seeduser CREATEDB;' + + +If upgrading from an existing database or existing local_untracked.py file, make sure to add the +MapQuest API Key and set the database engine to 'ENGINE': 'django.contrib.gis.db.backends.postgis'. + +Now exit any root environments, becoming just yourself (even though it's not +that easy being green), for the remainder of these instructions. + + +TimescaleDB 1.5.0 +----------------- + +Note, as of version 1.5.0, dumping and restoring databases requires that both the source and target +database have the same version of TimescaleDB. + +Downloading From Source:: + + # Note: Installing from source should only be done + # if you have a Postgres installation not maintained by Homebrew. + # This installation requires C compiler (e.g., gcc or clang) and CMake version 3.4 or greater. + + git clone https://github.com/timescale/timescaledb.git + cd timescaledb + git checkout 1.5.0 + + # Bootstrap the build system + ./bootstrap + + # If OpenSSL can't be found by cmake - run the following instead + # ./bootstrap -DOPENSSL_ROOT_DIR= # e.g., -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl + + # To build the extension + cd build && make + + # To install + make install + + # Find postgresql.conf + # Then uncomment the shared_preload_libraries line changing it to the following + # shared_preload_libraries = 'timescaledb' + psql -d postgres -c "SHOW config_file;" + + # Restart PostgreSQL instance + + + +Python Packages +--------------- + +Run these commands as your normal user id. + +Change to a virtualenv (using virtualenvwrapper) or do the following as a +superuser. A virtualenv is usually better for development. Set the virtualenv +to seed. + +.. code-block:: bash + + workon seed + +Make sure PostgreSQL command line scripts are in your PATH (if using MacPorts) + +.. code-block:: bash + + export PATH=$PATH:/opt/local/lib/postgresql94/bin + +Some packages (uWSGI) may need to find your C compiler. Make sure you have +'gcc' on your system, and then also export this to the `CC` environment +variable: + +.. code-block:: bash + + export CC=gcc + +Install requirements with `pip` + +.. code-block:: bash + + pip install -r requirements/local.txt + +NodeJS/npm +---------- + +Install npm_. You can do this by installing from nodejs.org_, MacPorts, or +Homebrew: + +MacPorts:: + + sudo port install npm + +Homebrew:: + + brew install npm + +Configure Django and Databases +------------------------------ + +In the `config/settings` directory, there must be a file called +`local_untracked.py` that sets up databases and a number of other things. +To create and edit this file, start by copying over the template + +.. code-block:: bash + + cd config/settings + cp local_untracked.py.dist local_untracked.py + +Edit `local_untracked.py`. Open the file you created in your favorite editor. The PostgreSQL config section will look something like this: + +.. code-block:: python + + # postgres DB config + DATABASES = { + 'default': { + 'ENGINE': 'django.contrib.gis.db.backends.postgis', + 'NAME': 'seeddb', + 'USER': 'seeduser', + 'PASSWORD': 'seedpass', + 'HOST': 'localhost', + 'PORT': '5432', + } + } + +You may want to comment out the AWS settings. + +For Redis, edit the `CACHES` and `CELERY_BROKER_URL` values to look like this: + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + +MapQuest API Key +---------------- + +Register for a MapQuest API key: +``_ + +Visit the Manage Keys page: +``_ +Either create a new key or use the key initially provided. +Copy the "Consumer Key" into the target organizations MapQuest API Key field under the organization's settings page or directly within the DB. + +Run Django Migrations +--------------------- + +Change back to the root of the repository. Now run the migration script to set +up the database tables + +.. code-block:: bash + + export DJANGO_SETTINGS_MODULE=config.settings.dev + ./manage.py migrate + +Django Admin User +----------------- + +You need a Django admin (super) user. + +.. code-block:: bash + + ./manage.py create_default_user --username=admin@my.org --organization=seedorg --password=badpass + +Of course, you need to save this user/password somewhere, since this is what +you will use to login to the SEED website. + +If you want to do any API testing (and of course you do!), you will need to +add an API KEY for this user. You can do this in postgresql directly: + +.. code-block:: bash + + psql seeddb seeduser + seeddb=> update landing_seeduser set api_key='DEADBEEF' where id=1; + +The 'secret' key DEADBEEF is hard-coded into the test scripts. + +Install Redis +------------- + +You need to manually install Redis for Celery to work. + +MacPorts:: + + sudo port install redis + +Homebrew:: + + brew install redis + # follow the post install instructions to add to launchagents or + # call manually with `redis-server` + +Install JavaScript Dependencies +------------------------------- + +The JS dependencies are installed using node.js package management (npm). + +.. code-block:: bash + + npm install + +Start the Server +---------------- + +You should put the following statement in ~/.bashrc or add it to the +virtualenv post-activation script (e.g., in +`~/.virtualenvs/seed/bin/postactivate`). + +.. code-block:: bash + + export DJANGO_SETTINGS_MODULE=config.settings.dev + +The combination of Redis, Celery, and Django have been encapsulated in a +single shell script, which examines existing processes and does not start +duplicate instances: + +.. code-block:: bash + + ./bin/start-seed.sh + +When this script is done, the Django stand-alone server will be running in +the foreground. + +Login +----- + +Open your browser and navigate to http://127.0.0.1:8000 + +Login with the user/password you created before, e.g., `admin@my.org` and +`badpass`. + +.. note:: + + these steps have been combined into a script called `start-seed.sh`. + The script will also not start Celery or Redis if they already seem + to be running. diff --git a/docs/code_documentation/3.0.0-beta.0/_sources/translation.rst.txt b/docs/code_documentation/3.0.0-beta.0/_sources/translation.rst.txt new file mode 100644 index 00000000..b40ae388 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_sources/translation.rst.txt @@ -0,0 +1,88 @@ +Translating SEED +================ + +1. Update translations on `lokalise`_. + +2. Copy lokalise.yml.example to lokalise.yml. Update API token. + +3. Install lokalise locally + + .. code:: bash + + brew tap lokalise/cli-2 + brew install lokalise2 + +3. Run scripts if you have Lokalise CLI installed. If not, see scripts for manual steps. + + .. code:: bash + + script/get_python_translations.sh + script/get_angular_translations.sh + +4. Uncomment the ``useMissingTranslationHandlerLog`` line seed.js to log untranslated strings to the console for review + +5. Verify and commit changes + +**Note: The lokalize website is the canonical source of data. If you +change the locale files locally, then you need to push them to +lokalize.** + +TL;DR + +SEED is localized for more than just English, so a little more care is +needed as we add new UI. All translatable strings are held in either +per-language ``.json`` files (for Angular-controlled strings, which are +the majority), or ``.mo`` files (for strings supplied by Django). + +At render time, SEED will sniff out the browser's ``Accept:`` header. +Based on that, we choose the right file. The language files themselves +are key->value mappings from a translation "key" to a translated value. +Either Angular or Django will then swap that value into the DOM wherever +it sees the key. If no translation is available, the key remains in the +DOM. (There are some wrinkles with HTML styling and pluralization that +we'll review below). + +So, the basic flow on top of any new UI features is now: + +1. Tag any user-visible strings in the UI as "translatable." There are + currently 12 (!) ways in which to do this; see below. +2. Create the translation key at `lokalise`_. We're using lokalise + because it can smooth over differences in the file formats that + Angular and Django require, and is a nice tool for managing the + process of getting translations done by a native speaker: we can put + up screenshots to clarify how the translated phrase is used, track + translation progress, etc. +3. Get a translation done. As a placeholder, lokalise can provide an + auto-filled translation from Google Translate or a few other + services, but it's fairly straightforward to order a professional + translation through lokalise. +4. Pull new translation files into the right places in the source tree + and commit them. There are scripts under ``/scripts`` to make this + mostly automatic. +5. Visually check that the containing UI looks OK with the translated + string(s). Some languages (e.g., French, German) can be wordy relative + to English and cause UI elements like buttons to expand oddly. Adjust + the layout or adjust the translation as needed. + +.. _general-philosophies--style: + +General philosophies / style +---------------------------- + +Don't go crazy with indirection and interpolation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +It's probably better to err on the side of too many keys than to get +clever with interpolation or Angular expressions to avoid +near-duplicates of keys. The aim should be that there is at least one +place where a competent translator can see the whole string at once. + +Compare: + +:: + +

{$:: inventory_type == 'taxlots' ? + translations['INCLUDE_SHARED_TAXLOTS'] : + translations['INCLUDE_SHARED'] + +.. _lokalise: https://lokalise.com/project/3537487659ca9b1dce98a7.36378626/?view=multi diff --git a/docs/code_documentation/3.0.0-beta.0/_static/_sphinx_javascript_frameworks_compat.js b/docs/code_documentation/3.0.0-beta.0/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/docs/code_documentation/3.0.0-beta.0/_static/basic.css b/docs/code_documentation/3.0.0-beta.0/_static/basic.css new file mode 100644 index 00000000..30fee9d0 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/badge_only.css b/docs/code_documentation/3.0.0-beta.0/_static/css/badge_only.css new file mode 100644 index 00000000..c718cee4 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/Roboto-Slab-Bold.woff b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/Roboto-Slab-Bold.woff2 b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/Roboto-Slab-Regular.woff b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/Roboto-Slab-Regular.woff2 b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/fontawesome-webfont.eot b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/fontawesome-webfont.svg b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/fontawesome-webfont.ttf b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/fontawesome-webfont.woff b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/fontawesome-webfont.woff2 b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-bold-italic.woff b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-bold-italic.woff differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-bold-italic.woff2 b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-bold.woff b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-bold.woff differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-bold.woff2 b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-bold.woff2 differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-normal-italic.woff b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-normal-italic.woff differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-normal-italic.woff2 b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-normal.woff b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-normal.woff differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-normal.woff2 b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/css/fonts/lato-normal.woff2 differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/css/theme.css b/docs/code_documentation/3.0.0-beta.0/_static/css/theme.css new file mode 100644 index 00000000..19a446a0 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/_static/doctools.js b/docs/code_documentation/3.0.0-beta.0/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs/code_documentation/3.0.0-beta.0/_static/documentation_options.js b/docs/code_documentation/3.0.0-beta.0/_static/documentation_options.js new file mode 100644 index 00000000..75c840c5 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '3.0.0-beta.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/_static/file.png b/docs/code_documentation/3.0.0-beta.0/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/file.png differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/graphviz.css b/docs/code_documentation/3.0.0-beta.0/_static/graphviz.css new file mode 100644 index 00000000..8d81c02e --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_static/graphviz.css @@ -0,0 +1,19 @@ +/* + * graphviz.css + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- graphviz extension. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +img.graphviz { + border: 0; + max-width: 100%; +} + +object.graphviz { + max-width: 100%; +} diff --git a/docs/code_documentation/3.0.0-beta.0/_static/jquery.js b/docs/code_documentation/3.0.0-beta.0/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/_static/js/html5shiv.min.js b/docs/code_documentation/3.0.0-beta.0/_static/js/html5shiv.min.js new file mode 100644 index 00000000..cd1c674f --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/_static/js/theme.js b/docs/code_documentation/3.0.0-beta.0/_static/js/theme.js new file mode 100644 index 00000000..1fddb6ee --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/docs/code_documentation/3.0.0-beta.0/_static/minus.png b/docs/code_documentation/3.0.0-beta.0/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/minus.png differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/plus.png b/docs/code_documentation/3.0.0-beta.0/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/_static/plus.png differ diff --git a/docs/code_documentation/3.0.0-beta.0/_static/pygments.css b/docs/code_documentation/3.0.0-beta.0/_static/pygments.css new file mode 100644 index 00000000..0d49244e --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/_static/searchtools.js b/docs/code_documentation/3.0.0-beta.0/_static/searchtools.js new file mode 100644 index 00000000..7918c3fa --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/docs/code_documentation/3.0.0-beta.0/_static/sphinx_highlight.js b/docs/code_documentation/3.0.0-beta.0/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/docs/code_documentation/3.0.0-beta.0/api.html b/docs/code_documentation/3.0.0-beta.0/api.html new file mode 100644 index 00000000..6917b42f --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/api.html @@ -0,0 +1,185 @@ + + + + + + + API — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

API

+
+

Authentication

+

Authentication is handled via an encoded authorization token set in a HTTP header. +To request an API token, go to /app/#/profile/developer and click ‘Get a New API Key’.

+

Authenticate every API request with your username (email, all lowercase) and the API key via Basic Auth. +The header is sent in the form of Authorization: Basic <credentials>, where credentials is the base64 encoding of the email and key joined by a single colon :.

+

Using Python, use the requests library:

+
import requests
+
+result = requests.get('https://seed-platform.org/api/version/', auth=(user_email, api_key))
+print result.json()
+
+
+

Using curl, pass the username and API key as follows:

+
curl -u user_email:api_key http://seed-platform.org/api/version/
+
+
+

If authentication fails, the response’s status code will be 302, redirecting the user to /app/login.

+
+
+

Payloads

+

Many requests require a JSON-encoded payload and parameters in the query string of the url. A frequent +requirement is including the organization_id of the org you belong to. For example:

+
curl -u user_email:api_key https://seed-platform.org/api/v2/organizations/12/
+
+
+

Or in a JSON payload:

+
curl -u user_email:api_key \
+  -d '{"organization_id":6, "role": "viewer"}' \
+  https://seed-platform.org/api/v2/users/12/update_role/
+
+
+

Using Python:

+
params = {'organization_id': 6, 'role': 'viewer'}
+result = requests.post('https://seed-platform.org/api/v2/users/12/update_role/',
+                       data=json.dumps(params),
+                       auth=(user_email, api_key))
+print result.json()
+
+
+
+
+

Responses

+

Responses from all requests will be JSON-encoded objects, as specified in each endpoint’s documentation. +In the case of an error, most endpoints will return this instead of the expected payload (or an HTTP status code):

+
{
+    "status": "error",
+    "message": "explanation of the error here"
+}
+
+
+
+
+

API Endpoints

+

A list of interactive endpoints are available by accessing the API menu item on the left navigation +pane within you account on your SEED instance.

+

To view a list of non-interactive endpoints without an account, view swagger on the development server.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/aws.html b/docs/code_documentation/3.0.0-beta.0/aws.html new file mode 100644 index 00000000..a78a77ed --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/aws.html @@ -0,0 +1,275 @@ + + + + + + + AWS Setup — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

AWS Setup

+

Amazon Web Services (AWS) provides the preferred hosting for the SEED Platform.

+

seed is a Django Project and Django’s documentation is an excellent place for general +understanding of this project’s layout.

+
+

Prerequisites

+

Ubuntu server 18.04 LTS

+
+

Note

+

These instructions have not been updated for Ubuntu 18.04. It is recommended to use Docker-based deployments.

+
+
sudo apt-get update
+sudo apt-get upgrade
+sudo apt-get install -y libpq-dev python-dev python-pip libatlas-base-dev \
+gfortran build-essential g++ npm libxml2-dev libxslt1-dev git mercurial \
+libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python
+
+
+

PostgreSQL and Redis are not included in the above commands. For a quick installation on AWS it +is okay to install PostgreSQL and Redis locally on the AWS instance. If a more permanent and +scalable solution, it is recommended to use AWS’s hosted Redis (ElastiCache) and PostgreSQL service.

+
+

Note

+

postgresql >=9.4 is required to support JSON Type

+
+
# To install PostgreSQL and Redis locally
+sudo apt-get install redis-server
+sudo apt-get install postgresql postgresql-contrib
+
+
+
+

Amazon Web Services (AWS) Dependencies

+

The following AWS services can be used for SEED but are not required:

+
    +
  • RDS (PostgreSQL >=9.4)

  • +
  • ElastiCache (redis)

  • +
  • SES

  • +
+
+
+
+

Python Dependencies

+

Clone the SEED repository from github

+
$ git clone git@github.com:SEED-platform/seed.git
+
+
+

enter the repo and install the python dependencies from requirements

+
$ cd seed
+$ sudo pip install -r requirements/aws.txt
+
+
+
+
+

JavaScript Dependencies

+

npm is required to install the JS dependencies.

+
$ sudo apt-get install build-essential
+$ sudo apt-get install curl
+
+
+
$ npm install
+
+
+
+
+

Database Configuration

+

Copy the local_untracked.py.dist file in the config/settings directory to +config/settings/local_untracked.py, and add a DATABASES configuration with your database username, +password, host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database +instance you have manually installed within your infrastructure.

+
# Database
+DATABASES = {
+    'default': {
+        'ENGINE':'django.db.backends.postgresql_psycopg2',
+        'NAME': 'seed',
+        'USER': '',
+        'PASSWORD': '',
+        'HOST': '',
+        'PORT': '',
+    }
+}
+
+
+
+

Note

+

In the above database configuration, seed is the database name, this +is arbitrary and any valid name can be used as long as the database exists.

+
+

create the database within the postgres psql shell:

+
CREATE DATABASE seed;
+
+
+

or from the command line:

+
createdb seed
+
+
+

create the database tables and migrations:

+
python manage.py syncdb
+python manage.py migrate
+
+
+

create a superuser to access the system

+
$ python manage.py create_default_user --username=demo@example.com --organization=example --password=demo123
+
+
+
+

Note

+

Every user must be tied to an organization, visit /app/#/profile/admin +as the superuser to create parent organizations and add users to them.

+
+
+
+

Cache and Message Broker

+

The SEED project relies on redis for both cache and message brokering, and +is available as an AWS ElastiCache service. +local_untracked.py should be updated with the CACHES and CELERY_BROKER_URL +settings.

+
CELERY_BROKER_URL = 'redis://seed-core-cache.ntmprk.0001.usw2.cache.amazonaws.com:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+
+
+
+

Running Celery the Background Task Worker

+

Celery is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, celery +can be started:

+
celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/data_model.html b/docs/code_documentation/3.0.0-beta.0/data_model.html new file mode 100644 index 00000000..b972e75c --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/data_model.html @@ -0,0 +1,606 @@ + + + + + + + Data Model — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Data Model

+_images/case-a.png +_images/case-b.png +_images/case-c.png +_images/case-d.png +_images/data-model.png +
+

Todo

+

Documentation below is out of state and needs updated.

+
+

Our primary data model is based on a tree structure with BuildingSnapshot +instances as nodes of the tree and the tip of the tree referenced by a +CanonicalBuilding.

+

Take the following example: a user has loaded a CSV file containing information +about one building and created the first BuildingSnapshot (BS0). At this point +in time, BS0 is linked to the first CanonicalBuilding (CB0), and CB0 is also +linked to BS0.

+
BS0 <-- CB0
+BS0 --> CB0
+
+
+

These relations are represented in the database as foreign keys from the +BuildingSnapshot table to the CanonicalBuilding table, and from the +CanonicalBuilding table to the BuildingSnapshot table.

+

The tree structure comes to fruition when a building, BS0 in our case, is +matched with a new building, say BS1, enters the system and is auto-matched.

+

Here BS1 entered the system and was matched with BS0. When a match occurs, +a new BuildingSnapshot is created, BS2, with the fields from the existing +BuildingSnapshot, BS0, and the new BuildingSnapshot, BS1, merged +together. If both the existing and new BuildingSnapshot have data for a +given field, the new record’s fields are preferred and merged into the child, B3.

+

The fields from new snapshot are preferred because that is the newer of the +two records from the perspective of the system. By preferring the most recent fields +this allows for evolving building snapshots over time. For example, if an existing +canonical record has a Site EUI value of 75 and some changes happen to a building +that cause this to change to 80 the user can submit a new record with that change.

+

All BuildingSnapshot instances point to a CanonicalBuilding.

+
BS0  BS1
+  \ /
+  BS2 <-- CB0
+
+BS0 --> CB0
+BS1 --> CB0
+BS2 --> CB0
+
+
+
+

parents and children

+

BuildingSnapshots also have linkage to other BuildingSnapshots in order to +keep track of their parents and children. This is represented in the +Django model as a many-to-many relation from BuildingSnapshot to BuildingSnapshot. +It is represented in the PostgreSQL database as an additional seed_buildingsnapshot_children +table.

+

In our case here, BS0 and BS1 would both have children BS2, and BS2 would +have parents BS0 and BS1.

+
+

Note

+

throughout most of the application, the search_buildings endpoint +is used to search or list active building. This is to say, buildings that +are pointed to by an active CanonicalBuilding. +The search_mapping_results endpoint allows the search of buildings +regardless of whether the BuildingSnapshot is pointed to by an active +CanonicalBuilding or not and this search is needed during the mapping +preview and matching sections of the application.

+
+

For illustration purposes let’s suppose BS2 and a new building BS3 match to form a child BS4.

+ + + + + + + + + + + + + + + + + + + + +

parent

child

BS0

BS2

BS1

BS2

BS2

BS4

BS3

BS4

+

And the corresponding tree would look like:

+
BS0  BS1
+  \ /
+  BS2  BS3
+    \  /
+     BS4 <-- CB0
+
+BS0 --> CB0
+BS1 --> CB0
+BS2 --> CB0
+BS3 --> CB0
+BS4 --> CB0
+
+
+
+

matching

+

During the auto-matching process, if a raw BuildingSnapshot matches an +existing BuildingSnapshot instance, then it will point to the existing +BuildingSnapshot instance’s CanonicalBuilding. In the case where there is no +existing BuildingSnapshot to match, a new CanonicalBuilding will be created, as +happened to B0 and C0 above.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

field

BS0

BS1

BS2 (child)

id1

11

11

11

id2

12

12

id3

13

13

id4

14

15

15

+
+
+
+

manual-matching vs auto-matching

+

Since BuildingSnapshots can be manually matched, there is the possibility for +two BuildingSnapshots each with an active CanonicalBuilding to match and the +system has to choose to move only one CanonicalBuilding to the tip of the tree +for the primary BuildingSnapshot and deactivate the secondary +BuildingSnapshot’s CanonicalBuilding.

+

Take for example:

+
BS0  BS1
+  \ /
+  BS2  BS3
+    \  /
+     BS4 <-- CB0 (active: True)         BS5 <-- CB1 (active: True)
+
+
+

If a user decides to manually match BS4 and BS5, the system will take the +primary BuildingSnapshot’s CanonicalBuilding and have it point to their +child and deactivate CB1. The deactivation is handled by setting a field +on the CanonicalBuilding instance, active, from True to False.

+

Here is what the tree would look like after the manual match of BS4 and +BS5:

+
BS0  BS1
+  \ /
+  BS2  BS3
+    \  /
+     BS4  BS5 <-- CB1 (active: False)
+       \  /
+        BS6 <-- CB0 (active: True)
+
+
+

Even though BS5 is pointed to by a CanonicalBuilding, CB1, BS5 will not be +returned by the normal search_buildings endpoint because the +CanonicalBuilding pointing to it has its field active set to False.

+
+

Note

+

anytime a match is unmatched the system will create a new +CanonicalBuilding or set an existing CanonicalBuilding’s active field to +True for any leaf BuildingSnapshot trees.

+
+
+
+

what really happens to the BuildingSnapshot table on import (and when)

+

The above is conceptually what happens but sometimes the devil is in the details. +Here is what happens to the BuildingSnapshot table in the database when records +are imported.

+

Every time a record is added at least two BuildingSnapshot records are created.

+

Consider the following simple record:

+ + + + + + + + + + + + + + + + + +

Property Id

Year Ending

Property Floor Area

Address 1

Release Date

499045

2000

1234

1 fake st

12/12/2000

+

The first thing the user is upload the file. When the user sees the +“Successful Upload!” dialog one record has been added to the +BuildingSnapshot table.

+

This new record has an id (73700 in this case) and a created and +modified timestamp. Then there are a lot of empty fields and a +source_type of 0. Then there is the extra_data column which contains +the contents of the record in key-value form:

+
+
Address 1:
+

“1 fake st”

+
+
Property Id:
+

“499045”

+
+
Year Ending:
+

“2000”

+
+
Release Date:
+

“12/12/2000”

+
+
Property Floor Area:
+

“1234”

+
+
+

And a corresponding extra_data_sources that looks like

+
+
Address 1:
+

73700

+
+
Property Id:
+

73700

+
+
Year Ending:
+

73700

+
+
Release Date:
+

73700

+
+
Property Floor Area:
+

73700

+
+
+

All of the fields that look like _source_id are also populated +with 73700 E.G. owner_postal_code_source_id.

+

The other fields of interest are the organization field which +is populated with the user’s default organization and the import_file_id +field which is populated with a reference to a data_importer_importfile record.

+

At this point the record has been created before the user hits the +“Continue to data mapping” button.

+

The second record (id = 73701) is created by the time the user gets to the screen +with the “Save Mappings” button. This second record has the following fields populated:

+
    +
  • id

  • +
  • created

  • +
  • modified

  • +
  • pm_property_id

  • +
  • year_ending

  • +
  • gross_floor_area

  • +
  • address_line_1

  • +
  • release_date

  • +
  • source_type (this is 2 instead of 0 as with the other record)

  • +
  • import_file_id

  • +
  • organization_id.

  • +
+

That is all. All other fields are empty. In this case that is all that happens.

+

Now consider the same user uploading a new file from the next year that looks like

+ + + + + + + + + + + + + + + + + +

Property Id

Year Ending

Property Floor Area

Address 1

Release Date

499045

2000

1234

1 fake st

12/12/2001

+

As before one new record is created on upload. This has id 73702 and follows the same +pattern as 73700. And similarly 73703 is created like 73701 before the “Save Mappings” +button appears.

+

However this time the system was able to make a match with an existing record. +After the user clicks the “Confirm mappings & start matching” button a new record +is created with ID 73704.

+

73704 is identical to 73703 (in terms of contents of the BuildingSnapshot table only) +with the following exceptions:

+
    +
  • created and modified timestamps are different

  • +
  • match type is populated and has a value of 1

  • +
  • confidence is populated and has a value of .9

  • +
  • source_type is 4 instead of 2

  • +
  • canonical_building_id is populated with a value

  • +
  • import_file_id is NULL

  • +
  • last_modified_by_id is populated with value 2 (This is a key into the landing_seeduser table)

  • +
  • address_line_1_source_id is 73701

  • +
  • gross_floor_area_source_id is populated with value 73701

  • +
  • pm_property_id_source_id is populated with 73701

  • +
  • release_date_source_id is populated with 73701

  • +
  • year_ending_source_id is populated with 73701

  • +
+
+
+

what really happens to the CanonicalBuilding table on import (and when)

+

In addition to the BuildingSnapshot table the CanonicalBuilding table is also updated +during the import process. To summarize the above 5 records were created in the +BuildingSnapshot table:

+
    +
  1. 73700 is created from the raw 2000 data

  2. +
  3. 73701 is the mapped 2000 data,

  4. +
  5. 73702 is created from the raw 2001 data

  6. +
  7. 73703 is the mapped 2001 data

  8. +
  9. 73704 is the result of merging the 2000 and 2001 data.

  10. +
+

In this process CanonicalBuilding is updated twice. First when the 2000 record is imported the +CanonicalBuilding gets populated with one new row at the end of the matching step. +I.E. when the user sees the “Load More Data” screen. At this point there is a new row that looks like

+ + + + + + + + + + + + + +

id

active

canonical_building_id

20505

TRUE

73701

+

At this point there is one new canonical building and that is the BuildingSnapshot with +id 73701. Next the user uploads the 2001 data. When the “Matching Results” screen +appears the CanonicalBuilding table has been updated. Now it looks like

+ + + + + + + + + + + + + +

id

active

canonical_building_id

20505

TRUE

73704

+

There is still only one canonical building but now it is the BuildingSnapshot record +that is the result of merging the 2000 and 2001 data: id = 73704.

+
+
+

organization

+

BuildingSnapshots belong to an Organization field that is a foreign key into the organization +model (orgs_organization in Postgres).

+

Many endpoints filter the buildings based on the organizations the requesting user +belongs to. E.G. get_buildings changes which fields are returned based on the +requesting user’s membership in the BuildingSnapshot’s organization.

+
+
+

*_source_id fields

+

Any field in the BuildingSnapshot table that is populated with data from a +submitted record will have a corresponding _source_id field. E.G +pm_property_id has pm_property_id_source_id, +address_line_1 has address_line_1_source_id, +etc…

+

These are foreign keys into the BuildingSnapshot that is the source of that +value. To extend the above table

+ + + + + + + + + + + + + + + + + + + + + + + +

field

BS0

BS1

BS2 (child)

BS2 (child) _source_id

id1

11

11

BS0

id2

12

12

BS1

+

NOTE: The BuildingSnapshot records made from the raw input file have all the +_source_id fields populated with that record’s ID. The non-canonical BuildingSnapshot +records created from the mapped data have none set. The canonical BuildingSnapshot +records that are the result of merging two records have only the _source_id fields +set where the record itself has data. E.G. in the above address_line_1 is set to +“1 fake st.” so there is a value in the canonical BuildingSnapshot’s address_line_1_source_id +field. However there is no block number so block_number_source_id is empty. This +is unlike the two raw BuildingSnapshot records who also have no block_number but +nevertheless have a block_number_source_id populated.

+
+
+

extra_data

+

The BuildingSnapshot model has many “named” fields. Fields like “address_line_1”, +“year_built”, and “pm_property_id”. However the users are allowed to submit files +with arbitrary fields. Some of those arbitrary fields can be mapped to “named” +fields. E.G. “Street Address” can usually be mapped to “Address Line 1”. +For all the fields that cannot be mapped like that there is the extra_data field.

+

extra_data is Django json field that serves as key-value storage for other +user-submitted fields. As with the other “named” fields there is a corresponding +extra_data_sources field that serves the same role as the other _source_id fields. +E.G. If a BuildingSnapshot has an extra_data field that looks like

+
+
an_unknown_field:
+

1

+
+
something_else:
+

2

+
+
+

It should have an extra_data_sources field that looks like

+
+
an_unknown_field:
+

some_BuildingSnapshot_id

+
+
something_else:
+

another_BuildingSnapshot_id

+
+
+
+
+

saving and possible data loss

+

When saving a Property file some fields that are truncated if too long. +The following are truncated to 255 characters

+
    +
  • jurisdiction_tax_lot_id

  • +
  • pm_property_id

  • +
  • custom_id_1

  • +
  • ubid

  • +
  • lot_number

  • +
  • block_number

  • +
  • district

  • +
  • owner

  • +
  • owner_email

  • +
  • owner_telephone

  • +
  • owner_address

  • +
  • owner_city_state

  • +
  • owner_postal_code

  • +
+

And the following are truncated to 255:

+
    +
  • property_name

  • +
  • address_line_1

  • +
  • address_line_2

  • +
  • city

  • +
  • postal_code

  • +
  • state_province

  • +
  • building_certification

  • +
+

No truncation happens to any of the fields stored in extra_data.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/data_quality.html b/docs/code_documentation/3.0.0-beta.0/data_quality.html new file mode 100644 index 00000000..44f53838 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/data_quality.html @@ -0,0 +1,126 @@ + + + + + + + Data Quality — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Data Quality

+

Data quality checks are run after the data are paired, during import of Properties/TaxLots, or on-demand by selecting rows in the inventory +page and clicking the action button. This checks whether any default or user-defined Rules are broken or satisfied by Property/TaxLot records.

+

Notably, in most cases when data quality checks are run, Labels can be applied for any broken Rules that have a Label. +To elaborate, Rules can have an attached Label. When a data quality check is run, records that break one of these “Labeled Rules” +are then given that Label. The case where this Label attachment does not happen is during import due to performance reasons.

+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/deployment.html b/docs/code_documentation/3.0.0-beta.0/deployment.html new file mode 100644 index 00000000..2f513589 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/deployment.html @@ -0,0 +1,212 @@ + + + + + + + Deployment Guide — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Deployment Guide

+

SEED is intended to be installed on Linux instances in the cloud (e.g., AWS), and on local hardware. SEED Platform does not officially support Windows for production deployment. If this is desired, see the Django notes.

+ +
+

Migrations

+

Migrations are handles through Django; however, various versions have customs actions for the migrations. See the migrations page for more information.

+
+
+

Monitoring

+
+

Sentry

+

Sentry can monitor your webservers for any issues. To enable sentry add the following to +your local_untracked.py files after setting up your Sentry account on sentry.io.

+

The RAVEN_CONFIG is used for the backend and the SENTRY_JS_DSN is used for the frontend. At the moment, +it is recommended to setup two sentry projects, one for backend and one for frontend.

+
import sentry_sdk
+from sentry_sdk.integrations.django import DjangoIntegration
+from sentry_sdk.integrations.celery import CeleryIntegration
+
+sentry_sdk.init(
+    dsn="https://<user>@<key>.ingest.sentry.io/<job>",
+    integrations=[
+        DjangoIntegration(),
+        CeleryIntegration(),
+    ],
+
+    # Set traces_sample_rate to 1.0 to capture 100%
+    # of transactions for performance monitoring.
+    # We recommend adjusting this value in production.
+    traces_sample_rate=1.0,
+
+    # If you wish to associate users to errors (assuming you are using
+    # django.contrib.auth) you may enable sending PII data.
+    send_default_pii=True
+)
+
+SENTRY_JS_DSN = 'https://<key>@sentry.io/<job_id>'
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/developer_resources.html b/docs/code_documentation/3.0.0-beta.0/developer_resources.html new file mode 100644 index 00000000..a86f2c77 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/developer_resources.html @@ -0,0 +1,608 @@ + + + + + + + Developer Resources — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Developer Resources

+ +
+

General Notes

+
+

Pre-commit

+

We use precommit commits for formatting. Set it up locally with

+
pre-commit install
+
+
+
+
+

Ruff Settings

+

Ruff is used to statically verify code syntax. To run ruff locally call:

+
tox -e precommit -- ruff
+tox -e precommit -- ruff-format
+
+
+
+
+

Python Type Hints

+

Python type hints are beginning to be added to the SEED codebase. The benefits are +eliminating some accidental typing mistakes to prevent bugs as well as a better IDE +experience.

+
+

Usage

+

SEED does not require exhaustive type annotations, but it is recommended you add them if you +create any new functions or refactor any existing code where it might be beneficial (e.g. types +that appear ambiguous or that the IDE can’t determine) and not require a ton of additional effort.

+

When applicable, we recommend you use built-in collection types +such as list, dict or tuple instead of the capitalized types +from the typing module. You can also use TypedDict and NotRequired from the typing_extensions +package to specify the types of required/optional keys of dictionaries.

+

Common gotchas:

+
    +
  • If trying to annotate a class method with the class itself, import from __future__ import annotations

  • +
  • If you’re getting warnings about runtime errors due to a type name, make sure your IDE is set up to point to an environment with python 3.9

  • +
  • If you’re wasting time trying to please the type checker, feel free to throw # type: ignore on the problematic line (or at the top of the file to ignore all issues for that file)

  • +
+
+
+

Type Checking

+

CI currently runs static type checking on the codebase using mypy. For +your own IDE, we recommend the following extensions:

+
    +
  • VSCode: Pylance (uses Microsoft’s Pyright type checking)

  • +
+

To run the same typechecking applied in CI (i.e., using mypy) you can run the following

+
tox -e mypy
+
+
+
+
+
+
+

Django Notes

+
+

Adding New Fields to Database

+

Adding new fields to SEED can be complicated since SEED has a mix of typed fields (database fields) and extra data +fields. Follow the steps below to add new fields to the SEED database:

+
    +
  1. Add the field to the PropertyState or the TaxLotState model. Adding fields to the Property or TaxLot models is more complicated and not documented yet.

  2. +
  3. Add field to list in the following locations:

  4. +
+
    +
  • models/columns.py: Column.DATABASE_COLUMNS

  • +
  • TaxLotState.coparent or PropertyState.coparent: SQL query and keep_fields

  • +
+
    +
  1. Run ./manage.py makemigrations

  2. +
  3. Add in a Python script in the new migration to add in the new column into every organizations list of columns. Note that the new_db_fields will be the same as the data in the Column.DATABASE_COLUMNS that were added.

    +
    +
    def forwards(apps, schema_editor):
    +    Column = apps.get_model("seed", "Column")
    +    Organization = apps.get_model("orgs", "Organization")
    +
    +    new_db_fields = [
    +        {
    +            'column_name': 'geocoding_confidence',
    +            'table_name': 'PropertyState',
    +            'display_name': 'Geocoding Confidence',
    +            'column_description': 'Geocoding Confidence',
    +            'data_type': 'number',
    +        }, {
    +            'column_name': 'geocoding_confidence',
    +            'table_name': 'TaxLotState',
    +            'display_name': 'Geocoding Confidence',
    +            'column_description': 'Geocoding Confidence',
    +            'data_type': 'number',
    +        }
    +    ]
    +
    +    # Go through all the organizations
    +    for org in Organization.objects.all():
    +        for new_db_field in new_db_fields:
    +            columns = Column.objects.filter(
    +                organization_id=org.id,
    +                table_name=new_db_field['table_name'],
    +                column_name=new_db_field['column_name'],
    +                is_extra_data=False,
    +            )
    +
    +            if not columns.count():
    +                new_db_field['organization_id'] = org.id
    +                Column.objects.create(**new_db_field)
    +            elif columns.count() == 1:
    +                # If the column exists, then update the display_name and data_type if empty
    +                c = columns.first()
    +                if c.display_name is None or c.display_name == '':
    +                    c.display_name = new_db_field['display_name']
    +                if c.data_type is None or c.data_type == '' or c.data_type == 'None':
    +                    c.data_type = new_db_field['data_type']
    +                        for col in columns:
    +                # If the column exists, then update the column_description if empty
    +                if c.column_description is None or c.column_description == '':
    +                    c.column_description = new_db_field['column_description']
    +                c.save()
    +            else:
    +                print("  More than one column returned")
    +
    +
    +class Migration(migrations.Migration):
    +    dependencies = [
    +        ('seed', '0090_auto_20180425_1154'),
    +    ]
    +
    +    operations = [
    +        ... existing db migrations ...,
    +        migrations.RunPython(forwards),
    +    ]
    +
    +
    +
    +
  4. +
  5. Run migrations ./manage.py migrate

  6. +
  7. Run unit tests, fix failures. Below is a list of files that need to be fixed (this is not an exhaustive list)

  8. +
+
    +
  • test_mapping_data.py:test_keys

  • +
  • test_columns.py:test_column_retrieve_schema

  • +
  • test_columns.py:test_column_retrieve_db_fields

  • +
+
    +
  1. (Optional) Update example files to include new fields

  2. +
  3. Test import workflow with mapping to new fields

  4. +
+
+
+
+

NGINX Notes

+

Toggle maintenance mode to display a maintenance page and prevent access to all site resources including API endpoints:

+
docker exec seed_web ./docker/maintenance.sh on
+docker exec seed_web ./docker/maintenance.sh off
+
+
+
+
+

AngularJS Integration Notes

+
+

Template Tags

+

Angular and Django both use {{ and }} as variable delimiters, and thus the AngularJS variable delimiters are +renamed {$ and $}.

+
window.BE.apps.seed = angular.module('BE.seed', ['$interpolateProvider', ($interpolateProvider) => {
+  $interpolateProvider.startSymbol('{$');
+  $interpolateProvider.endSymbol('$}');
+}]);
+
+
+
+
+

Django CSRF Token and AJAX Requests

+

For ease of making angular $http requests, we automatically add the CSRF token to all $http requests as +recommended by http://django-angular.readthedocs.io/en/latest/integration.html#xmlhttprequest

+
window.BE.apps.seed.run(($http, $cookies) => {
+  $http.defaults.headers.common['X-CSRFToken'] = $cookies['csrftoken'];
+});
+
+
+
+
+

Routes and Partials or Views

+

Routes in static/seed/js/seed.js (the normal angularjs app.js)

+
SEED_app.config(['stateHelperProvider', '$urlRouterProvider', '$locationProvider', (stateHelperProvider, $urlRouterProvider, $locationProvider) => {
+  stateHelperProvider
+    .state({
+      name: 'home',
+      url: '/',
+      templateUrl: static_url + 'seed/partials/home.html'
+    })
+    .state({
+      name: 'profile',
+      url: '/profile',
+      templateUrl: static_url + 'seed/partials/profile.html',
+      controller: 'profile_controller',
+      resolve: {
+        auth_payload: ['auth_service', '$q', 'user_service', function (auth_service, $q, user_service) {
+          var organization_id = user_service.get_organization().id;
+          return auth_service.is_authorized(organization_id, ['requires_superuser']);
+        }],
+        user_profile_payload: ['user_service', function (user_service) {
+          return user_service.get_user_profile();
+        }]
+      }
+    });
+}]);
+
+
+

HTML partials in static/seed/partials/

+
+
+
+

Logging

+

Information about error logging can be found here - https://docs.djangoproject.com/en/1.7/topics/logging/

+

Below is a standard set of error messages from Django.

+

A logger is configured to have a log level. This log level describes the severity of +the messages that the logger will handle. Python defines the following log levels:

+
DEBUG: Low level system information for debugging purposes
+INFO: General system information
+WARNING: Information describing a minor problem that has occurred.
+ERROR: Information describing a major problem that has occurred.
+CRITICAL: Information describing a critical problem that has occurred.
+
+
+

Each message that is written to the logger is a Log Record. The log record is stored +in the web server & Celery

+
+
+

BEDES Compliance and Managing Columns

+

Columns that do not represent hardcoded fields in the application are represented using +a Django database model defined in the seed.models module. The goal of adding new columns +to the database is to create seed.models.Column records in the database for each column to +import. Currently, the list of Columns is dynamically populated by importing data.

+

There are default mappings for ESPM are located here:

+
+
+
+
+

Resetting the Database

+

This is a brief description of how to drop and re-create the database +for the seed application.

+

The first two commands below are commands distributed with the +Postgres database, and are not part of the SEED application. The third +command below will create the required database tables for SEED and +setup initial data that the application expects (e.g. initial columns for +BEDES). The last command below (spanning multiple lines) will create a +new superuser and organization that you can use to login to the +application, and from there create any other users or organizations +that you require.

+

Below are the commands for resetting the database and creating a new +user:

+
createuser -U seed seeduser
+
+psql -d postgres -U seeduser -c 'DROP DATABASE seed;'
+psql -d postgres -U seeduser -c 'CREATE DATABASE seed;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;'
+
+./manage.py migrate
+./manage.py create_default_user \
+    --username=demo@seed-platform.org \
+    --password=password \
+    --organization=testorg
+
+
+
+
+

Restoring a Database Dump

+
psql -d postgres -U seeduser -c 'DROP DATABASE seed;'
+psql -d postgres -U seeduser -c 'CREATE DATABASE seed;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;'
+psql -d seed -U seeduser -c 'SELECT timescaledb_pre_restore();'
+
+# restore a previous database dump (must be pg_restore 12+)
+pg_restore -d seed -U seeduser /backups/prod-backups/prod_20191203_000002.dump
+# if any errors appear during the pg_restore process check that the `installed_version` of the timescaledb extension where the database was dumped matches the extension version where it's being restored
+# `SELECT default_version, installed_version FROM pg_available_extensions WHERE name = 'timescaledb';`
+
+psql -d seed -U seeduser -c 'SELECT timescaledb_post_restore();'
+
+./manage.py migrate
+
+# if needed add a user to the database
+./manage.py create_default_user \
+    --username=demo@seed-platform.org \
+    --password=password \
+    --organization=testorg
+
+
+

If restoring a production backup to a different deployment update the site settings for password reset emails, and disable celerybeat Salesforce updates/emails:

+
./manage.py shell
+
+from django.contrib.sites.models import Site
+site = Site.objects.first()
+site.domain = 'dev1.seed-platform.org'
+site.name = 'SEED Dev1'
+site.save()
+
+from seed.models import Organization
+Organization.objects.filter(salesforce_enabled=True).update(salesforce_enabled=False)
+
+from django_celery_beat.models import PeriodicTask, PeriodicTasks
+PeriodicTask.objects.filter(enabled=True, name__startswith='salesforce_sync_org-').update(enabled=False)
+PeriodicTasks.update_changed()
+
+
+
+
+

Migrating the Database

+

Migrations are handles through Django; however, various versions have customs actions for the migrations. See the migrations page for more information based on the version of SEED.

+
+
+

Testing

+

JS tests can be run with Jasmine at the url /angular_js_tests/.

+

Python unit tests are run with

+
python manage.py test --settings=config.settings.test
+
+
+
+
Note on geocode-related testing:

Most of these tests use VCR.py and cassettes to capture and reuse recordings of HTTP requests and responses. Given that, unless you want to make changes and/or refresh the cassettes/recordings, there isn’t anything needed to run the geocode tests.

+

In the case that the geocoding logic/code is changed or you’d like to the verify the MapQuest API is still working as expected, you’ll need to run the tests with a small change. Namely, you’ll want to provide the tests with an API key via an environment variable called “TESTING_MAPQUEST_API_KEY” or within your local_untracked.py file with that same variable name.

+

In order to refresh the actual cassettes, you’ll just need to delete or move the old ones which can be found at “.seed/tests/data/vcr_cassettes”. The API key should be hidden within the cassettes, so these new cassettes can and should be pushed to GitHub.

+
+
+

Run coverage using

+
coverage run manage.py test --settings=config.settings.test
+coverage report --fail-under=83
+
+
+

Python compliance uses Ruff

+
tox -e precommit -- ruff
+tox -e precommit -- ruff-format
+
+
+

JavaScript compliance uses ESLint, SCSS compliance uses StyleLint, and HTML compliance uses Prettier

+
npm run lint
+npm run lint:fix
+
+
+
+
+

Building Documentation

+

Older versions of the source code documentation are (still) on readthedocs; however, newer versions are built and pushed to the seed-website repository manually. To build the documentation follow the script below:

+
cd docs
+rm -rf htmlout
+sphinx-build -b html source htmlout
+
+
+

For releasing, copy the htmlout directory into the seed-platform’s website repository under docs/code_documentation/<new_version>. Make sure to add the new documentation to the table in the docs/developer_resources.md.

+
+
+

Contribution Instructions / Best Practices

+

If this is the first time contributing and you are outside of the DOE National Lab system, then you will need to review and fill out the contribution agreement which is found in SEED’s Contribution Agreement in the GitHub repository

+

The desired workflow for development and submitting changes is the following:

+
    +
  1. Fork the repository on GitHub if you do not have access to the repository, otherwise, work within the https://github.com/seed-platform/seed repository.

  2. +
  3. Ensure there is a ticket/issue created for the work you are doing. Verify that the ticket is assigned to you and that it is part of the latest project board on the GitHub site (https://github.com/orgs/SEED-platform/projects).

  4. +
  5. Move the ticket/issue to ‘In Progress’ in the GitHub project tracker when you begin work

  6. +
  7. Create a branch off of develop (unless it is a hotfix, then branch of the appropriate tag). The recommended naming convention is <issue_id>-short-descriptive-name.

  8. +
  9. Make changes and write a test for the code added.

  10. +
  11. Make sure tests pass locally. Most branches created and pushed to GitHub will be tested automatically.

  12. +
  13. Upon completion of the work, create a pull request (PR) against the develop branch (or hotfix branch if applicable). In the PR description fill out the requested information and include the issue number (e.g., #1234).

  14. +
  15. +
    Assign one label to the PR (not the ticket/issue) in order to auto-populate change logs (e.g., Bug, Feature, Maintenance, Performance, DoNotPublish) This is required and CI will fail if not present.
      +
    • Bug (these will appear as “Bug Fixes” in the change log)

    • +
    • Feature (features will appear as “New Features” item in the change log)

    • +
    • Enhancement (these will appear as “Improvements” in the change log)

    • +
    • Maintenance (these will appear under “Maintenance” in the change log)

    • +
    • Performance (these will appear under “Maintenance” in the change log)

    • +
    • Documentation (these will appear under “Maintenance” in the change log)

    • +
    • Do not publish (these will no appear in the change log)

    • +
    +
    +
    +
  16. +
  17. Ensure all tests pass.

  18. +
  19. Assign a reviewer to the PR.

  20. +
  21. If the reviewer requests changes, then addresses changes and re-assign the reviewer as needed.

  22. +
  23. Once approved, merge the PR!

  24. +
  25. Move the related ticket(s)/issue(s) to the ‘Ready to Deploy’ column in the GitHub project tracker.

  26. +
+
+
+

Release Instructions

+

To make a release do the following:

+
    +
  1. Create a branch from develop to prepare the updates (e.g., 2.21.0-release-prep).

  2. +
  3. Update the root package.json file with the release version number, and then run npm install. Always use MAJOR.MINOR.RELEASE.

  4. +
  5. Update the docs/sources/migrations.rst file with any required actions.

  6. +
  7. Commit the changes and push the release prep branch to GitHub, then go to the Releases page to draft a new release which will generate the changelog.

  8. +
  9. Copy the GitHub changelog results into CHANGELOG.md. Cleanup the formatting and items as needed (make sure the spelling is correct, starts with a capital letter, if any PRs were missing the Do not publish label, etc.) and push the changelog update.

  10. +
  11. Make sure that any new UI needing localization has been tagged for translation, and that any new translation keys exist in the lokalise.com project. (see translation documentation).

  12. +
  13. Create PR for release preparation and merge after tests/reviews pass.

  14. +
  15. Create a new Release using the develop branch and new release number as the tag (https://github.com/SEED-platform/seed/releases). Include list of changes since previous release (e.g., the additions to CHANGELOG.md).

  16. +
  17. Locally, merge the develop branch into the main branch and push.

  18. +
  19. Verify that the Docker versions are built and pushed to Docker Hub (https://hub.docker.com/r/seedplatform/seed/tags/).

  20. +
  21. Publish the new documentation in the seed-platform website repository (see instructions above under Building Documentation).

  22. +
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/docker.html b/docs/code_documentation/3.0.0-beta.0/docker.html new file mode 100644 index 00000000..207922dd --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/docker.html @@ -0,0 +1,246 @@ + + + + + + + Docker Deployment on AWS — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Docker Deployment on AWS

+

Amazon Web Services (AWS) provides the preferred hosting for the SEED Platform.

+

seed is a Django Project and Django’s documentation is an excellent place for general +understanding of this project’s layout.

+
+

Installation

+

Ubuntu server 18.04 or newer with a m5ad.xlarge (if using in Production instance)

+
    +
  • After launching the instance, run the following commands to install docker.

  • +
+
# Install any upgrades
+sudo apt-get update
+sudo apt-get upgrade -y
+
+# Remove any old docker engines
+sudo apt-get remove docker docker-engine docker.io containerd runc
+
+# Install docker community edition
+sudo apt-get update
+sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
+curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
+sudo add-apt-repository \
+    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
+    $(lsb_release -cs) \
+    stable"
+
+sudo apt-get update
+sudo apt-get install -y docker-ce docker-ce-cli containerd.io
+# Add your user to the docker group
+sudo groupadd docker
+sudo usermod -aG docker $USER
+newgrp docker
+
+
+
+

Note

+

It is okay if the first command fails

+
+
    +
  • Verify that the DNS is working correctly. Run the following and verify the response lists IPs (v6 most likely)

  • +
+
# verify that the dns resolves
+docker run --rm seedplatform/seed getent hosts seed-platform.org
+# or
+docker run --rm tutum/dnsutils nslookup email.us-west-2.amazonaws.com
+
+
+
    +
  • Install Docker compose

  • +
+
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
+sudo chmod +x /usr/local/bin/docker-compose
+
+
+
    +
  • Checkout SEED (or install from the releases).

  • +
+
git clone
+
+
+
    +
  • Add in the Server setting into profile.d. For example add the content below (appropriately filled out) into /etc/profile.d/seed.sh

  • +
+
export POSTGRES_USER=seed
+export POSTGRES_DB=seed
+export POSTGRES_PASSWORD=GDEus3fasd1askj89QkAldjfX
+export POSTGRES_PORT=5432
+export SECRET_KEY="96=7jg%_&1-z9c9qwwu2@w$hb3r322yf3lz@*ekw-1@ly-%+^"
+
+# The admin user is only valid only until the database is restored
+export SEED_ADMIN_USER=user@seed-platform.org
+export SEED_ADMIN_PASSWORD="7FeBWal38*&k3jlfa92lakj8ih4"
+export SEED_ADMIN_ORG=default
+
+# For SES
+export AWS_ACCESS_KEY_ID=<AWS_ACCESS_KEY>
+export AWS_SECRET_ACCESS_KEY=<AWS_SECRET_KEY>
+export AWS_SES_REGION_NAME=us-west-2
+export AWS_SES_REGION_ENDPOINT=email.us-west-2.amazonaws.com
+export SERVER_EMAIL=user@seed-platform.org
+
+
+
    +
  • Before launching the first time, make sure the persistent volumes and the backup directory exist.

  • +
+
docker volume create --name=seed_pgdata
+docker volume create --name=seed_media
+
+mkdir -p $HOME/seed-backups
+
+
+
+

Note

+

Make sure to have the seed-backups in your path, otherwise the db-postgres container will not launch.

+
+
    +
  • Launch the project

  • +
+
cd <checkout dir>
+./deploy.sh
+
+
+
+
+

Deploying with Docker

+

The preferred way to deploy with Docker is using docker swarm and docker stack. +Look at the deploy.sh script for implementation details.

+

The short version is to simply run the command below. Note that the passing of the docker-compose.yml filename is not required if using docker-compose.local.yml.

+

`bash +./deploy.sh docker-compose.local.yml +`

+

If deploying using a custom docker-compose yml file, then simple replace the name in the command above.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/faq.html b/docs/code_documentation/3.0.0-beta.0/faq.html new file mode 100644 index 00000000..7e59037a --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/faq.html @@ -0,0 +1,190 @@ + + + + + + + Frequently Asked Questions — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Frequently Asked Questions

+

Here are some frequently asked questions and/or issues.

+ +
+

Questions

+
+

What is the SEED Platform?

+

The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity.

+

The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL.

+

The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions.

+

Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy.

+
+
+
+

Issues

+
+

Why is the domain set to example.com?

+

If you see example.com in the emails that are sent from your hosted version of SEED then you will +need to update your django sites object in the database.

+
$ ./manage.py shell
+
+from django.contrib.sites.models import Site
+one = Site.objects.all()[0]
+one.domain = 'newdomain.org'
+one.name = 'SEED'
+one.save()
+
+
+
+
+

Why aren’t the static assets being served correctly?

+

Make sure that your local_untracked.py file does not have STATICFILES_STORAGE set to anything. If so, +then comment out that section and redeploy/recollect/compress your static assets.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/genindex.html b/docs/code_documentation/3.0.0-beta.0/genindex.html new file mode 100644 index 00000000..4d1230a4 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/genindex.html @@ -0,0 +1,2822 @@ + + + + + + Index — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | J + | K + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | U + | V + | W + | X + | Y + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

J

+ + + +
+ +

K

+ + + +
+ +

L

+ + + +
+ +

M

+ + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

Q

+ + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + + +
+ +

X

+ + +
+ +

Y

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/getting_started.html b/docs/code_documentation/3.0.0-beta.0/getting_started.html new file mode 100644 index 00000000..c4286a25 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/getting_started.html @@ -0,0 +1,160 @@ + + + + + + + Getting Started — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/help.html b/docs/code_documentation/3.0.0-beta.0/help.html new file mode 100644 index 00000000..88697465 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/help.html @@ -0,0 +1,141 @@ + + + + + + + Help — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Help

+
+

For SEED Platform Users

+

Please visit our website for information, tutorials, and documentation to help you learn how to use SEED.

+

https://seed-platform.org

+

The SEED Users Forum is where you can review user announcements, workflow questions, and join to connect with other users.

+

https://lists.buildingenergytools.org/g/SEEDusers/topics

+

For general inquiries or help on a specific problem, please fill out a request on the building data tools website help desk and select SEED as the relevant tool:

+

https://buildingdata.energy.gov/#/help-desk

+
+
+

For SEED Platform Developers

+

The open-source code is available on the GitHub organization SEED-Platform and contains various repositories for the different components of the platform such as the main SEED application, a Python SEED client to communicate to SEED’s API and various example datasets.

+

https://github.com/SEED-platform

+

The SEED Developers Forum contains various topics and joining enables you to connect with other developers. It is recommended to join this forum to submit developer questions, features requests, and report issues as needed. Also, submitting issues on GitHub is encouraged.

+

https://lists.buildingenergytools.org/g/SEEDdevelopers/topics

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/index.html b/docs/code_documentation/3.0.0-beta.0/index.html new file mode 100644 index 00000000..35dd5d2a --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/index.html @@ -0,0 +1,244 @@ + + + + + + + Standard Energy Efficiency Data (SEED) Platform — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Standard Energy Efficiency Data (SEED) Platform

+

The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity.

+

The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL.

+

The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions.

+

Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy.

+
+ +
+
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/kubernetes_deployment.html b/docs/code_documentation/3.0.0-beta.0/kubernetes_deployment.html new file mode 100644 index 00000000..9520563d --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/kubernetes_deployment.html @@ -0,0 +1,371 @@ + + + + + + + Kubernetes Deployment Guide with Helm — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Kubernetes Deployment Guide with Helm

+

Kubernetes is a robust container orchestration system for easy application deployment and management. Helm takes that a step further with by packaging up required helm “charts” into one deployment command.

+
+

Setup

+
+

Cluster

+

In order to deploy the SEED platform on a Kubernetes you will need “cluster” which will be configured by your cloud service of choice. Each installation will be slightly different depending on the service. +Below are links to quick-start guides for provisioning a cluster and connecting. These instructions are specifically for AWS, but after the Kubernetes cluster is launched, the helm commands can be used in +the same way.

+
    +
  • Amazon Web Services (AWS)

  • +
  • Google Cloud Platform (GCP)

  • +
  • Azure (AKS)

  • +
+
+

AWS CLI Configuration

+

Download and configure the AWS CLI with instructions: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html

+
aws configure
+AWS Access Key ID [None]: <insert key> (from account)
+AWS Secret Access Key [None]: <insert secret key> (from account)
+Default region name [None]: us-east-1
+Default output format [None]: json
+
+
+
+
+
+

Kubectl

+

Download and install Kubectl:

+
    +
  • Windows

  • +
  • +
    Mac (with Homebrew) brew install kubectl

    ` +brew install kubectl +`

    +
    +
    +
  • +
+

Kubectl is the main function in which you will be interfacing with your deployed application on your cluster. This CLI is what connects you to your cluster that you have just provisioned. +If your cloud service did not have you configure kubectl in your cluster setup, you can download it here. Once kubectl is installed and configured to your cluster +you can run some simple commands to ensure its working properly:

+
#View the cluster
+kubectl cluster-info
+
+#View pods, services and replicasets (will be empty until deploying an app)
+kubectl get all
+
+
+

All of the common kubectl commands can be found in these docs

+
+

Note

+

For those unfamiliar with CLIs, there are a number of GUI applications that are able to deploy on your stack with ease. One of which is Kubernetes native application called Dashboard UI or a third-party application called Octant brew install octant.

+
+
+
+

Helm

+

Helm organizes all of your Kubernetes deployment, service, and volume yml files into “charts” that can be deployed, managed, and published with simple commands. +To install Helm:

+ +
+
+

EKS Control (AWS Specific)

+

EKSCtl is a command line tool to manage Elastic Kubernetes clusters on AWS. If not using AWS, then disregard this section.

+ +

To launch a cluster on using EKSCts, run the following command in the terminal (assuming adequate permissions for the user). Also make sure to replace items in the <> brackets.

+
eksctl create cluster \
+--name <cluster-name> \
+--version 1.21 \
+--region us-east-1 \
+--node-type m5.large \
+--nodes 1 \
+--nodes-min 1 \
+--nodes-max 1 \
+--managed \
+--tags environment=<env-type, e.g., dev, prod>
+
+
+
+
+

Charts

+

SEED stores its charts in the charts directory of the Github Repo. There are two main charts that are deployed when starting SEED on Kubernetes.

+
    +
  • persistentvolumes - these are the volumes to store SEED media data and SEED Postgres data

  • +
  • seed - this stores all of the other deployment and service files for the application

  • +
+

Unlike persistentvolumes, the seed charts must be modified with user environment variables that will be forwarded to the docker container for deployment. +Before deployment, the user MUST set these variables to their desired values.

+

This chart contains the deployment specification for the SEED web container. Replace all the values in <>.

+
# Environment variables for the web container
+- env:
+    # AWS Email service variables to send emails to new users - can be removed if not using this functionality.
+    - name: AWS_ACCESS_KEY_ID
+      value: <access_key_id>
+    - name: AWS_SECRET_ACCESS_KEY
+      value: <secret_access_key>
+    - name: AWS_SES_REGION_NAME
+      value: us-west-2
+    - name: AWS_SES_REGION_ENDPOINT
+      value: email.us-west-2.amazonaws.com
+    - name: SERVER_EMAIL
+      value: info@seed-platform.org
+    # Django Variables
+    - name: DJANGO_SETTINGS_MODULE
+      value: config.settings.docker
+    - name: SECRET_KEY
+      value: <replace-secret-key>
+    - name: SEED_ADMIN_ORG
+      value: default
+    - name: SEED_ADMIN_PASSWORD
+      value: <super-secret-password>
+    - name: SEED_ADMIN_USER
+      value: <user@seed-platform.org>
+    # Postgres variables
+    - name: POSTGRES_DB
+      value: seed
+    - name: POSTGRES_PASSWORD
+      value: <super-secret-password> # must match db-postgres-deployment.yaml and web-celery-deployment.yaml
+    - name: POSTGRES_PORT
+      value: "5432"
+    - name: POSTGRES_USER
+      value: seeduser
+    # Bsyncr analysis variables
+    - name: BSYNCR_SERVER_PORT
+      value: "5000"
+    - name: BSYNCR_SERVER_HOST
+      value: bsyncr
+    # Sentry monitoring - remove if not applicable
+    - name: SENTRY_JS_DSN
+      value: <enter-dsn>
+    - name: SENTRY_RAVEN_DSN
+      value: <enter-dsn>
+    # Google self registration security - remove if not applicable
+    - name: GOOGLE_RECAPTCHA_SITE_KEY
+      value: <reCAPTCHA-site-key>
+    - name: GOOGLE_RECAPTCHA_SECRET_KEY
+      value: <reCAPTCHA-key>
+    image: seedplatform/seed:<insert deployment image version>
+    #versions can be found here https://github.com/SEED-platform/seed/releases/tag/v2.9.3
+
+
+

This chart contains the deployment specification for the Celery container to connect to Postgres. Replace the Postgres password to match web-deployment.

+
- name: POSTGRES_PASSWORD
+  value: <super-secret-password>  # must match db-postgres-deployment.yaml and web-celery-deployment.yaml
+
+
+

This chart contains the deployment specification for the bsyncr analysis server. Request a NOAA token from this website.

+
- name: NOAA_TOKEN
+  value: <token>
+
+
+
+
+
+

Deployment

+

Once you are connected to your cluster and have your settings configured with the environment variables of you choice in the charts, you are ready to deploy the app. +First, make sure that the correct context is selected which is needed if there is more than one cluster:

+
kubectl config get-contexts
+kubectl config use-context <context-name>
+
+
+

Deploy the site using the helm commands in the root of the charts directory.

+
    +
  • helm install --generate-name persistentvolumes

  • +
  • helm install --generate-name seed

  • +
+

You will be able to see SEED coming online with statuses like container creating, and running with:

+
    +
  • kubectl get all

  • +
+

Once all of the pods are running you will be able to hit the external ingress through the URL listed in the web service information. It should look something like

+
service/web           LoadBalancer   10.100.154.227   <my-unique-url>   80:32291/TCP
+
+
+
+
+

Managing Existing Clusters

+
+

Upgrade/Redeploy the Helm Stack

+

To upgrade or dedeploy a helm chart, first find the helm release that you want to upgrade, then run the upgrade with the selected chart.

+
helm list
+helm upgrade <cluster-name> ./seed
+
+
+
+
+

Managing the Kubernetes Cluster (AWS Specific)

+

Enable kubectl to talk to one of the created clusters by running the following command in the terminal after configuring the AWS credentials and cli.

+
aws eks --region <aws-region> update-kubeconfig --name <cluster-name>
+
+
+
+
+

Logging In

+

After a successful deployment in order to login you will need to create yourself as a user in the web container. To do this, we will exec into the container and run some Django commands. +* View all deployments and services, kubectl get all +* kubectl get pods +* kubectl exec -it <pod-id> -- bash

+

Now that we are in the container, we can make a user. +.. code-block:: bash

+
+

./manage.py create_default_user –username=admin@my.org –organization=seedorg –password=badpass

+
+

You can now use these credentials to log in to the SEED website.

+
+
+

Update web and web-celery

+

The command below will restart the pods and re-pull the docker images.

+
kubectl rollout restart deployment web && kubectl rollout restart deployment web-celery
+
+
+
+
+
+

Other Resources

+

Common kubectl actions can be found on the kubernetes website

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/license.html b/docs/code_documentation/3.0.0-beta.0/license.html new file mode 100644 index 00000000..03865e6d --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/license.html @@ -0,0 +1,187 @@ + + + + + + + License — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

License

+

SEED Platform™, Copyright (c) 2017, 2024 Alliance for Sustainable Energy, LLC, and other contributors. +All rights reserved.

+

Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met:

+

(1) Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer.

+

(2) Redistributions in binary form must reproduce the above copyright notice, this list of +conditions and the following disclaimer in the documentation and/or other materials provided +with the distribution.

+

(3) Neither the name of the copyright holder nor the names of its contributors may be used +to endorse or promote products derived from this software without specific prior written +permission.

+

(4) Other than as required in clauses (1) and (2), distributions in any form of modifications +or other derivative works may not use the “SEED Platform” trademark, “Standard Energy +Efficiency Data Platform”, “Standard Energy Efficiency Data”, “SEED”, or any other confusingly +similar designation without specific prior written permission from the U.S. Department of Energy.

+

(5) The name of the copyright holder(s), any contributors, the United States Government, the +United States Department of Energy, or any of their employees may not be used to endorse or +promote products derived from this software without specific prior written permission from the +respective party.

+

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS “AS IS” AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED STATES +DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE.

+

+

This program also includes the following licenses:

+

Copyright (c) 2014 - 2017 The Regents of the University of California, through +Lawrence Berkeley National Laboratory (subject to receipt of any required approvals +from the U.S. Department of Energy) and contributors. All rights reserved.

+
    +
  1. Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met:

    +
    +

    (1) Redistributions of source code must retain the copyright notice, this +list of conditions and the following disclaimer.

    +

    (2) Redistributions in binary form must reproduce the copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution.

    +

    (3) Neither the name of the University of California, Lawrence Berkeley +National Laboratory, U.S. Dept. of Energy nor the names of its +contributors may be used to endorse or promote products derived from this +software without specific prior written permission.

    +

    (4) Neither the names Standard Energy Efficiency Data Platform, Standard +Energy Efficiency Data, SEED Platform, SEED, derivatives thereof nor +designations containing these names, may be used to endorse or promote +products derived from this software without specific prior written +permission from the U.S. Dept. of Energy.

    +
    +
  2. +
  3. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  4. +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/linux.html b/docs/code_documentation/3.0.0-beta.0/linux.html new file mode 100644 index 00000000..9c345a33 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/linux.html @@ -0,0 +1,403 @@ + + + + + + + General Linux Setup — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

General Linux Setup

+

While Amazon Web Services (AWS) provides the preferred hosting for SEED, +running on a bare-bones Linux server follows a similar setup, replacing the +AWS services with their Linux package counterparts, namely: PostgreSQL and +Redis.

+

SEED is a Django project and Django’s documentation +is an excellent place to general understanding of this project’s layout.

+
+

Prerequisites

+

Ubuntu server/desktop 16.04 or newer (18.04 recommended)

+

Install the following base packages to run SEED:

+
sudo add-apt-repository ppa:timescale/timescaledb-ppa
+sudo apt update
+sudo apt upgrade
+sudo apt install libpq-dev python3-dev python3-pip libatlas-base-dev \
+gfortran build-essential nodejs npm libxml2-dev libxslt1-dev git \
+libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python mercurial
+sudo apt install gdal-bin postgis
+sudo apt install redis-server
+sudo apt install timescaledb-postgresql-10 postgresql-contrib
+
+# For running selenium/protractor
+sudo apt install default-jre
+
+
+
+

Note

+

postgresql >=9.3 is required to support JSON Type

+
+
+
+

Configure PostgreSQL

+

Replace ‘seeddb’, ‘seeduser’ with desired db/user. By +default use password seedpass when prompted

+
$ sudo timescaledb-tune
+$ sudo service postgresql restart
+$ sudo su - postgres
+$ createuser -P "seeduser"
+$ createdb "seeddb" --owner="seeduser"
+$ psql
+postgres=# GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO "seeduser";
+postgres=# ALTER USER "seeduser" CREATEDB CREATEROLE SUPERUSER;
+postgres=# \q
+$ exit
+
+
+
+
+

Python Dependencies

+

clone the seed repository from github

+
$ git clone git@github.com:SEED-platform/seed.git
+
+
+

enter the repo and install the python dependencies from requirements

+
$ cd seed
+$ pip3 install -r requirements/local.txt
+
+
+
+
+

JavaScript Dependencies

+
$ npm install
+
+
+
+
+

Django Database Configuration

+

Copy the local_untracked.py.dist file in the config/settings directory to +config/settings/local_untracked.py, and add a DATABASES configuration with your database username, password, +host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database instance +you have manually installed within your infrastructure.

+
# Database
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.contrib.gis.db.backends.postgis',
+        'NAME': 'seeddb',
+        'USER': 'seeduser',
+        'PASSWORD': '<PASSWORD>',
+        'HOST': 'localhost',
+        'PORT': '5432',
+    }
+}
+
+
+
+

Note

+

Other databases could be used such as MySQL, but are not supported +due to the postgres-specific JSON Type

+
+

In in the above database configuration, seed is the database name, this is arbitrary and any valid name can be +used as long as the database exists. Enter the database name, user, password you set above.

+

The database settings can be tested using the Django management command, python3 manage.py dbshell to connect to the +configured database.

+

create the database tables and migrations:

+
$ python3 manage.py migrate
+
+
+
+
+

Cache and Message Broker

+

The SEED project relies on redis for both cache and message brokering, and +is available as an AWS ElastiCache service or with the redis-server +Linux package. (sudo apt install redis-server)

+

local_untracked.py should be updated with the CACHES and CELERY_BROKER_URL +settings.

+
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+
+
+
+

Creating the initial user

+

create a superuser to access the system

+
$ python3 manage.py create_default_user --username=admin@my.org --organization=lbnl --password=badpass
+
+
+
+

Note

+

Of course, you need to save this user/password somewhere, since this is what +you will use to login to the SEED website.

+

Every user must be tied to an organization, visit /app/#/profile/admin +as the superuser to create parent organizations and add users to them.

+
+
+
+

Running celery the background task worker

+

Celery is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, celery +can be started:

+
DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler
+
+
+
+
+

Running the development web server

+

The Django dev server (not for production use) can be a quick and easy way to +get an instance up and running. The dev server runs by default on port 8000 +and can be run on any port. See Django’s runserver documentation for more +options.

+
$ python3 manage.py runserver --settings=config.settings.dev
+
+
+
+
+

Running a production web server

+

Our recommended web server is uwsgi sitting behind nginx. The python package uwsgi is needed for this, and +should install to /usr/local/bin/uwsgi We recommend using dj-static to load static files.

+
+

Note

+

The use of the dev settings file is production ready, and should be +used for non-AWS installs with DEBUG set to False for production use.

+
+
$ pip3 install uwsgi dj-static
+
+
+

Generate static files:

+
$ python3 manage.py collectstatic --settings=config.settings.prod -i package.json -i package-lock.json -i node_modules/openlayers-ext/index.html
+
+
+

Update config/settings/local_untracked.py:

+
DEBUG = False
+# static files
+STATIC_ROOT = 'collected_static'
+STATIC_URL = '/static/'
+
+
+

Start the web server (this also starts celery):

+
$ ./bin/start-seed
+
+
+
+

Warning

+

Note that uwsgi has port set to 80. In a production setting, a dedicated web server such as nginx would be +receiving requests on port 80 and passing requests to uwsgi running on a different port, e.g 8000.

+
+
+
+

Environment Variables

+

The following environment variables can be set within the ~/.bashrc file to +override default Django settings.

+
export SENTRY_DSN=https://xyz@app.getsentry.com/123
+export DEBUG=False
+export ONLY_HTTPS=True
+
+
+
+
+

Mail Services

+
+

AWS SES Service

+

In the AWS setup, we can use SES to provide an email service for Django. The service is +configured in the config/settings/local_untracked.py:

+
EMAIL_BACKEND = 'django_ses.SESBackend'
+
+
+

In general, the following steps are needed to configure SES:

+
    +
  1. Access Amazon SES Console - Quickstart

  2. +
  3. Login to Amazon SES Console. Verify which region we are using (e.g., us-east-1)

  4. +
  5. Decide on email address that will be sending the emails and add them to the SES Verified Emails.

  6. +
  7. Test that SES works as expected (while in the SES sandbox). Note that you will need to add the sender and recipient emails to the verified emails while in the sandbox.

  8. +
  9. Update the local_untracked.py file or set the environment variables for the docker file.

  10. +
  11. Once ready, move the SES instance out of the sandbox. Following instructions here

  12. +
  13. (Optional) Set up Amazon Simple Notification Service (Amazon SNS) to notify you of bounced emails and other issues.

  14. +
  15. (Optional) Use the AWS Management Console to set up Easy DKIM, which is a way to authenticate your emails. Amazon SES console will have the values for SPF and DKIM that you need to put into your DNS.

  16. +
+
+
+

SMTP service

+

Many options for setting up your own SMTP service/server or using other SMTP +third party services are available and compatible including gmail. SMTP is not configured for working within Docker at the moment.

+
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
+
+
+
+
+
+

local_untracked.py

+
# PostgreSQL DB config
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.postgresql_psycopg2',
+        'NAME': 'seed',
+        'USER': 'your-username',
+        'PASSWORD': 'your-password',
+        'HOST': 'your-host',
+        'PORT': 'your-port',
+    }
+}
+
+# config for local storage backend
+DOMAIN_URLCONFS = {'default': 'config.urls'}
+
+CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+# SMTP config
+EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
+
+# static files
+STATIC_ROOT = 'collected_static'
+STATIC_URL = '/static/'
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/mapping.html b/docs/code_documentation/3.0.0-beta.0/mapping.html new file mode 100644 index 00000000..01afc65a --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/mapping.html @@ -0,0 +1,166 @@ + + + + + + + Mapping — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Mapping

+

This document describes the set of calls that occur from the web client or API +down to the back-end for the process of mapping data into SEED.

+

An overview of the process is:

+
    +
  1. Import - A file is uploaded to the server

  2. +
  3. Save - The file is batched saved into the database as JSON data

  4. +
  5. Mapping - Mapping occurs on that file

  6. +
  7. Matching / Merging

  8. +
  9. Pairing

  10. +
+
+

Import

+

From the web UI, the import process invokes seed.views.main.save_raw_data to save the data. When the data is +done uploading, we need to know whether it is a Portfolio Manager file, so we can add metadata to the record in the +database. The end of the upload happens in seed.data_importer.views.DataImportBackend.upload_complete. At this +point, the request object has additional attributes for Portfolio Manager files. These are saved in the model +seed.data_importer.models.ImportFile.

+
+
+

Mapping

+

Once files are uploaded, file header columns need to be mapped to SEED columns. Mappings can be specified/decided manually for any particular file import, +or mapping profiles can be created and subsequently applied to any file imports.

+

When a column mapping profile is applied to an import file, file header columns defined in the profile must match exactly (spaces, lowercase, uppercase, etc.) +in order for the corresponding SEED column information to be used/mapped.

+
+
+

Matching

+
+

Todo

+

document

+
+
+
+

Pairing

+
+

Todo

+

document

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/matching.html b/docs/code_documentation/3.0.0-beta.0/matching.html new file mode 100644 index 00000000..ca7254f7 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/matching.html @@ -0,0 +1,243 @@ + + + + + + + Matching — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Matching

+
+

What is it?

+

Within SEED, matching refers to a possible relationship between at least 2 properties or at least 2 tax lots. +Two properties match if they have the same values for some specified field(s). +These specified fields are referred to as matching criteria, and each SEED organization has its +own set of matching criteria which is customizable by users.

+
+
+

Why does it exist?

+

At a high level, matching is used to identify if two or more property records are actually different +representations of the same property (or tax lots representing one tax lot). For example, within the same cycle, +two matching records, so one persists while the other is used and subsequently discarded to update the persisting record +(say if the building owner’s phone number changed). Or across different cycles, it’s possible that the +two records capture the same property at different times/cycles - this relationship is referred to as a link.

+
+
+

How and when is it used?

+
+

In-Cycle Merging

+

(This is different from manual merging.)

+

For records within the same cycle, there really shouldn’t be more than one +representation of the same property (or tax lot). As much as possible, the program +is set up to prevent this from happening by automatically merging matched +records together whenever they might occur in the same cycle.

+

Specifically, a merge of matches might need to occur after any of the following events:

+
    +
  1. The record has been manually edited.

  2. +
  3. The record was just created as a result of a manual merge (via the ‘Actions’ on the Properties or Tax Lots page).

  4. +
  5. The record has just been imported.

  6. +
+

The actual execution of merges includes a few additional, unrelated steps but, +in the scope of merging, the following occurs.

+

The record in the scenarios listed above is the “target” record. Any and all +matches found, excluding the “target”, are merged together first. If there are +overlapping values, priority is given to more recently updated records.

+

Once these matches (excluding the target) are merged together, the final step is +to merge the “target” record. In all but one case, choosing between overlapping +values gives priority to the “target”. That one case is when a record has just been +imported. Here, overlapping values follow merge protection rules set by +the user for an organization in this final step.

+
+
+

Linking (Across Cycles)

+

For records in different cycles, matches between these are considered links. +Links are used to connect snapshots of the same record year-over-year (at different time periods). +This allows for the analysis of how the record has changed over time.

+

In the case of properties, these links are used to associate meters to properties. +This means that adding meters to a property in one cycle will make those meters +accessible to that same property’s instance in all other cycles.

+

This association can be viewed in aggregate; all of the records within some selected cycles are +grouped and displayed with their links. Alternatively, this association can be viewed for particular linked +group; the linked records of this group are displayed by themselves.

+
+
+

Putting them Together, Match-Merge-Linking

+

As mentioned earlier, there is a rule or assumption that at most one representation of +the same record can exist in any given cycle.

+

This avoids unresolvable situations that would prevent year-over-year analysis. +In the most simple case, a record in Cycle A matches two records in Cycle B. +SEED wouldn’t know which of the two records in Cycle B should be +the “snapshot” for this time period.

+

For this reason, in-cycle match merging always occurs before cross-cycle match linking. +So when searches for links do happen, ambiguous cases have already been resolved.

+

For an individual record, these are the following cases in which a +match-merge-link is automatically run: +1. Explicit triggering (from the Property/TaxLot Detail page) +2. After editing (in the Property/TaxLot Detail page) +3. After manual merging (in the Properties/Tax Lots list page). Explicitly +specified merges happen as chosen by the user. Then, if the resulting record has +matches, merges and/or linking happens. +4. When importing a record. If the incoming record has matches, +merges and/or linking happens.

+

For a whole organization, a match-merge-link round for all records in that +organization is run in the following cases: +1. During the original deployment of this feature - This happens in order to +initially normalize the existing data and establish all initial links. +2. Whenever a user changes matching criteria - This happens in order to +re-normalize existing data and reestablish links. As of this writing, before +committing matching criteria changes, a user can view a preview of how their +records will be affected as these are difficult to reverse.

+
+
+

Note on In-Cycle Not-merged Matches

+

Even though the application tries it’s best to have only one representative record per property +(or tax lot) per Cycle, it’s possible for there to exist matches that were not merged. +This can happen if a user manually unmerges a record after a (manual or automatic) merge occurs. +If this happens, and there exists two records that match each other but are not merged, +both records are completely unlinked. Without user intervention such as editing +one of the matching criteria values, these will be merged and linked as described +above next time the system finds them during a match search.

+
+
+
+

Match Searching in Depth

+

Though they accomplish the same goal, the process for merging is very different between the last case, importing, +and the first 2 cases, manual edit or manual merge.

+

In the case of manual merging or editing, this process accounts for the fact that these are records that already exist. +Specifically, they may have associations such as labels, notes, pairings, and for properties, meters. +So during a subsequent match search leading to a merge of two or more records, all of these “old” associations are +carried over to the final record once merges are complete.

+

In the case of importing, considerations must be taken for the fact that, in most cases, multiple records +are being imported together. Also, since this is the entry point for records, it’s possible that a user might +accidentally try to import the same record snapshot twice - where all the record values are the same as another +existing record (as opposed to just having the same values for matching criteria fields). So on import, the process is as follows:

+
    +
  1. Amongst only the incoming records, duplicates (of other incoming or existing) are flagged and ignored.

  2. +
  3. Amongst only the incoming records, matching records are merged together.

  4. +
  5. Amongst all records in the same Cycle, incoming records that match an existing record gets merged with priority to that existing record. If the incoming record has multiple existing matches, the existing matches are merged together in latest updated order first while also combining any other associations (labels, notes, etc.) just as in the manual merge or edit cases. Since the incoming record is new, it doesn’t have any of the other associations.

  6. +
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/migrations.html b/docs/code_documentation/3.0.0-beta.0/migrations.html new file mode 100644 index 00000000..a1b3055d --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/migrations.html @@ -0,0 +1,528 @@ + + + + + + + Migrations — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Migrations

+

Django handles the migration of the database very well; however, there are various changes to SEED that may require some custom (manual) migrations. The migration documentation includes the required changes based on deployment and development for each release.

+
+

Version Develop

+

In order to support Redis passwords, the configuration of the Redis/Celery settings changed a bit. +You will need to add the following to your local_untracked.py configuration file. If you are using +Docker then you will not need to do this.

+
CELERY_RESULT_BACKEND = CELERY_BROKER_URL
+
+
+

If you are using a password, then in your local_untracked.py configuration, add the password to +the CELERY_BROKER_URL. Your final configuration should look like the following in your +local_untracked.py file

+
CELERY_BROKER_URL = 'redis://:password@127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+CELERY_RESULT_BACKEND = CELERY_BROKER_URL
+CELERY_TASK_DEFAULT_QUEUE = 'seed-local'
+CELERY_TASK_QUEUES = (
+    Queue(
+        CELERY_TASK_DEFAULT_QUEUE,
+        Exchange(CELERY_TASK_DEFAULT_QUEUE),
+        routing_key=CELERY_TASK_DEFAULT_QUEUE
+    ),
+)
+
+
+
+
+

Version 3.0.0-beta.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.22.0

+
    +
  • Run ./manage.py migrate.

  • +
  • +
    There is a Redis dependency update in this release that requires users and deployments to modify their settings’ CACHES config.
      +
    1. Update your dependencies with pip install -r requirements/base.txt

    2. +
    3. Update the CACHES BACKEND property to django_redis.cache.RedisCache

    4. +
    5. Update the CACHES LOCATION property to match the redis-py native URL notation for connection strings, including the redis protocol and database number. e.g. redis://localhost:6379/1

    6. +
    +

    Since the CELERY_BROKER_URL setting must also be in the same format, it may be helpful to configure that setting first and then reference it in the caches LOCATION parameter.

    +
    +
    +
  • +
  • See the PR for an example migration.

  • +
+
+
+

Version 2.21.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.20.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.20.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
  • There is a single long running migration related to importing census tract disadvantaged community data. This migration should take around 7 minutes to complete.

  • +
+
+
+

Version 2.19.0

+
    +
  • Run ./manage.py migrate.

  • +
  • +
    There is a new migration in this release that requires column names to be unique across organization, table_name, and is_extra_data. This migration will fail if there are duplicate column names. If you have duplicate column names, you will need to manually fix them in your database before running the migration. The following steps will help you identify and fix the duplicate column names:
      +
    • Check the organization age to gauge the impact of the change. If it is a deprecated org, impact of the change will be low. Often this issue arose in older organizations when units were not part of the columns. The old mapping columns were not upserts with the units, so typically the columns impacted are the ones with units.

    • +
    • Query the seed_column table for the organization and column name displayed on the screen (e.g., organization_id = 300 and column_name = ‘Source EUI (kBtu/ft2)’). If there is no table_name set, it is likely an import file column name and can easily be cleaned up without causing issues. In such cases, there will be two rows, and you want to keep the one with the units_pint column set.

    • +
    • More complex columns may require deleting or updating the column_id in the seed_columnmapping_* tables. If there is a foreign key constraint with seed_columnmapping_*, take note of the ID you want to remove and the ID you want it to be replaced with (preferably keep the one with units_pint).

    • +
    • +
      If the constraint is on seed_columnmapping_column_raw:
        +
      • The field should be an import file column (i.e., no table_name item). Query for the old column in seed_columnmapping_column_raw (e.g., column_name = <old_id>).

      • +
      • Replace the old ID with the new one. If it errors because it already exists, then the row can be deleted.

      • +
      • Return to the seed_column table and remove the old ID.

      • +
      +
      +
      +
    • +
    • +
      If the constraint is on seed_columnmapping_column_mapped:
        +
      • The mapped column should have a table_name in the field. If not, it is likely an older organization.

      • +
      • If there is no table_name, remove the row from the seed_columnmapping_column_mapped table.

      • +
      • Return to the seed_column table and remove the old ID.

      • +
      +
      +
      +
    • +
    +
    +
    +
  • +
+
+
+

Version 2.18.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.18.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.4

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.3

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.2

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.16.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.15.2

+
    +
  • There are no migrations needed for this version.

  • +
+
+
+

Version 2.15.1

+
    +
  • There are no migrations needed for this version.

  • +
+
+
+

Version 2.15.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.14.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.13.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.12.0 - 2.12.4

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.11.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.10.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.7.3 to 2.9.0

+
    +
  • The migrations should work without additional support. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.7.2

+
    +
  • The migrations should work without additional support. Simply run ./manage.py migrate. There are no manual migrations needed.

  • +
  • Note the Important Note in Version 2.7.1 migration below which may require the need to run a “fake” migration

  • +
+
+
+

Version 2.7.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+

Important Note:

+

If upgrading from < 2.7.0 to >= 2.7.1 you may encounter a failed migration with 0118_match_merge_link_all_orgs. This is expected if the database is several versions behind, and it effectively reorders migration 118 to run after all other migrations have completed to prepare your database to recognize properties and taxlots across multiple cycles. Run the following code manually to fully migrate:

+
    +
  1. ./manage.py migrate --fake seed 0118_match_merge_link_all_orgs

  2. +
  3. ./manage.py migrate

  4. +
  5. ./manage.py shell

    +
    +
    from seed.lib.superperms.orgs.models import Organization
    +from seed.utils.match import whole_org_match_merge_link
    +
    +for org in Organization.objects.all():
    +    whole_org_match_merge_link(org.id, 'PropertyState')
    +    whole_org_match_merge_link(org.id, 'TaxLotState')
    +
    +
    +
    +
  6. +
+
+
+

Version 2.7.0

+
    +
  • This migration will run a match/merge/pair/link method upon migration. Make sure to run the migration manually and not inside of the docker container using the ./deploy.sh script.

  • +
  • Make sure to backup the database before performing the migration.

  • +
  • Run ./manage.py migrate.

  • +
+
+
+

Version 2.6.1

+
    +
  • The migrations should work without additional support. Simply run ./manage.py migrate. There are no manual migrations needed for the 2.6.1 release.

  • +
+
+
+

Version 2.6.0

+

Version 2.6.0 includes support for meters and time series data storage. In order to use this release +you must first install TimescaleDB.

+
+

Docker-based Deployment

+

Docker-based deployments shouldn’t require running any additional commands for installation. The +timescaledb installation will happen automatically when updating the postgres container. Also, +the installation of the extension occurs in a Django migration.

+
+
+

Ubuntu

+
sudo add-apt-repository ppa:timescale/timescaledb-ppa
+sudo apt update
+sudo apt install timescaledb-postgresql-10
+sudo timescaledb-tune
+sudo service postgresql restart
+
+
+
+
+

Max OSX

+
brew tap timescale/tap
+brew install timescaledb
+/usr/local/bin/timescaledb_move.sh
+timescaledb-tune
+brew services restart postgresql
+
+
+
+
+
+

Version 2.5.2

+
    +
  • There are no manual migrations that are needed. The ./manage.py migrate command may take awhile to run since the migration requires the recalculation of all the normalized addresses to parse bldg correct and to cast the result as a string and not a bytestring.

  • +
+
+
+

Version 2.5.1

+
    +
  • The migrations should work by simply running ./manage.py migrate. There are no manual migrations needed for the 2.5.1 release.

  • +
+
+
+

Version 2.5.0

+
+

Docker-based Deployment

+
    +
  • Add the MapQuest API key to your organization.

  • +
  • On deployment, the error below is indicative that you need to install the extensions in the postgres database. Run docker exec <postgres_container_id> update-postgis.sh.

    +
    +

    django.db.utils.OperationalError: could not open extension control file “/usr/share/postgresql/11/extension/postgis.control”: No such file or directory

    +
    +
  • +
  • If you are using a copied version of the docker-compose.yml file, then you need to change 127.0.0.1:5000/postgres to 127.0.0.1:5000/postgres-seed

  • +
+
+
+

Development

+
    +
  • Delete your bower directory rm -rf seed/static/vendors.

  • +
  • Delete your css directory rm -rf seed/static/seed/css.

  • +
  • Remove these lines from local_untracked.py if you have them.

  • +
+
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
+STATICFILES_STORAGE = DEFAULT_FILE_STORAGE
+
+
+
    +
  • Run pip3 install -r requirements/local.txt.

  • +
  • Run npm install from root checkout of SEED.

  • +
  • If testing geocoding, then sign up for as a MapQuest Developer and create a new MapQuest Key.

  • +
  • Add the key to the organization that you are using in development.

  • +
  • Update your DATABASES engine to be django.contrib.gis.db.backends.postgis

  • +
+
DATABASES = {
+    'default': {
+        'ENGINE': 'django.contrib.gis.db.backends.postgis',
+        'NAME': 'seeddb',
+        'USER': 'seeduser',
+        'PASSWORD': 'seedpass',
+        'HOST': 'localhost',
+        'PORT': '5432',
+    }
+}
+
+
+
    +
  • Run ./manage.py migrate

  • +
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules.html b/docs/code_documentation/3.0.0-beta.0/modules.html new file mode 100644 index 00000000..8307af0e --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules.html @@ -0,0 +1,521 @@ + + + + + + + Modules — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Modules

+
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/config.html b/docs/code_documentation/3.0.0-beta.0/modules/config.html new file mode 100644 index 00000000..617e41a0 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/config.html @@ -0,0 +1,217 @@ + + + + + + + Configuration — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Configuration

+
+

Submodules

+
+
+

Template Context

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+config.template_context.sentry_js(request)
+
+ +
+
+config.template_context.session_key(request)
+
+ +
+
+

Tests

+
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+config.utils.de_camel_case(name)
+
+ +
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+config.views.robots_txt(request, allow=False)
+
+ +
+
+

WSGI

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

:description WSGI config for config project.

+

This module contains the WSGI application used by Django’s development server +and any production WSGI deployments. It should expose a module-level variable +named application. Django’s runserver and runfcgi commands discover +this application via the WSGI_APPLICATION setting.

+

Usually you will have the standard Django WSGI application here, but it also +might make sense to replace the whole Django WSGI application with a custom one +that later delegates to the Django one. For example, you could introduce WSGI +middleware here, or combine a Django application with an application of another +framework.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.cleansing.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.cleansing.html new file mode 100644 index 00000000..eccb2751 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.cleansing.html @@ -0,0 +1,915 @@ + + + + + + + Data Quality Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Data Quality Package

+
+

Inheritance

+
+
+

Submodules

+
+
+

Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+exception seed.models.data_quality.ComparisonError
+

Bases: Exception

+
+ +
+
+class seed.models.data_quality.DataQualityCheck(*args, **kwargs)
+

Bases: Model

+

Object that stores the high level configuration per organization of the DataQualityCheck

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+REQUIRED_FIELDS = {'PropertyState': ['address_line_1', 'custom_id_1', 'pm_property_id'], 'TaxLotState': ['address_line_1', 'custom_id_1', 'jurisdiction_tax_lot_id']}
+
+ +
+
+add_invalid_geometry_entry_provided(row_id, rule, display_name, value)
+
+ +
+
+add_result_comparison_error(row_id, rule, display_name, value, rule_check)
+
+ +
+
+add_result_dimension_error(row_id, rule, display_name, value)
+
+ +
+
+add_result_is_null(row_id, rule, display_name, value)
+
+ +
+
+add_result_max_error(row_id, rule, display_name, value, rule_max)
+
+ +
+
+add_result_min_error(row_id, rule, display_name, value, rule_min)
+
+ +
+
+add_result_missing_and_none(row_id, rule, display_name, value)
+
+ +
+
+add_result_missing_req(row_id, rule, display_name, value)
+
+ +
+
+add_result_string_error(row_id, rule, display_name, value)
+
+ +
+
+add_result_type_error(row_id, rule, display_name, value)
+
+ +
+
+add_rule(rule)
+

Add a new rule to the Data Quality Checks

+
+
Parameters:
+

rule – dict to be added as a new rule

+
+
Returns:
+

None

+
+
+
+ +
+
+add_rule_if_new(rule)
+

Add a new rule to the Data Quality Checks only if rule does not exist

+
+
Parameters:
+

rule – dict to be added as a new rule

+
+
Returns:
+

None

+
+
+
+ +
+
+static cache_key(identifier, organization_id)
+

Static method to return the location of the data_quality results from redis.

+
+
Parameters:
+

identifier – Import file primary key

+
+
Returns:
+

+
+
+
+ +
+
+check_data(record_type, rows)
+

Send in data as a queryset from the Property/Taxlot ids.

+
+
Parameters:
+
    +
  • record_type – one of PropertyState | TaxLotState

  • +
  • rows – rows of data to be checked for data quality

  • +
+
+
Returns:
+

None

+
+
+
+ +
+
+get_fieldnames(record_type)
+

Get fieldnames to apply to results.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+static initialize_cache(identifier, organization_id)
+

Initialize the cache for storing the results. This is called before the +celery tasks are chunked up.

+

The cache_key is different than the identifier. The cache_key is where all the results are +to be stored for the data quality checks, the identifier, is the random number (or specified +value that is used to identifier both the progress and the data storage

+
+
Parameters:
+

identifier – Identifier for cache, if None, then creates a random one

+
+
Returns:
+

list, [cache_key and the identifier]

+
+
+
+ +
+
+initialize_rules()
+

Initialize the default rules for a DataQualityCheck object

+
+
Returns:
+

None

+
+
+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+remove_all_rules()
+

Removes all the rules associated with this DataQualityCheck instance.

+
+
Returns:
+

None

+
+
+
+ +
+
+remove_status_label(label_class, rule, linked_id)
+

Remove label because it did not match any of the range exceptions

+
+
Parameters:
+
    +
  • label_class – statuslabel object, either property label or taxlot label

  • +
  • rule – rule object

  • +
  • linked_id – id of propertystate or taxlotstate object

  • +
+
+
Returns:
+

boolean, if labeled was applied

+
+
+
+ +
+
+reset_all_rules()
+

Delete all rules and reinitialize the default set of rules

+
+
Returns:
+

None

+
+
+
+ +
+
+reset_default_rules()
+

Reset only the default rules

+
+
Returns:
+

+
+
+
+ +
+
+reset_results()
+
+ +
+
+classmethod retrieve(organization_id)
+

DataQualityCheck was previously a simple object but has been migrated to a django model. +This method ensures that the data quality model will be backwards compatible.

+

This is the preferred method to initialize a new object.

+
+
Parameters:
+

organization – instance of Organization

+
+
Returns:
+

obj, DataQualityCheck

+
+
+
+ +
+
+retrieve_result_by_address(address)
+

Retrieve the results of the data quality checks for a specific address.

+
+
Parameters:
+

address – string, address to find the result for

+
+
Returns:
+

dict, results of data quality check for specific building

+
+
+
+ +
+
+retrieve_result_by_tax_lot_id(tax_lot_id)
+

Retrieve the results of the data quality checks by the jurisdiction ID.

+
+
Parameters:
+

tax_lot_id – string, jurisdiction tax lot id

+
+
Returns:
+

dict, results of data quality check for specific building

+
+
+
+ +
+
+rules
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+save_to_cache(identifier, organization_id)
+

Save the results to the cache database. The data in the cache are +stored as a list of dictionaries. The data in this class are stored as +a dict of dict. This is important to remember because the data from the +cache cannot be simply loaded into the above structure.

+
+
Parameters:
+

identifier – Import file primary key

+
+
Returns:
+

None

+
+
+
+ +
+
+update_status_label(label_class, rule, linked_id, row_id, add_to_results=True)
+
+
Parameters:
+
    +
  • label_class – statuslabel object, either propertyview label or taxlotview label

  • +
  • rule – rule object

  • +
  • linked_id – id of propertyview or taxlotview object

  • +
  • row_id

  • +
  • add_to_results – bool

  • +
+
+
Returns:
+

boolean, if labeled was applied

+
+
+
+ +
+ +
+
+exception seed.models.data_quality.DataQualityTypeCastError
+

Bases: Exception

+
+ +
+
+class seed.models.data_quality.Rule(*args, **kwargs)
+

Bases: Model

+

Rules for DataQualityCheck

+
+
+DATA_TYPES = [(0, 'number'), (1, 'string'), (2, 'date'), (3, 'year'), (4, 'area'), (5, 'eui')]
+
+ +
+
+DEFAULT_RULES = [{'condition': 'not_null', 'data_type': 1, 'field': 'address_line_1', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'not_null', 'data_type': 1, 'field': 'pm_property_id', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'not_null', 'field': 'custom_id_1', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'not_null', 'field': 'jurisdiction_tax_lot_id', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'TaxLotState'}, {'condition': 'not_null', 'data_type': 1, 'field': 'address_line_1', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'TaxLotState'}, {'condition': 'range', 'data_type': 4, 'field': 'conditioned_floor_area', 'max': 7000000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 4, 'field': 'conditioned_floor_area', 'min': 100, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 0, 'field': 'energy_score', 'max': 100, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 0, 'field': 'energy_score', 'min': 10, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 2, 'field': 'generation_date', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 0, 'field': 'gross_floor_area', 'max': 7000000, 'min': 100, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 0, 'field': 'occupied_floor_area', 'max': 7000000, 'min': 100, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 2, 'field': 'recent_sale_date', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 2, 'field': 'release_date', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 5, 'field': 'site_eui', 'max': 1000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'site_eui', 'min': 10, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'site_eui_weather_normalized', 'max': 1000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'source_eui', 'max': 1000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'source_eui', 'min': 10, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'source_eui_weather_normalized', 'max': 1000, 'min': 10, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 3, 'field': 'year_built', 'max': '2024', 'min': 1700, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 2, 'field': 'year_ending', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}]
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+RULE_EXCLUDE = 'exclude'
+
+ +
+
+RULE_INCLUDE = 'include'
+
+ +
+
+RULE_NOT_NULL = 'not_null'
+
+ +
+
+RULE_RANGE = 'range'
+
+ +
+
+RULE_REQUIRED = 'required'
+
+ +
+
+RULE_TYPE = [(0, 'default'), (1, 'custom')]
+
+ +
+
+RULE_TYPE_CUSTOM = 1
+
+ +
+
+RULE_TYPE_DEFAULT = 0
+
+ +
+
+SEVERITY = [(0, 'error'), (1, 'warning'), (2, 'valid')]
+
+ +
+
+SEVERITY_ERROR = 0
+
+ +
+
+SEVERITY_VALID = 2
+
+ +
+
+SEVERITY_WARNING = 1
+
+ +
+
+TYPE_AREA = 4
+
+ +
+
+TYPE_DATE = 2
+
+ +
+
+TYPE_EUI = 5
+
+ +
+
+TYPE_NUMBER = 0
+
+ +
+
+TYPE_STRING = 1
+
+ +
+
+TYPE_YEAR = 3
+
+ +
+
+condition
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_quality_check
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+data_quality_check_id
+
+ +
+
+data_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+enabled
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+field
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+for_derived_column
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+format_strings(value)
+
+ +
+
+get_data_type_display(*, field=<django.db.models.fields.IntegerField: data_type>)
+
+ +
+
+get_rule_type_display(*, field=<django.db.models.fields.IntegerField: rule_type>)
+
+ +
+
+get_severity_display(*, field=<django.db.models.fields.IntegerField: severity>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+max
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+maximum_valid(value)
+

Validate that the value is not greater than the maximum specified by the rule.

+
+
Parameters:
+

value – Value to validate rule against

+
+
Returns:
+

bool, True is valid, False if the value is out of range

+
+
+
+ +
+
+min
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+minimum_valid(value)
+

Validate that the value is not less than the minimum specified by the rule.

+
+
Parameters:
+

value – Value to validate rule against

+
+
Returns:
+

bool, True is valid, False if the value is out of range

+
+
+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+not_null
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+required
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+rule_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+severity
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+status_label
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+status_label_id
+
+ +
+
+str_to_data_type(value)
+

If the check is coming from a field in the database then it will be typed correctly; +however, for extra_data, the values are typically strings or unicode. Therefore, the +values are typed before they are checked using the rule’s data type definition.

+
+
Parameters:
+

value – variant, value to type

+
+
Returns:
+

typed value

+
+
+
+ +
+
+table_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+text_match
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+units
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+valid_text(value)
+

Validate the rule matches the specified text. Text is matched by regex.

+
+
Parameters:
+

value – Value to validate rule against

+
+
Returns:
+

bool, True is valid, False if the value does not match

+
+
+
+ +
+ +
+
+exception seed.models.data_quality.UnitMismatchError
+

Bases: Exception

+
+ +
+
+seed.models.data_quality.format_pint_violation(rule, source_value)
+

Format a pint min, max violation for human readability.

+

:param rule +:param source_value : Quantity - value to format into range +:return (formatted_value, formatted_min, formatted_max) : (String, String, String)

+
+ +
+
+

Tests

+
+
+

Views

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.data.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.data.html new file mode 100644 index 00000000..e3344bd7 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.data.html @@ -0,0 +1,157 @@ + + + + + + + Data Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Data Package

+
+

Submodules

+
+
+

BEDES

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.data_importer.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.data_importer.html new file mode 100644 index 00000000..195aaa7c --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.data_importer.html @@ -0,0 +1,233 @@ + + + + + + + Data Importer Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Data Importer Package

+
+

Submodules

+
+
+

Managers

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.data_importer.managers.NotDeletedManager(*args, **kwargs)
+

Bases: Manager

+
+
+get_all(*args, **kwargs)
+

Method to return ALL ImportFiles, including the ones where deleted == True which are normally excluded. +This is used for database/filesystem cleanup.

+
+ +
+
+get_queryset(*args, **kwargs)
+

Return a new QuerySet object. Subclasses can override this method to +customize the behavior of the Manager.

+
+ +
+ +
+ +
+ +
+
+

Models

+
+
+

URLs

+
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

Utility methods pertaining to data import tasks (save, mapping, matching).

+
+
+seed.data_importer.utils.kbtu_thermal_conversion_factors(country)
+

Returns thermal conversion factors provided by Portfolio Manager. +In the PM app, using NREL’s test account, a property was created for each US +and CAN. All possible Meters of different Type and Units were added. +Readings of value 1 were added to deduce the factors provided below.

+

Consideration was given regarding having the provided ‘country’ value align with +Organizations’ thermal_conversion_assumption enums. Even though these two +should be aligned, the concept and need for these factors are not specific +solely to Orgs. So the ‘country’ value here is expected to be a string. +Specifically, there are instances in the codebase where the factors are +needed irrespective of any Organization’s preferences.

+
+ +
+
+seed.data_importer.utils.usage_point_id(raw_source_id)
+

Extracts and returns the usage point ID of a GreenButton full uri ID.

+
+ +
+
+

Views

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.features.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.features.html new file mode 100644 index 00000000..26704526 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.features.html @@ -0,0 +1,175 @@ + + + + + + + Features Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.html new file mode 100644 index 00000000..f0a86d63 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.html @@ -0,0 +1,842 @@ + + + + + + + SEED Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SEED Package

+
+

Subpackages

+
+ +
+
+
+

Inheritance

+
+
+

Submodules

+
+
+

Decorators

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.decorators.DRFEndpointMixin
+

alias of Mixin

+
+ +
+
+seed.decorators.ajax_request(func)
+

Copied from django-annoying, with a small modification. Now we also check for ‘status’ or +‘success’ keys and slash return correct status codes

+

If view returned serializable dict, returns response in a format requested +by HTTP_ACCEPT header. Defaults to JSON if none requested or match.

+

Currently supports JSON or YAML (if installed), but can easily be extended.

+

Example:

+
@ajax_request
+def my_view(request):
+    news = News.objects.all()
+    news_titles = [entry.title for entry in news]
+    return {"news_titles": news_titles}
+
+
+
+ +
+
+seed.decorators.ajax_request_class(func)
+
    +
  • Copied from django-annoying, with a small modification. Now we also check for ‘status’ or

  • +
+

‘success’ keys and return correct status codes

+

If view returned serializable dict, returns response in a format requested +by HTTP_ACCEPT header. Defaults to JSON if none requested or match.

+

Currently supports JSON or YAML (if installed), but can easily be extended.

+

Example:

+
@ajax_request
+def my_view(self, request):
+    news = News.objects.all()
+    news_titles = [entry.title for entry in news]
+    return {"news_titles": news_titles}
+
+
+
+ +
+
+seed.decorators.decorator_to_mixin(decorator)
+

Converts a decorator written for a function view into a mixin for a class-based view.

+

Example:

+
LoginRequiredMixin = decorator_to_mixin(login_required)
+
+
+class MyView(LoginRequiredMixin):
+    pass
+
+
+class SomeView(decorator_to_mixin(some_decorator), decorator_to_mixin(something_else)):
+    pass
+
+
+
+ +
+
+seed.decorators.get_prog_key(func_name, import_file_pk)
+

Return the progress key for the cache

+
+ +
+
+seed.decorators.lock_and_track(fn, *args, **kwargs)
+

Decorator to lock tasks to single executor and provide progress url.

+
+ +
+
+seed.decorators.require_organization_id(func)
+

Validate that organization_id is in the GET params and it’s an int.

+
+ +
+
+seed.decorators.require_organization_id_class(fn)
+

Validate that organization_id is in the GET params and it’s an int.

+
+ +
+
+seed.decorators.require_organization_membership(fn)
+

Validate that the organization_id passed in GET is valid for request user.

+
+ +
+
+

Factory

+
+
+

Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Search

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

Search methods pertaining to buildings.

+
+
+seed.search.build_shared_buildings_orgs(orgs)
+

returns a list of sibling and parent orgs

+
+ +
+
+seed.search.create_inventory_queryset(inventory_type, orgs, exclude, order_by, other_orgs=None, cycle_id=None)
+

creates a queryset of properties or taxlots within orgs. +If other_orgs, properties/taxlots in both orgs and other_orgs +will be represented in the queryset.

+
+
Parameters:
+
    +
  • inventory_type – property or taxlot.

  • +
  • orgs – queryset of Organization inst.

  • +
  • exclude – django query exclude dict.

  • +
  • order_by – django query order_by str.

  • +
  • other_orgs – list of other orgs to or the query

  • +
+
+
+
+ +
+
+seed.search.get_inventory_fieldnames(inventory_type)
+

returns a list of field names that will be searched against

+
+ +
+
+seed.search.get_orgs_w_public_fields()
+

returns a list of orgs that have publicly shared fields

+
+ +
+
+seed.search.inventory_search_filter_sort(inventory_type, params, user, cycle_id=None)
+

Given a parsed set of params, perform the search, filter, and sort for +Properties or Taxlots

+
+ +
+
+seed.search.parse_body(request)
+

parses the request body for search params, q, etc

+
+
Parameters:
+

request – django wsgi request object

+
+
Returns:
+

dict

+
+
+

Example:

+
{
+    'exclude': dict, exclude dict for django queryset
+    'order_by': str, query order_by, defaults to 'tax_lot_id'
+    'sort_reverse': bool, True if ASC, False if DSC
+    'page': int, pagination page
+    'number_per_page': int, number per pagination page
+    'show_shared_buildings': bool, whether to search across all user's orgs
+    'q': str, global search param
+    'other_search_params': dict, filter params
+    'project_id': str, project id if exists in body
+}
+
+
+
+ +
+
+seed.search.process_search_params(params, user, is_api_request=False)
+

Given a python representation of a search query, process it into the +internal format that is used for searching, filtering, sorting, and pagination.

+
+
Parameters:
+
    +
  • params – a python object representing the search query

  • +
  • user – the user this search is for

  • +
  • is_api_request – bool, boolean whether this search is being done as an api request.

  • +
+
+
Returns:
+

dict

+
+
+

Example:

+
{
+    'exclude': dict, exclude dict for django queryset
+    'order_by': str, query order_by, defaults to 'tax_lot_id'
+    'sort_reverse': bool, True if ASC, False if DSC
+    'page': int, pagination page
+    'number_per_page': int, number per pagination page
+    'show_shared_buildings': bool, whether to search across all user's orgs
+    'q': str, global search param
+    'other_search_params': dict, filter params
+    'project_id': str, project id if exists in body
+}
+
+
+
+ +
+
+seed.search.search_inventory(inventory_type, q, fieldnames=None, queryset=None)
+

returns a queryset for matching Taxlot(View)/Property(View) +:param str or unicode q: search string +:param list fieldnames: list of model fieldnames +:param queryset: optional queryset to filter from +:returns: :queryset: queryset of matching buildings

+
+ +
+
+seed.search.search_properties(q, fieldnames=None, queryset=None)
+
+ +
+
+seed.search.search_taxlots(q, fieldnames=None, queryset=None)
+
+ +
+
+

Tasks

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.tasks.delete_organization(org_pk)
+

delete_organization_buildings

+
+ +
+
+seed.tasks.invite_new_user_to_seed(domain, email_address, token, user_pk, first_name)
+

Send invitation email to newly created user from the landing page. +NOTE: this function is only used on the landing page because the user has not been assigned an organization +domain – The domain name of the running seed instance +email_address – The address to send the invitation to +token – generated by Django’s default_token_generator +user_pk – primary key for this user record +first_name – First name of the new user +new_user

+

Returns: nothing

+
+ +
+
+seed.tasks.send_salesforce_error_log(org_pk, errors)
+

send salesforce error log to logging email when errors are encountered during scheduled sync

+
+ +
+
+

Token Generator

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
author:
+

Aleck Landgraf

+
+
+

token_generator.py - taken from django core master branch

+

needed a token check that would not expire after three days for sending a +signup email

+
+
+class seed.token_generators.SignupTokenGenerator
+

Bases: object

+

Strategy object used to generate and check tokens for the password +reset mechanism.

+
+
+check_token(user, token, token_expires=True)
+

Check that a password reset token is correct for a given user.

+
+ +
+
+make_token(user)
+

Returns a token that can be used once to do a password reset +for the given user.

+
+ +
+ +
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.landing.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.landing.html new file mode 100644 index 00000000..a0a0ad1d --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.landing.html @@ -0,0 +1,835 @@ + + + + + + + Landing Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Landing Package

+
+

Subpackages

+ +
+
+

Submodules

+
+
+

Forms

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.landing.forms.CustomCreateUserForm(*args, **kwargs)
+

Bases: UserCreationForm

+
+
+class Meta
+

Bases: object

+
+
+fields = ['username']
+
+ +
+
+model
+

alias of SEEDUser

+
+ +
+
+widgets = {'username': <django.forms.widgets.EmailInput object>}
+
+ +
+ +
+
+base_fields = {'password1': <django.forms.fields.CharField object>, 'password2': <django.forms.fields.CharField object>, 'username': <django.forms.fields.EmailField object>}
+
+ +
+
+declared_fields = {'password1': <django.forms.fields.CharField object>, 'password2': <django.forms.fields.CharField object>}
+
+ +
+
+property media
+

Return all media required to render the widgets on this form.

+
+ +
+ +
+
+class seed.landing.forms.LoginForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None)
+

Bases: Form

+
+
+base_fields = {'email': <django.forms.fields.EmailField object>, 'password': <django.forms.fields.CharField object>}
+
+ +
+
+declared_fields = {'email': <django.forms.fields.EmailField object>, 'password': <django.forms.fields.CharField object>}
+
+ +
+
+property media
+

Return all media required to render the widgets on this form.

+
+ +
+ +
+
+

Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.landing.models.SEEDUser(*args, **kwargs)
+

Bases: AbstractBaseUser, PermissionsMixin

+

An abstract base class implementing a fully featured User model with +admin-compliant permissions.

+

Username, password and email are required. Other fields are optional.

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+REQUIRED_FIELDS = ['email']
+
+ +
+
+USERNAME_FIELD = 'username'
+
+ +
+
+analysis_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+api_key
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+columnmapping_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+cycle_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+date_joined
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+deactivate_user()
+
+ +
+
+default_building_detail_custom_columns
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+default_custom_columns
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+default_organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+default_organization_id
+
+ +
+
+email
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+email_user(subject, message, from_email=None)
+

Sends an email to this User.

+
+ +
+
+first_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+generate_key()
+

Creates and sets an API key for this user. +Adapted from tastypie:

+

https://github.com/toastdriven/django-tastypie/blob/master/tastypie/models.py#L47

+
+ +
+
+get_absolute_url()
+
+ +
+
+get_full_name()
+

Returns the first_name plus the last_name, with a space in between.

+
+ +
+
+get_next_by_date_joined(*, field=<django.db.models.fields.DateTimeField: date_joined>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_date_joined(*, field=<django.db.models.fields.DateTimeField: date_joined>, is_next=False, **kwargs)
+
+ +
+
+get_short_name()
+

Returns the short name for the user.

+
+ +
+
+greenassessmentpropertyauditlog_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+importrecord_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+is_staff
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+last_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+logentry_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+modified_import_records
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+notes
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+oauth2_provider_accesstoken
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+oauth2_provider_application
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+oauth2_provider_grant
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+oauth2_provider_refreshtoken
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.contrib.auth.models.UserManager object>
+
+ +
+
+organizationuser_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+orgs
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+postofficeemail_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+postofficeemailtemplate_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+classmethod process_header_request(request)
+

Process the header string to return the user if it is a valid user.

+
+
Parameters:
+

request – object, request object with HTTP Authorization

+
+
Returns:
+

User object

+
+
+
+ +
+
+save(*args, **kwargs)
+

Ensure that email and username are synced.

+
+ +
+
+show_shared_buildings
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+user_permissions
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+username
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+

Tests

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.landing.tests.UserLoginTest(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_simple_login()
+

Happy path login

+
+ +
+ +
+
+

URLs

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.landing.views.account_activation_sent(request)
+
+ +
+
+seed.landing.views.activate(request, uidb64, token)
+
+ +
+
+seed.landing.views.create_account(request)
+
+ +
+
+seed.landing.views.landing_page(request)
+
+ +
+
+seed.landing.views.password_reset(request)
+
+ +
+
+seed.landing.views.password_reset_complete(request)
+
+ +
+
+seed.landing.views.password_reset_confirm(request, uidb64=None, token=None)
+
+ +
+
+seed.landing.views.password_reset_done(request)
+
+ +
+
+seed.landing.views.password_set(request, uidb64=None, token=None)
+
+ +
+
+seed.landing.views.signup(request, uidb64=None, token=None)
+
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.landing.management.commands.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.landing.management.commands.html new file mode 100644 index 00000000..3f625988 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.landing.management.commands.html @@ -0,0 +1,167 @@ + + + + + + + Landing Management Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Landing Management Package

+
+

Submodules

+
+
+

Update EULA

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.landing.management.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.landing.management.html new file mode 100644 index 00000000..6ffe2896 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.landing.management.html @@ -0,0 +1,173 @@ + + + + + + + seed.landing.management package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

seed.landing.management package

+
+

Subpackages

+ +
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.lib.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.lib.html new file mode 100644 index 00000000..2afe2b9f --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.lib.html @@ -0,0 +1,157 @@ + + + + + + + Library Packages — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Library Packages

+
+

Submodules

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.lib.mappings.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.lib.mappings.html new file mode 100644 index 00000000..6c74f3a5 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.lib.mappings.html @@ -0,0 +1,339 @@ + + + + + + + seed.lib.mappings package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

seed.lib.mappings package

+
+

Submodules

+
+
+

seed.lib.mappings.mapper module

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

:author Dan Gunter <dkgunter@lbl.gov>

+
+
+seed.lib.mappings.mapper.create_column_regexes(raw_columns)
+

Take the columns in the format below and sanitize the keys and add +in the regex.

+
+
Parameters:
+

raw_data – list of strings (columns names from imported file)

+
+
Returns:
+

list of dict

+
+
+
+ +
+
+seed.lib.mappings.mapper.get_pm_mapping(raw_columns, mapping_data=None, resolve_duplicates=True)
+

Create and return Portfolio Manager (PM) mapping for a given version of PM and the given +list of column names.

+

The method will take the raw_columns (from the CSV/XLSX file) and attempt to normalize the +column names so that they can be mapped to the data in the pm-mapping.json[‘from_field’].

+
+ +
+
+

seed.lib.mappings.mapping_columns module

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

:author Nicholas Long <nicholas.long@nrel.gov>

+
+
+class seed.lib.mappings.mapping_columns.MappingColumns(raw_columns, dest_columns, previous_mapping=None, map_args=None, default_mappings=None, threshold=0)
+

Bases: object

+

This class handles the probabilistic mapping of unknown columns to defined fields. This +is mainly used in the build_column_mapping API endpoint.

+
+
+add_mappings(raw_column, mappings, previous_mapping=False)
+

Add mappings to the data structure for later processing.

+
+
Parameters:
+
    +
  • raw_column – list of strings

  • +
  • mappings – list of tuples of potential mappings and confidences

  • +
  • previous_mapping – boolean, if true these mappings will take precedence

  • +
+
+
Returns:
+

Bool, whether the mapping was added

+
+
+
+ +
+
+apply_threshold(threshold)
+

Remove mapping suggestions that do not meet the defined threshold

+

This method is forced as part of the workflow for now, but could easily be made as a +separate call.

+
+
Parameters:
+

threshold – int, min value to be greater than or equal to.

+
+
Returns:
+

None

+
+
+
+ +
+
+property duplicates
+

Check for duplicate initial mapping results. Duplicates exist if the first suggested mapping +for two different raw_columns are the same. The example below would be one of those cases.

+
+
Returns:
+

List of raw col

+
+
+
+ +
+
+property final_mappings
+

Return the final mappings in a format that can be used downstream from this method +{

+
+

“raw_column_1”: (‘table’, ‘db_column_1’, confidence), +“raw_column_2”: (‘table’, ‘db_column_1’, confidence),

+
+

}

+
+ +
+
+first_suggested_mapping(raw_column)
+

Grab the first suggested mapping for a raw column

+
+
Parameters:
+

raw_column – String

+
+
Returns:
+

tuple of the mapping (‘table’, ‘field’, confidence), or ()

+
+
+
+ +
+
+resolve_duplicate(dup_map_field, raw_columns)
+

If there are duplicates, that is two raw_columns are trying to map to the same suggested +column, then select the next available one on the duplicate column. The one with the highest +confidence will ‘win’ the duplicate battle.

+
+
Parameters:
+
    +
  • dup_map_field – String, name of the field that is a duplicate

  • +
  • raw_columns – list, raw columns that mapped to the same result

  • +
+
+
Returns:
+

None

+
+
+
+ +
+
+set_initial_mapping_cmp(raw_column)
+

Set the initial_mapping_cmp helper item in the self.data hash. This is used to detect +if there are any duplicates. The initial mapping cmp will be the first match in the list +(i.e., the one with the highest confidence).

+
+
Parameters:
+

raw_column – String, name of the raw column to set the initial_mapping_cmp

+
+
Returns:
+

None

+
+
+
+ +
+ +
+
+seed.lib.mappings.mapping_columns.sort_duplicates(a, b)
+

Custom sort for the duplicate hash to decide which raw column will get the mapping suggestion +based on the confidence.

+
+ +
+
+

seed.lib.mappings.mapping_data module

+
+
+

seed.lib.mappings.test_mapper module

+
+
+

seed.lib.mappings.test_mapping_columns module

+
+
+

seed.lib.mappings.test_mapping_data module

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.lib.merging.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.lib.merging.html new file mode 100644 index 00000000..3c71a03b --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.lib.merging.html @@ -0,0 +1,226 @@ + + + + + + + seed.lib.merging package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

seed.lib.merging package

+
+

Submodules

+
+
+

seed.lib.merging.merging module

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

:author Dan Gunter <dkgunter@lbl.gov>

+
+
+seed.lib.merging.merging.get_attrs_with_mapping(data_set_buildings, mapping)
+

Returns a dictionary of attributes from each data_set_building.

+
+
Parameters:
+
    +
  • data_set_buildings – list, instances to merge.

  • +
  • mapping

  • +
+
+
Returns:
+

dict: possible attributes keyed on attr name.

+
+
+
+ +
+
+seed.lib.merging.merging.get_propertystate_attrs(data_set_buildings)
+
+ +
+
+seed.lib.merging.merging.get_state_attrs(state_list)
+

Return a list of state attributes. This does not include any of the extra data columns

+
+ +
+
+seed.lib.merging.merging.get_state_to_state_tuple(inventory)
+

Return the list of the database fields based on the inventory type

+
+ +
+
+seed.lib.merging.merging.get_taxlotstate_attrs(data_set_buildings)
+
+ +
+
+seed.lib.merging.merging.merge_state(merged_state, state1, state2, priorities, ignore_merge_protection=False)
+

Set attributes on our Canonical model, saving differences.

+
+
Parameters:
+
    +
  • merged_state – PropertyState/TaxLotState model inst.

  • +
  • state1 – PropertyState/TaxLotState model inst. Left parent.

  • +
  • state2 – PropertyState/TaxLotState model inst. Right parent.

  • +
  • priorities – dict, column names with favor new or existing

  • +
+
+
Returns:
+

inst(merged_state), updated.

+
+
+
+ +
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.management.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.management.html new file mode 100644 index 00000000..0c7fcc74 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.management.html @@ -0,0 +1,176 @@ + + + + + + + Management Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Management Package

+
+

Subpackages

+
+
+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.managers.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.managers.html new file mode 100644 index 00000000..691144f2 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.managers.html @@ -0,0 +1,174 @@ + + + + + + + Managers Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Managers Package

+
+

Subpackages

+ +
+
+

Submodules

+
+
+

JSON

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.managers.tests.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.managers.tests.html new file mode 100644 index 00000000..669a0b05 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.managers.tests.html @@ -0,0 +1,162 @@ + + + + + + + Manager Tests Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Manager Tests Package

+
+

Submodules

+
+
+

Test JSON Manager

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.mappings.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.mappings.html new file mode 100644 index 00000000..9445a6ed --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.mappings.html @@ -0,0 +1,183 @@ + + + + + + + Mapping Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.models.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.models.html new file mode 100644 index 00000000..2219d766 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.models.html @@ -0,0 +1,4534 @@ + + + + + + + Models — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Models

+
+

Submodules

+
+
+

AuditLog

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Columns

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.columns.Column(*args, **kwargs)
+

Bases: Model

+

The name of a column for a given organization.

+
+
+COLUMN_EXCLUDE_FIELDS = ['bounding_box', 'centroid', 'created', 'data_state', 'extra_data', 'geocoding_confidence', 'id', 'import_file', 'long_lat', 'merge_state', 'raw_access_level_instance_error', 'raw_access_level_instance_id', 'source_type', 'updated', 'hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+COLUMN_MERGE_FAVOR_EXISTING = 1
+
+ +
+
+COLUMN_MERGE_FAVOR_NEW = 0
+
+ +
+
+COLUMN_MERGE_PROTECTION = [(0, 'Favor New'), (1, 'Favor Existing')]
+
+ +
+
+DATABASE_COLUMNS = [{'column_description': 'PM Property ID', 'column_name': 'pm_property_id', 'data_type': 'string', 'display_name': 'PM Property ID', 'table_name': 'PropertyState'}, {'column_description': 'PM Parent Property ID', 'column_name': 'pm_parent_property_id', 'data_type': 'string', 'display_name': 'PM Parent Property ID', 'table_name': 'PropertyState'}, {'column_description': 'Jurisdiction Tax Lot ID', 'column_name': 'jurisdiction_tax_lot_id', 'data_type': 'string', 'display_name': 'Jurisdiction Tax Lot ID', 'table_name': 'TaxLotState'}, {'column_description': 'Jurisdiction Property ID', 'column_name': 'jurisdiction_property_id', 'data_type': 'string', 'display_name': 'Jurisdiction Property ID', 'table_name': 'PropertyState'}, {'column_description': 'UBID', 'column_name': 'ubid', 'data_type': 'string', 'display_name': 'UBID', 'table_name': 'TaxLotState'}, {'column_description': 'UBID', 'column_name': 'ubid', 'data_type': 'string', 'display_name': 'UBID', 'table_name': 'PropertyState'}, {'column_description': 'Custom ID 1', 'column_name': 'custom_id_1', 'data_type': 'string', 'display_name': 'Custom ID 1', 'table_name': 'PropertyState'}, {'column_description': 'Custom ID 1', 'column_name': 'custom_id_1', 'data_type': 'string', 'display_name': 'Custom ID 1', 'table_name': 'TaxLotState'}, {'column_description': 'Audit Template Building ID', 'column_name': 'audit_template_building_id', 'data_type': 'string', 'display_name': 'Audit Template Building ID', 'table_name': 'PropertyState'}, {'column_description': 'Address Line 1', 'column_name': 'address_line_1', 'data_type': 'string', 'display_name': 'Address Line 1', 'table_name': 'PropertyState'}, {'column_description': 'Address Line 1', 'column_name': 'address_line_1', 'data_type': 'string', 'display_name': 'Address Line 1', 'table_name': 'TaxLotState'}, {'column_description': 'Address Line 2', 'column_name': 'address_line_2', 'data_type': 'string', 'display_name': 'Address Line 2', 'table_name': 'PropertyState'}, {'column_description': 'Address Line 2', 'column_name': 'address_line_2', 'data_type': 'string', 'display_name': 'Address Line 2', 'table_name': 'TaxLotState'}, {'column_description': 'City', 'column_name': 'city', 'data_type': 'string', 'display_name': 'City', 'table_name': 'PropertyState'}, {'column_description': 'City', 'column_name': 'city', 'data_type': 'string', 'display_name': 'City', 'table_name': 'TaxLotState'}, {'column_description': 'State', 'column_name': 'state', 'data_type': 'string', 'display_name': 'State', 'table_name': 'PropertyState'}, {'column_description': 'State', 'column_name': 'state', 'data_type': 'string', 'display_name': 'State', 'table_name': 'TaxLotState'}, {'column_description': 'Normalized Address', 'column_name': 'normalized_address', 'data_type': 'string', 'display_name': 'Normalized Address', 'table_name': 'PropertyState'}, {'column_description': 'Normalized Address', 'column_name': 'normalized_address', 'data_type': 'string', 'display_name': 'Normalized Address', 'table_name': 'TaxLotState'}, {'column_description': 'Postal Code', 'column_name': 'postal_code', 'data_type': 'string', 'display_name': 'Postal Code', 'table_name': 'PropertyState'}, {'column_description': 'Postal Code', 'column_name': 'postal_code', 'data_type': 'string', 'display_name': 'Postal Code', 'table_name': 'TaxLotState'}, {'column_description': 'Associated Tax Lot ID', 'column_name': 'lot_number', 'data_type': 'string', 'display_name': 'Associated Tax Lot ID', 'table_name': 'PropertyState'}, {'column_description': 'Property Name', 'column_name': 'property_name', 'data_type': 'string', 'display_name': 'Property Name', 'table_name': 'PropertyState'}, {'column_description': 'Latitude', 'column_name': 'latitude', 'data_type': 'number', 'display_name': 'Latitude', 'table_name': 'PropertyState'}, {'column_description': 'Longitude', 'column_name': 'longitude', 'data_type': 'number', 'display_name': 'Longitude', 'table_name': 'PropertyState'}, {'column_description': 'Latitude', 'column_name': 'latitude', 'data_type': 'number', 'display_name': 'Latitude', 'table_name': 'TaxLotState'}, {'column_description': 'Longitude', 'column_name': 'longitude', 'data_type': 'number', 'display_name': 'Longitude', 'table_name': 'TaxLotState'}, {'column_description': 'Geocoding Confidence', 'column_name': 'geocoding_confidence', 'data_type': 'string', 'display_name': 'Geocoding Confidence', 'table_name': 'PropertyState'}, {'column_description': 'Geocoding Confidence', 'column_name': 'geocoding_confidence', 'data_type': 'string', 'display_name': 'Geocoding Confidence', 'table_name': 'TaxLotState'}, {'column_description': 'Property Footprint', 'column_name': 'property_footprint', 'data_type': 'geometry', 'display_name': 'Property Footprint', 'table_name': 'PropertyState'}, {'column_description': 'Tax Lot Footprint', 'column_name': 'taxlot_footprint', 'data_type': 'geometry', 'display_name': 'Tax Lot Footprint', 'table_name': 'TaxLotState'}, {'column_description': 'Updated', 'column_name': 'updated', 'data_type': 'datetime', 'display_name': 'Updated', 'table_name': 'PropertyState'}, {'column_description': 'Created', 'column_name': 'created', 'data_type': 'datetime', 'display_name': 'Created', 'table_name': 'PropertyState'}, {'column_description': 'Updated', 'column_name': 'updated', 'data_type': 'datetime', 'display_name': 'Updated', 'table_name': 'TaxLotState'}, {'column_description': 'Created', 'column_name': 'created', 'data_type': 'datetime', 'display_name': 'Created', 'table_name': 'TaxLotState'}, {'column_description': 'Gross Floor Area', 'column_name': 'gross_floor_area', 'data_type': 'area', 'display_name': 'Gross Floor Area', 'table_name': 'PropertyState'}, {'column_description': 'Use Description', 'column_name': 'use_description', 'data_type': 'string', 'display_name': 'Use Description', 'table_name': 'PropertyState'}, {'column_description': 'ENERGY STAR Score', 'column_name': 'energy_score', 'data_type': 'integer', 'display_name': 'ENERGY STAR Score', 'table_name': 'PropertyState'}, {'column_description': 'Property Notes', 'column_name': 'property_notes', 'data_type': 'string', 'display_name': 'Property Notes', 'table_name': 'PropertyState'}, {'column_description': 'Property Type', 'column_name': 'property_type', 'data_type': 'string', 'display_name': 'Property Type', 'table_name': 'PropertyState'}, {'column_description': 'Year Ending', 'column_name': 'year_ending', 'data_type': 'date', 'display_name': 'Year Ending', 'table_name': 'PropertyState'}, {'column_description': 'Owner', 'column_name': 'owner', 'data_type': 'string', 'display_name': 'Owner', 'table_name': 'PropertyState'}, {'column_description': 'Owner Email', 'column_name': 'owner_email', 'data_type': 'string', 'display_name': 'Owner Email', 'table_name': 'PropertyState'}, {'column_description': 'Owner Telephone', 'column_name': 'owner_telephone', 'data_type': 'string', 'display_name': 'Owner Telephone', 'table_name': 'PropertyState'}, {'column_description': 'Building Count', 'column_name': 'building_count', 'data_type': 'integer', 'display_name': 'Building Count', 'table_name': 'PropertyState'}, {'column_description': 'Year Built', 'column_name': 'year_built', 'data_type': 'integer', 'display_name': 'Year Built', 'table_name': 'PropertyState'}, {'column_description': 'Recent Sale Date', 'column_name': 'recent_sale_date', 'data_type': 'datetime', 'display_name': 'Recent Sale Date', 'table_name': 'PropertyState'}, {'column_description': 'Conditioned Floor Area', 'column_name': 'conditioned_floor_area', 'data_type': 'area', 'display_name': 'Conditioned Floor Area', 'table_name': 'PropertyState'}, {'column_description': 'Occupied Floor Area', 'column_name': 'occupied_floor_area', 'data_type': 'area', 'display_name': 'Occupied Floor Area', 'table_name': 'PropertyState'}, {'column_description': 'Owner Address', 'column_name': 'owner_address', 'data_type': 'string', 'display_name': 'Owner Address', 'table_name': 'PropertyState'}, {'column_description': 'Owner City/State', 'column_name': 'owner_city_state', 'data_type': 'string', 'display_name': 'Owner City/State', 'table_name': 'PropertyState'}, {'column_description': 'Owner Postal Code', 'column_name': 'owner_postal_code', 'data_type': 'string', 'display_name': 'Owner Postal Code', 'table_name': 'PropertyState'}, {'column_description': 'Home Energy Score ID', 'column_name': 'home_energy_score_id', 'data_type': 'string', 'display_name': 'Home Energy Score ID', 'table_name': 'PropertyState'}, {'column_description': 'PM Generation Date', 'column_name': 'generation_date', 'data_type': 'datetime', 'display_name': 'PM Generation Date', 'table_name': 'PropertyState'}, {'column_description': 'PM Release Date', 'column_name': 'release_date', 'data_type': 'datetime', 'display_name': 'PM Release Date', 'table_name': 'PropertyState'}, {'column_description': 'Site EUI', 'column_name': 'site_eui', 'data_type': 'eui', 'display_name': 'Site EUI', 'table_name': 'PropertyState'}, {'column_description': 'Site EUI Weather Normalized', 'column_name': 'site_eui_weather_normalized', 'data_type': 'eui', 'display_name': 'Site EUI Weather Normalized', 'table_name': 'PropertyState'}, {'column_description': 'Site EUI Modeled', 'column_name': 'site_eui_modeled', 'data_type': 'eui', 'display_name': 'Site EUI Modeled', 'table_name': 'PropertyState'}, {'column_description': 'Source EUI', 'column_name': 'source_eui', 'data_type': 'eui', 'display_name': 'Source EUI', 'table_name': 'PropertyState'}, {'column_description': 'Source EUI Weather Normalized', 'column_name': 'source_eui_weather_normalized', 'data_type': 'eui', 'display_name': 'Source EUI Weather Normalized', 'table_name': 'PropertyState'}, {'column_description': 'Source EUI Modeled', 'column_name': 'source_eui_modeled', 'data_type': 'eui', 'display_name': 'Source EUI Modeled', 'table_name': 'PropertyState'}, {'column_description': 'Energy Alerts', 'column_name': 'energy_alerts', 'data_type': 'string', 'display_name': 'Energy Alerts', 'table_name': 'PropertyState'}, {'column_description': 'Space Alerts', 'column_name': 'space_alerts', 'data_type': 'string', 'display_name': 'Space Alerts', 'table_name': 'PropertyState'}, {'column_description': 'Building Certification', 'column_name': 'building_certification', 'data_type': 'string', 'display_name': 'Building Certification', 'table_name': 'PropertyState'}, {'column_description': 'Number Properties', 'column_name': 'number_properties', 'data_type': 'integer', 'display_name': 'Number Properties', 'table_name': 'TaxLotState'}, {'column_description': 'Block Number', 'column_name': 'block_number', 'data_type': 'string', 'display_name': 'Block Number', 'table_name': 'TaxLotState'}, {'column_description': 'District', 'column_name': 'district', 'data_type': 'string', 'display_name': 'District', 'table_name': 'TaxLotState'}, {'column_description': 'eGRID Subregion Code', 'column_name': 'egrid_subregion_code', 'data_type': 'string', 'display_name': 'eGRID Subregion Code', 'table_name': 'PropertyState'}, {'column_description': 'Total GHG Emissions', 'column_name': 'total_ghg_emissions', 'data_type': 'ghg', 'display_name': 'Total GHG Emissions', 'table_name': 'PropertyState'}, {'column_description': 'Total Marginal GHG Emissions', 'column_name': 'total_marginal_ghg_emissions', 'data_type': 'ghg', 'display_name': 'Total Marginal GHG Emissions', 'table_name': 'PropertyState'}, {'column_description': 'Total GHG Emissions Intensity', 'column_name': 'total_ghg_emissions_intensity', 'data_type': 'ghg_intensity', 'display_name': 'Total GHG Emissions Intensity', 'table_name': 'PropertyState'}, {'column_description': 'Total Marginal GHG Emissions Intensity', 'column_name': 'total_marginal_ghg_emissions_intensity', 'data_type': 'ghg_intensity', 'display_name': 'Total Marginal GHG Emissions Intensity', 'table_name': 'PropertyState'}, {'column_description': 'Time zone of the property', 'column_name': 'property_timezone', 'data_type': 'string', 'display_name': 'Property Time Zone', 'table_name': 'PropertyState'}]
+
+ +
+
+DATA_TYPE_PARSERS: dict[str, Callable] = {'area': <function Column.<lambda>>, 'boolean': <function Column.<lambda>>, 'date': <function Column.<lambda>>, 'datetime': <built-in method fromisoformat of type object>, 'eui': <function Column.<lambda>>, 'float': <function Column.<lambda>>, 'geometry': <class 'str'>, 'ghg': <function Column.<lambda>>, 'ghg_intensity': <function Column.<lambda>>, 'integer': <function Column.<lambda>>, 'number': <function Column.<lambda>>, 'string': <class 'str'>}
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+EXCLUDED_API_FIELDS = ['normalized_address']
+
+ +
+
+EXCLUDED_COLUMN_RETURN_FIELDS = ['hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+EXCLUDED_MAPPING_FIELDS = ['created', 'extra_data', 'lot_number', 'normalized_address', 'geocoded_address', 'geocoded_postal_code', 'geocoded_side_of_street', 'geocoded_country', 'geocoded_state', 'geocoded_county', 'geocoded_city', 'geocoded_neighborhood', 'updated']
+
+ +
+
+EXCLUDED_RENAME_FROM_FIELDS = ['lot_number', 'year_built', 'property_footprint', 'taxlot_footprint', 'bounding_box', 'centroid', 'created', 'data_state', 'extra_data', 'geocoding_confidence', 'id', 'import_file', 'long_lat', 'merge_state', 'raw_access_level_instance_error', 'raw_access_level_instance_id', 'source_type', 'updated', 'hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+EXCLUDED_RENAME_TO_FIELDS = ['lot_number', 'latitude', 'longitude', 'year_built', 'property_footprint', 'created', 'updated', 'bounding_box', 'centroid', 'created', 'data_state', 'extra_data', 'geocoding_confidence', 'id', 'import_file', 'long_lat', 'merge_state', 'raw_access_level_instance_error', 'raw_access_level_instance_id', 'source_type', 'updated', 'hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+INTERNAL_TYPE_TO_DATA_TYPE = {'BooleanField': 'boolean', 'CharField': 'string', 'DateField': 'date', 'DateTimeField': 'datetime', 'FloatField': 'double', 'IntegerField': 'integer', 'JSONField': 'string', 'PointField': 'geometry', 'PolygonField': 'geometry', 'TextField': 'string'}
+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+PINNED_COLUMNS = [('PropertyState', 'pm_property_id'), ('TaxLotState', 'jurisdiction_tax_lot_id')]
+
+ +
+
+QUANTITY_UNIT_COLUMNS = [('PropertyState', 'gross_floor_area'), ('PropertyState', 'occupied_floor_area'), ('PropertyState', 'conditioned_floor_area'), ('PropertyState', 'site_eui'), ('PropertyState', 'site_eui_modeled'), ('PropertyState', 'site_eui_weather_normalized'), ('PropertyState', 'source_eui'), ('PropertyState', 'source_eui_modeled'), ('PropertyState', 'source_eui_weather_normalized'), ('PropertyState', 'total_ghg_emissions'), ('PropertyState', 'total_marginal_ghg_emissions'), ('PropertyState', 'total_ghg_emissions_intensity'), ('PropertyState', 'total_marginal_ghg_emissions_intensity')]
+
+ +
+
+SHARED_FIELD_TYPES = ((0, 'None'), (1, 'Public'))
+
+ +
+
+SHARED_NONE = 0
+
+ +
+
+SHARED_PUBLIC = 1
+
+ +
+
+UNMAPPABLE_PROPERTY_FIELDS = ['created', 'geocoding_confidence', 'lot_number', 'updated']
+
+ +
+
+UNMAPPABLE_TAXLOT_FIELDS = ['created', 'geocoding_confidence', 'updated']
+
+ +
+
+account_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+actual_emission_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+actual_energy_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+benchmark_id_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+cast(value: Any) Any
+

Cast the value to the correct type for the column.

+
+
Args:

value (Any): Value to cast, typically a string.

+
+
+
+ +
+
+static cast_column_value(column_data_type: str, value: Any, allow_none: bool = True) Any
+

cast a single value from the column data type

+
+
Args:

column_data_type (str): The data type as defined in the column object +value (Any): value to cast. Note the value may already be cast correctly.

+
+
Raises:

Exception: CastException if the value cannot be cast to the correct type

+
+
Returns:

Any: Resulting casted value

+
+
+
+ +
+
+clean()
+

Hook for doing any extra model-wide validation after clean() has been +called on every field by self.clean_fields. Any ValidationError raised +by this method will not be associated with a particular field; it will +have a special-case association with the field defined by NON_FIELD_ERRORS.

+
+ +
+
+column_description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+column_list_profiles
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+column_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+columnlistprofilecolumn_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+comstock_mapping
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+contact_email_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+contact_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+static create_mappings(mappings, organization, user, import_file_id=None)
+

Create the mappings for an organization and a user based on a simple +array of array object.

+
+
Parameters:
+
    +
  • mappings – dict, dictionary containing mapping information

  • +
  • organization – inst, organization object

  • +
  • user – inst, User object

  • +
  • import_file_id – integer, If passed, will cache the column mappings data into the +import_file_id object.

  • +
+
+
+

:return Boolean, True is data are saved in the ColumnMapping table in the database

+
+ +
+
+static create_mappings_from_file(filename, organization, user, import_file_id=None)
+

Load the mappings in from a file in a very specific file format. The columns in the file +must be:

+
+
    +
  1. raw field

  2. +
  3. table name

  4. +
  5. field name

  6. +
  7. field display name

  8. +
  9. field data type

  10. +
  11. field unit type

  12. +
+
+
+
Parameters:
+
    +
  • filename – string, absolute path and name of file to load

  • +
  • organization – id, organization id

  • +
  • user – id, user id

  • +
  • import_file_id – Integer, If passed, will cache the column mappings data into +the import_file_id object.

  • +
+
+
Returns:
+

ColumnMapping, True

+
+
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_admin_account_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+data_admin_email_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+data_admin_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+data_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+dataviewparameter_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+static delete_all(organization)
+

Delete all the columns for an organization. Note that this will invalidate all the +data that is in the extra_data fields of the inventory and is irreversible.

+
+
Parameters:
+

organization – instance, Organization

+
+
Returns:
+

[int, int] Number of columns, column_mappings records that were deleted

+
+
+
+ +
+
+derived_column
+

Accessor to the related object on the forward side of a one-to-one relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Restaurant.place is a ForwardOneToOneDescriptor instance.

+
+ +
+
+derived_column_id
+
+ +
+
+derivedcolumn_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+derivedcolumnparameter_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+display_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+geocoding_order
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_merge_protection_display(*, field=<django.db.models.fields.IntegerField: merge_protection>)
+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_modified(*, field=<django.db.models.fields.DateTimeField: modified>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_modified(*, field=<django.db.models.fields.DateTimeField: modified>, is_next=False, **kwargs)
+
+ +
+
+get_shared_field_type_display(*, field=<django.db.models.fields.IntegerField: shared_field_type>)
+
+ +
+
+goal_area_columns
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+goal_eui_column1s
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+goal_eui_column2s
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+goal_eui_column3s
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_file
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+import_file_id
+
+ +
+
+is_extra_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+is_matching_criteria
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+mapped_mappings
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+merge_protection
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+modified
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+raw_mappings
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+recognize_empty
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+rename_column(new_column_name, force=False)
+

Rename the column and move all the data to the new column. This can move the +data from a canonical field to an extra data field or vice versa. By default the +column.

+
+
Parameters:
+
    +
  • new_column_name – string new name of column

  • +
  • force – boolean force the overwrite of data in the column?

  • +
+
+
Returns:
+

+
+
+
+ +
+
+static retrieve_all(org_id: int, inventory_type: Literal['property', 'taxlot'] | None = None, only_used: bool = False, include_related: bool = True, exclude_derived: bool = False, column_ids: list[int] | None = None) list[dict]
+

Retrieve all the columns for an organization. This method will query for all the columns in the +database assigned to the organization. It will then go through and cleanup the names to ensure that +there are no duplicates. The name column is used for uniquely labeling the columns for UI Grid purposes.

+
+
Parameters:
+
    +
  • org_id – Organization ID

  • +
  • inventory_type – Inventory Type (property|taxlot) from the requester. This sets the related columns if requested.

  • +
  • only_used – View only the used columns that exist in the Column’s table

  • +
  • include_related – Include related columns (e.g., if inventory type is Property, include Taxlot columns)

  • +
  • exclude_derived – Exclude derived columns.

  • +
  • column_ids – List of Column ids.

  • +
+
+
+
+ +
+
+static retrieve_all_by_tuple(org_id)
+

Return list of all columns for an organization as a tuple.

+
[
+    ("PropertyState", "address_line_1"),
+    ("PropertyState", "address_line_2"),
+    ("PropertyState", "building_certification"),
+    ("PropertyState", "building_count"),
+    ("TaxLotState", "address_line_1"),
+    ("TaxLotState", "address_line_2"),
+    ("TaxLotState", "block_number"),
+    ("TaxLotState", "city"),
+    ("TaxLotState", "jurisdiction_tax_lot_id"),
+]
+
+
+
+
Parameters:
+

org_id – int, Organization ID

+
+
Returns:
+

list of tuples

+
+
+
+ +
+
+static retrieve_db_field_name_for_hash_comparison()
+

Names only of the columns in the database (fields only, not extra data), independent of inventory type. +These fields are used for generating an MD5 hash to quickly check if the data are the same across +multiple records. Note that this ignores extra_data. The result is a superset of all the fields that are used +in the database across all of the inventory types of interest.

+
+
Returns:
+

list, names of columns, independent of inventory type.

+
+
+
+ +
+
+static retrieve_db_field_table_and_names_from_db_tables()
+

Similar to keys, except it returns a list of tuples of the columns that are in the database

+
[
+    ("PropertyState", "address_line_1"),
+    ("PropertyState", "address_line_2"),
+    ("PropertyState", "building_certification"),
+    ("PropertyState", "building_count"),
+    ("TaxLotState", "address_line_1"),
+    ("TaxLotState", "address_line_2"),
+    ("TaxLotState", "block_number"),
+    ("TaxLotState", "city"),
+    ("TaxLotState", "jurisdiction_tax_lot_id"),
+]
+
+
+

:return:list of tuples

+
+ +
+
+static retrieve_db_fields(org_id)
+

return the fields in the database regardless of properties or taxlots. For example, there is an address_line_1 +in both the TaxLotState and the PropertyState. The command below will take the set to remove the duplicates.

+

[ “address_line_1”, “gross_floor_area”, … ] +:param org_id: int, Organization ID +:return: list

+
+ +
+
+static retrieve_db_fields_from_db_tables()
+

Return the list of database fields that are in the models. This is independent of what are in the +Columns table.

+
+
Returns:
+

+
+
+
+ +
+
+static retrieve_db_types()
+

Return the data types for the database columns in the format of:

+
{
+  "field_name": "data_type",
+  "field_name_2": "data_type_2",
+  "address_line_1": "string",
+}
+
+
+
+
Returns:
+

dict

+
+
+
+ +
+
+static retrieve_mapping_columns(org_id, inventory_type=None)
+

Retrieve all the columns that are for mapping for an organization in a dictionary.

+
+
Parameters:
+
    +
  • org_id – org_id, Organization ID

  • +
  • inventory_type – Inventory Type (property|taxlot) from the requester. This sets the related columns if requested.

  • +
+
+
Returns:
+

list, list of dict

+
+
+
+ +
+
+static retrieve_priorities(org_id)
+

Return the list of priorities for the columns. Result will be in the form of:

+
{
+    'PropertyState': {
+        'lot_number': 'Favor New',
+        'owner_address': 'Favor New',
+        'extra_data': {
+            'data_007': 'Favor New'
+        }
+    'TaxLotState': {
+        'custom_id_1': 'Favor New',
+        'block_number': 'Favor New',
+        'extra_data': {
+            'data_008': 'Favor New'
+        }
+}
+
+
+
+
Parameters:
+

org_id – organization with the columns

+
+
Returns:
+

dict

+
+
+
+ +
+
+salesforce_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+save(*args, **kwargs)
+

Save the current instance. Override this in a subclass if you want to +control the saving process.

+

The ‘force_insert’ and ‘force_update’ parameters can be used to insist +that the “save” must be an SQL insert or update (or equivalent for +non-SQL backends), respectively. Normally, they should not be set.

+
+ +
+
+static save_column_names(model_obj)
+

Save unique column names for extra_data in this organization.

+

This is a record of all the extra_data keys we have ever seen +for a particular organization.

+
+
Parameters:
+

model_obj – model_obj instance (either PropertyState or TaxLotState).

+
+
+
+ +
+
+shared_field_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+table_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+target_emission_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+target_energy_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+unit
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+unit_id
+
+ +
+
+units_pint
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+x_axis_columns
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+exception seed.models.columns.ColumnCastError
+

Bases: Exception

+
+ +
+
+seed.models.columns.validate_model(sender, **kwargs)
+
+ +
+
+

Cycles

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.cycles.Cycle(id, organization, user, name, start, end, created)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+analysispropertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+cycles
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+dataview_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+end
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+event_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_end(*, field=<django.db.models.fields.DateField: end>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_start(*, field=<django.db.models.fields.DateField: start>, is_next=True, **kwargs)
+
+ +
+
+classmethod get_or_create_default(organization)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_end(*, field=<django.db.models.fields.DateField: end>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_start(*, field=<django.db.models.fields.DateField: start>, is_next=False, **kwargs)
+
+ +
+
+goal_baseline_cycles
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+goal_current_cycles
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+importfile_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+propertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+start
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+taxlotproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+user
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+user_id
+
+ +
+ +
+
+

Joins

+
+
+

Generic Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.models.StatusLabel(id, created, modified, name, color, super_organization, show_in_list)
+

Bases: TimeStampedModel

+
+
+BLUE_CHOICE = 'blue'
+
+ +
+
+COLOR_CHOICES = (('red', 'red'), ('blue', 'blue'), ('light blue', 'light blue'), ('green', 'green'), ('white', 'white'), ('orange', 'orange'), ('gray', 'gray'))
+
+ +
+
+DEFAULT_LABELS = ['Residential', 'Non-Residential', 'Violation', 'Compliant', 'Missing Data', 'Questionable Report', 'Update Bldg Info', 'Call', 'Email', 'High EUI', 'Low EUI', 'Exempted', 'Extension', 'Change of Ownership']
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+GRAY_CHOICE = 'gray'
+
+ +
+
+GREEN_CHOICE = 'green'
+
+ +
+
+LIGHT_BLUE_CHOICE = 'light blue'
+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+ORANGE_CHOICE = 'orange'
+
+ +
+
+RED_CHOICE = 'red'
+
+ +
+
+WHITE_CHOICE = 'white'
+
+ +
+
+and_filter_groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+color
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+compliance_label
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+exclude_filter_groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_color_display(*, field=<django.db.models.fields.CharField: color>)
+
+ +
+
+get_next_by_created(*, field=<django_extensions.db.fields.CreationDateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_modified(*, field=<django_extensions.db.fields.ModificationDateTimeField: modified>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django_extensions.db.fields.CreationDateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_modified(*, field=<django_extensions.db.fields.ModificationDateTimeField: modified>, is_next=False, **kwargs)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+indication_label
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+or_filter_groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyview_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+rule_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+show_in_list
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+super_organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+super_organization_id
+
+ +
+
+taxlotview_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+to_dict()
+
+ +
+
+violation_label
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.models.Unit(*args, **kwargs)
+

Bases: Model

+

Unit of measure for a Column Value.

+
+
+DATE = 4
+
+ +
+
+DATETIME = 5
+
+ +
+
+DECIMAL = 2
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+FLOAT = 3
+
+ +
+
+INTEGER = 6
+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+STRING = 1
+
+ +
+
+UNIT_TYPES = ((1, 'String'), (6, 'Integer'), (3, 'Float'), (4, 'Date'), (5, 'Datetime'))
+
+ +
+
+column_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_unit_type_display(*, field=<django.db.models.fields.IntegerField: unit_type>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+unit_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+unit_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+

Properties

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.properties.Property(*args, **kwargs)
+

Bases: Model

+

The Property is the parent property that ties together all the views of the property. +For example, if a building has multiple changes overtime, then this Property will always +remain the same. The PropertyView will point to the unchanged property as the PropertyState +and Property view are updated.

+

The property can also reference a parent property.

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+access_level_instance
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+access_level_instance_id
+
+ +
+
+analysispropertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+copy_meters(source_property_id, source_persists=True)
+

Copies meters from a source Property to the current Property.

+

It’s most efficient if the persistence of the source Property’s readings +aren’t needed as bulk reassignments can then be used.

+

The cases and logic are described in comments throughout.

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_loggers
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+events
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+goalnote_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+historical_note
+

Accessor to the related object on the reverse side of a one-to-one +relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Place.restaurant is a ReverseOneToOneDescriptor instance.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+inventory_documents
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+meters
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+parent_property
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_property_id
+
+ +
+
+property_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+views
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.properties.PropertyAuditLog(id, organization, parent1, parent2, parent_state1, parent_state2, state, view, name, description, import_filename, record_type, created)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_record_type_display(*, field=<django.db.models.fields.IntegerField: record_type>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_filename
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+parent1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent1_id
+
+ +
+
+parent2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent2_id
+
+ +
+
+parent_state1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state1_id
+
+ +
+
+parent_state2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state2_id
+
+ +
+
+propertyauditlog_parent1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyauditlog_parent2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+record_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+view
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+view_id
+
+ +
+ +
+
+class seed.models.properties.PropertyState(*args, **kwargs)
+

Bases: Model

+

Store a single property. This contains all the state information about the property

+

For property_timezone, use the pytz timezone strings. The US has the following and a full +list can be created by calling pytz.all_timezones in Python:

+
+
    +
  • US/Alaska

  • +
  • US/Aleutian

  • +
  • US/Arizona

  • +
  • US/Central

  • +
  • US/East-Indiana

  • +
  • US/Eastern

  • +
  • US/Hawaii

  • +
  • US/Indiana-Starke

  • +
  • US/Michigan

  • +
  • US/Mountain

  • +
  • US/Pacific

  • +
  • US/Samoa

  • +
+
+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+address_line_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+address_line_2
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+analysispropertyview
+

Accessor to the related object on the reverse side of a one-to-one +relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Place.restaurant is a ReverseOneToOneDescriptor instance.

+
+ +
+
+audit_template_building_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+bounding_box
+
+ +
+
+building_certification
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+building_count
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+building_files
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+centroid
+
+ +
+
+city
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+clean()
+

Hook for doing any extra model-wide validation after clean() has been +called on every field by self.clean_fields. Any ValidationError raised +by this method will not be associated with a particular field; it will +have a special-case association with the field defined by NON_FIELD_ERRORS.

+
+ +
+
+conditioned_floor_area
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+conditioned_floor_area_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+classmethod coparent(state_id)
+

Return the coparent of the PropertyState. This will query the PropertyAuditLog table to +determine if there is a coparent and return it if it is found. The state_id needs to be +the base ID of when the original record was imported

+
+
Parameters:
+

state_id – integer, state id to find coparent.

+
+
Returns:
+

dict

+
+
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+custom_id_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+egrid_subregion_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+energy_alerts
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+energy_score
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+extra_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+generation_date
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+geocoding_confidence
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_data_state_display(*, field=<django.db.models.fields.IntegerField: data_state>)
+
+ +
+
+get_merge_state_display(*, field=<django.db.models.fields.IntegerField: merge_state>)
+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+get_source_type_display(*, field=<django.db.models.fields.IntegerField: source_type>)
+
+ +
+
+gross_floor_area
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+gross_floor_area_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+hash_object
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+history()
+

Return the history of the property state by parsing through the auditlog. Returns only the ids +of the parent states and some descriptions.

+
+

main +/ / parent1 parent2

+
+

In the records, parent2 is most recent, so make sure to navigate parent two first since we +are returning the data in reverse over (that is most recent changes first)

+
+
Returns:
+

list, history as a list, and the main record

+
+
+
+ +
+
+home_energy_score_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_file
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+import_file_id
+
+ +
+
+jurisdiction_property_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+latitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+long_lat
+
+ +
+
+longitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+lot_number
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+measure_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+measures
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+classmethod merge_relationships(merged_state, state1, state2)
+

Merge together the old relationships with the new.

+
+
Parameters:
+
    +
  • merged_state – empty state to fill with merged state

  • +
  • state1*State

  • +
  • state2*State - given priority over state1

  • +
+
+
+
+ +
+
+merge_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+normalized_address
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+occupied_floor_area
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+occupied_floor_area_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+owner
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_address
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_city_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_email
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_postal_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_telephone
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+parent_state1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+parent_state2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+pm_parent_property_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+pm_property_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+postal_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+promote(cycle, property_id=None)
+

Promote the PropertyState to the view table for the given cycle

+
+
Args:

cycle: Cycle to assign the view +property_id: Optional ID of a canonical property model object +to retain instead of creating a new property

+
+
Returns:

The resulting PropertyView (note that it is not returning the +PropertyState)

+
+
+
+ +
+
+property_footprint
+
+ +
+
+property_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property_notes
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property_timezone
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+propertyauditlog_state
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertymeasure_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+raw_access_level_instance
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+raw_access_level_instance_error
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+raw_access_level_instance_id
+
+ +
+
+recent_sale_date
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+release_date
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+save(*args, **kwargs)
+

Save the current instance. Override this in a subclass if you want to +control the saving process.

+

The ‘force_insert’ and ‘force_update’ parameters can be used to insist +that the “save” must be an SQL insert or update (or equivalent for +non-SQL backends), respectively. Normally, they should not be set.

+
+ +
+
+scenarios
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+simulation
+

Accessor to the related object on the reverse side of a one-to-one +relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Place.restaurant is a ReverseOneToOneDescriptor instance.

+
+ +
+
+site_eui
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_modeled
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_modeled_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_weather_normalized
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_weather_normalized_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_modeled
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_modeled_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_weather_normalized
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_weather_normalized_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+space_alerts
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+to_dict(fields=None, include_related_data=True)
+

Returns a dict version of the PropertyState, either with all fields +or masked to just those requested.

+
+ +
+
+total_ghg_emissions
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+total_ghg_emissions_intensity
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+total_marginal_ghg_emissions
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+total_marginal_ghg_emissions_intensity
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+ubid
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+ubidmodel_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+use_description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+year_built
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+year_ending
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+class seed.models.properties.PropertyView(*args, **kwargs)
+

Bases: Model

+

Similar to the old world of canonical building.

+

A PropertyView contains a reference to a property (which should not change) and to a +cycle (time period), and a state (characteristics).

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+cycle
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+cycle_id
+
+ +
+
+gapauditlog_view
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+greenassessmentproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property import_filename
+

Get the import file name form the audit logs

+
+ +
+
+initialize_audit_logs(**kwargs)
+
+ +
+
+labels
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+notes
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+property
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+property_id
+
+ +
+
+propertyauditlog_view
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+tax_lot_states()
+

Return a list of TaxLotStates associated with this PropertyView and Cycle

+
+
Returns:
+

list of TaxLotStates

+
+
+
+ +
+
+tax_lot_views()
+

Return a list of TaxLotViews that are associated with this PropertyView and Cycle

+
+
Returns:
+

list of TaxLotViews

+
+
+
+ +
+
+taxlotproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+seed.models.properties.post_save_property(sender, instance, created, **kwargs)
+
+ +
+
+seed.models.properties.post_save_property_state(sender, **kwargs)
+

Generate UbidModels for a PropertyState if the ubid field is present

+
+ +
+
+seed.models.properties.post_save_property_view(sender, **kwargs)
+

When changing/saving the PropertyView, go ahead and touch the Property (if linked) so that the +record receives an updated datetime

+
+ +
+
+seed.models.properties.pre_delete_state(sender, **kwargs)
+
+ +
+
+seed.models.properties.set_default_access_level_instance(sender, instance, **kwargs)
+

If ALI not set, put this Property as the root.

+
+ +
+
+seed.models.properties.sync_latitude_longitude_and_long_lat(sender, instance, **kwargs)
+
+ +
+
+

TaxLots

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.tax_lots.TaxLot(id, organization, access_level_instance, created, updated)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+access_level_instance
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+access_level_instance_id
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+views
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.tax_lots.TaxLotAuditLog(id, organization, parent1, parent2, parent_state1, parent_state2, state, view, name, description, import_filename, record_type, created)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_record_type_display(*, field=<django.db.models.fields.IntegerField: record_type>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_filename
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+parent1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent1_id
+
+ +
+
+parent2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent2_id
+
+ +
+
+parent_state1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state1_id
+
+ +
+
+parent_state2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state2_id
+
+ +
+
+record_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+taxlotauditlog_parent1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotauditlog_parent2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+view
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+view_id
+
+ +
+ +
+
+class seed.models.tax_lots.TaxLotState(id, import_file, organization, data_state, merge_state, raw_access_level_instance, raw_access_level_instance_error, custom_id_1, jurisdiction_tax_lot_id, block_number, district, address_line_1, address_line_2, normalized_address, city, state, postal_code, number_properties, extra_data, hash_object, latitude, longitude, long_lat, centroid, bounding_box, taxlot_footprint, ubid, geocoding_confidence, created, updated)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+address_line_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+address_line_2
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+block_number
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+bounding_box
+
+ +
+
+centroid
+
+ +
+
+city
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+classmethod coparent(state_id)
+

Return the coparent of the TaxLotState. This will query the TaxLotAuditLog table to +determine if there is a coparent and return it if it is found. The state_id needs to be +the base ID of when the original record was imported

+
+
Parameters:
+

state_id – integer, state id to find coparent.

+
+
Returns:
+

dict

+
+
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+custom_id_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+district
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+extra_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+geocoding_confidence
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_data_state_display(*, field=<django.db.models.fields.IntegerField: data_state>)
+
+ +
+
+get_merge_state_display(*, field=<django.db.models.fields.IntegerField: merge_state>)
+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+hash_object
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+history()
+

Return the history of the taxlot state by parsing through the auditlog. Returns only the ids +of the parent states and some descriptions.

+
+
+

main

+
+

/ / parent1 parent2

+
+

In the records, parent2 is most recent, so make sure to navigate parent two first since we +are returning the data in reverse over (that is most recent changes first)

+
+
Returns:
+

list, history as a list, and the main record

+
+
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_file
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+import_file_id
+
+ +
+
+jurisdiction_tax_lot_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+latitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+long_lat
+
+ +
+
+longitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+classmethod merge_relationships(merged_state, state1, state2)
+

Stub to implement if merging TaxLotState relationships is needed

+
+ +
+
+merge_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+normalized_address
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+number_properties
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+postal_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+promote(cycle)
+

Promote the TaxLotState to the view table for the given cycle

+
+
Args:

cycle: Cycle to assign the view

+
+
Returns:

The resulting TaxLotView (note that it is not returning the +TaxLotState)

+
+
+
+ +
+
+raw_access_level_instance
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+raw_access_level_instance_error
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+raw_access_level_instance_id
+
+ +
+
+save(*args, **kwargs)
+

Save the current instance. Override this in a subclass if you want to +control the saving process.

+

The ‘force_insert’ and ‘force_update’ parameters can be used to insist +that the “save” must be an SQL insert or update (or equivalent for +non-SQL backends), respectively. Normally, they should not be set.

+
+ +
+
+state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+taxlot_footprint
+
+ +
+
+taxlotauditlog_parent_state1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotauditlog_parent_state2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotauditlog_state
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+to_dict(fields=None, include_related_data=True)
+

Returns a dict version of the TaxLotState, either with all fields +or masked to just those requested.

+
+ +
+
+ubid
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+ubidmodel_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+class seed.models.tax_lots.TaxLotView(id, taxlot, state, cycle)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+cycle
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+cycle_id
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property import_filename
+

Get the import file name form the audit logs

+
+ +
+
+initialize_audit_logs(**kwargs)
+
+ +
+
+labels
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+notes
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+property_states()
+

Return a list of PropertyStates associated with this TaxLotView and Cycle

+
+
Returns:
+

list of PropertyStates

+
+
+
+ +
+
+property_views()
+

Return a list of PropertyViews that are associated with this TaxLotView and Cycle

+
+
Returns:
+

list of PropertyViews

+
+
+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+taxlot
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+taxlot_id
+
+ +
+
+taxlotauditlog_view
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+seed.models.tax_lots.post_save_taxlot_state(sender, **kwargs)
+

Generate UbidModels for a TaxLotState if the ubid field is present

+
+ +
+
+seed.models.tax_lots.post_save_taxlot_view(sender, **kwargs)
+

When changing/saving the TaxLotView, go ahead and touch the TaxLot (if linked) so that the record +receives an updated datetime

+
+ +
+
+seed.models.tax_lots.set_default_access_level_instance(sender, instance, **kwargs)
+

If ALI not set, put this TaxLot as the root.

+
+ +
+
+seed.models.tax_lots.sync_latitude_longitude_and_long_lat(sender, instance, **kwargs)
+
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.public.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.public.html new file mode 100644 index 00000000..27632167 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.public.html @@ -0,0 +1,159 @@ + + + + + + + Public Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Public Package

+
+

Submodules

+
+
+

Models

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.serializers.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.serializers.html new file mode 100644 index 00000000..d8957386 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.serializers.html @@ -0,0 +1,254 @@ + + + + + + + Serializers Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Serializers Package

+
+

Submodules

+
+
+

Serializers

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.serializers.celery.CeleryDatetimeSerializer(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)
+

Bases: JSONEncoder

+
+
+default(obj)
+

Implement this method in a subclass such that it returns +a serializable object for o, or calls the base implementation +(to raise a TypeError).

+

For example, to support arbitrary iterators, you could +implement default like this:

+
def default(self, o):
+    try:
+        iterable = iter(o)
+    except TypeError:
+        pass
+    else:
+        return list(iterable)
+    # Let the base class default method raise the TypeError
+    return JSONEncoder.default(self, o)
+
+
+
+ +
+
+static seed_decoder(obj)
+
+ +
+
+static seed_dumps(obj)
+
+ +
+
+static seed_loads(obj)
+
+ +
+ +
+
+

Labels

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.serializers.labels.LabelSerializer(*args, **kwargs)
+

Bases: ModelSerializer

+
+
+class Meta
+

Bases: object

+
+
+extra_kwargs = {'super_organization': {'write_only': True}}
+
+ +
+
+fields = ('id', 'name', 'color', 'organization_id', 'super_organization', 'is_applied', 'show_in_list')
+
+ +
+
+model
+

alias of StatusLabel

+
+ +
+ +
+
+get_is_applied(obj)
+
+ +
+
+to_representation(instance)
+

Object instance -> Dict of primitive datatypes.

+
+ +
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.templatetags.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.templatetags.html new file mode 100644 index 00000000..ee82ecec --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.templatetags.html @@ -0,0 +1,277 @@ + + + + + + + Templatetags Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Templatetags Package

+
+

Submodules

+
+
+

Breadcrumbs

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

breadcrumbs.py, https://bitbucket.org/Mathiasdm/django-simple-breadcrumbs/

+
+
+class seed.templatetags.breadcrumbs.BreadcrumbNode(variables, render_func=<function create_crumb>)
+

Bases: Node

+
+
+render(context)
+

Return the node rendered as a string.

+
+ +
+ +
+
+class seed.templatetags.breadcrumbs.UrlBreadcrumbNode(title, url_node, render_func=<function create_crumb>)
+

Bases: Node

+
+
+render(context)
+

Return the node rendered as a string.

+
+ +
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb(parser, token)
+

Section author: Andriy Drozdyuk

+

Renders the breadcrumb.

+

Example:

+
{% breadcrumb "Title of breadcrumb" url_var %}
+{% breadcrumb context_var  url_var %}
+{% breadcrumb "Just the title" %}
+{% breadcrumb just_context_var %}
+
+
+

Parameters:

+
First parameter is the title of the crumb
+Second (optional) parameter is the url variable to link to, produced by url tag, i.e.:
+    {% url "person_detail" object.id as person_url %}
+    then:
+    {% breadcrumb person.name person_url %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb_root(parser, token)
+

Section author: Andriy Drozdyuk

+

Renders the breadcrumb.

+

Examples:

+
{% breadcrumb "Title of breadcrumb" url_var %}
+{% breadcrumb context_var  url_var %}
+{% breadcrumb "Just the title" %}
+{% breadcrumb just_context_var %}
+
+
+

Parameters:

+
First parameter is the title of the crumb,
+Second (optional) parameter is the url variable to link to, produced by url tag, i.e.:
+    {% url "person_detail/" object.id as person_url %}
+    then:
+    {% breadcrumb person.name person_url %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb_url(parser, token)
+

Same as breadcrumb but instead of url context variable takes in all the +arguments URL tag takes.

+
{% breadcrumb "Title of breadcrumb" person_detail person.id %}
+{% breadcrumb person.name person_detail person.id %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb_url_root(parser, token)
+

Same as breadcrumb but instead of url context variable takes in all the +arguments URL tag takes.

+
{% breadcrumb "Title of breadcrumb" person_detail person.id %}
+{% breadcrumb person.name person_detail person.id %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.create_crumb(title, url=None)
+

Helper function

+
+ +
+
+seed.templatetags.breadcrumbs.create_crumb_first(title, url=None)
+

Helper function

+
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.test_helpers.factory.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.test_helpers.factory.html new file mode 100644 index 00000000..b4e3e30d --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.test_helpers.factory.html @@ -0,0 +1,298 @@ + + + + + + + Test Helper Factor Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Test Helper Factor Package

+
+

Subpackages

+ +
+
+

Submodules

+
+
+

Helpers

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.test_helpers.factory.helpers.DjangoFunctionalFactory
+

Bases: object

+
+
+classmethod invalid_test_cc_number()
+
+ +
+
+classmethod rand_bool()
+
+ +
+
+classmethod rand_city()
+
+ +
+
+classmethod rand_city_suffix()
+
+ +
+
+classmethod rand_currency(start=0, end=100)
+
+ +
+
+classmethod rand_date(start_year=1900, end_year=2011)
+
+ +
+
+classmethod rand_domain()
+
+ +
+
+classmethod rand_email()
+
+ +
+
+classmethod rand_float(start=0, end=100)
+
+ +
+
+classmethod rand_int(start=0, end=100)
+
+ +
+
+classmethod rand_name()
+
+ +
+
+classmethod rand_phone()
+
+ +
+
+classmethod rand_plant_name()
+
+ +
+
+classmethod rand_str(length=None)
+
+ +
+
+classmethod rand_street_address()
+
+ +
+
+classmethod rand_street_suffix()
+
+ +
+
+classmethod test_cc_number(valid=True)
+
+ +
+
+classmethod valid_test_cc_number()
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.test_helpers.factory.lib.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.test_helpers.factory.lib.html new file mode 100644 index 00000000..a7538296 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.test_helpers.factory.lib.html @@ -0,0 +1,189 @@ + + + + + + + Test Helper Factory Lib Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.test_helpers.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.test_helpers.html new file mode 100644 index 00000000..03933424 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.test_helpers.html @@ -0,0 +1,229 @@ + + + + + + + Test Helpers Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.tests.functional.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.tests.functional.html new file mode 100644 index 00000000..ea088317 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.tests.functional.html @@ -0,0 +1,194 @@ + + + + + + + Tests (Functional) Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.tests.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.tests.html new file mode 100644 index 00000000..dfb84e9f --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.tests.html @@ -0,0 +1,965 @@ + + + + + + + Tests Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tests Package

+
+

Submodules

+ +
+
+

Admin Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.test_admin_views.AdminViewsTest(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_add_org()
+

Happy path test for creating a new org.

+
+ +
+
+test_add_org_dupe()
+

Trying to create an org with a dupe name fails.

+
+ +
+
+test_add_owner_existing_org_to_non_root()
+
+ +
+
+test_add_user_existing_org()
+

Test creating a new user, adding them to an existing org +in the process.

+
+ +
+
+test_add_user_new_org()
+

Create a new user and a new org at the same time.

+
+ +
+
+test_add_user_no_org()
+

Should not be able to create a new user without either +selecting or creating an org at the same time.

+
+ +
+
+test_signup_process()
+

Simulates the entire new user signup process, from initial +account creation by an admin to receiving the signup email +to confirming the account and setting a password.

+
+ +
+
+test_signup_process_force_lowercase_email()
+

Simulates the signup and login forcing login username to lowercase

+
+ +
+ +
+
+

Decorators

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.test_decorators.ClassDecoratorTests(methodName='runTest')
+

Bases: TestCase

+
+
+test_ajax_request_class_dict()
+
+ +
+
+test_ajax_request_class_dict_status_error()
+
+ +
+
+test_ajax_request_class_dict_status_false()
+
+ +
+
+test_ajax_request_class_format_type()
+
+ +
+
+test_require_organization_id_class_no_org_id()
+
+ +
+
+test_require_organization_id_class_org_id()
+
+ +
+
+test_require_organization_id_class_org_id_not_int()
+
+ +
+ +
+
+class seed.tests.test_decorators.RequireOrganizationIDTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_require_organization_id_fail_no_key()
+
+ +
+
+test_require_organization_id_fail_not_numeric()
+
+ +
+
+test_require_organization_id_success_integer()
+
+ +
+
+test_require_organization_id_success_string()
+
+ +
+ +
+
+class seed.tests.test_decorators.TestDecorators(methodName='runTest')
+

Bases: TestCase

+

Tests for locking tasks and reporting progress.

+
+
+locked = 1
+
+ +
+
+pk = 34
+
+ +
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_get_prog_key()
+

We format our cache key properly.

+
+ +
+
+test_increment_cache()
+

Sum our progress by increments properly.

+
+ +
+
+test_locking()
+

Make sure we indicate we’re locked if and only if we’re inside the function.

+
+ +
+
+test_locking_w_exception()
+

Make sure we release our lock if we have had an exception.

+
+ +
+
+test_progress()
+

When a task finishes, it increments the progress counter properly.

+
+ +
+
+unlocked = 0
+
+ +
+ +
+
+exception seed.tests.test_decorators.TestError
+

Bases: Exception

+
+ +
+
+

Exporters

+
+
+

Models

+
+
+

Tasks

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.test_tasks.TestTasks(methodName='runTest')
+

Bases: TestCase

+

Tests for dealing with SEED related tasks.

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_delete_organization()
+
+ +
+ +
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.test_views.DatasetPermissionsTests(methodName='runTest')
+

Bases: AccessLevelBaseTestCase

+
+
+setUp()
+

SUPERUSER

+
+ +
+
+test_dataset_count()
+
+ +
+
+test_dataset_create()
+
+ +
+
+test_dataset_destroy()
+
+ +
+
+test_dataset_list()
+
+ +
+
+test_dataset_retrieve()
+
+ +
+
+test_dataset_update()
+
+ +
+ +
+
+class seed.tests.test_views.GetDatasetsViewsTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_delete_dataset()
+
+ +
+
+test_get_dataset()
+
+ +
+
+test_get_datasets()
+
+ +
+
+test_get_datasets_count()
+
+ +
+
+test_get_datasets_count_invalid()
+
+ +
+
+test_update_dataset()
+
+ +
+ +
+
+class seed.tests.test_views.ImportFileViewsTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_delete_file()
+
+ +
+
+test_get_import_file()
+
+ +
+
+test_get_matching_and_geocoding_results()
+
+ +
+ +
+
+class seed.tests.test_views.InventoryViewTests(methodName='runTest')
+

Bases: AssertDictSubsetMixin, DeleteModelsTestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_get_cycles()
+
+ +
+
+test_get_properties()
+
+ +
+
+test_get_properties_cycle_id()
+
+ +
+
+test_get_properties_empty_page()
+
+ +
+
+test_get_properties_page_not_an_integer()
+
+ +
+
+test_get_properties_pint_fields()
+
+ +
+
+test_get_properties_profile_id()
+
+ +
+
+test_get_properties_property_extra_data()
+
+ +
+
+test_get_properties_select_all()
+
+ +
+
+test_get_properties_taxlot_extra_data()
+
+ +
+
+test_get_properties_with_taxlots()
+
+ +
+
+test_get_properties_with_taxlots_with_footprints()
+
+ +
+
+test_get_properties_wrong_query_params()
+
+ +
+
+test_get_property()
+
+ +
+
+test_get_property_columns()
+
+ +
+
+test_get_property_multiple_taxlots()
+
+ +
+
+test_get_taxlot()
+
+ +
+
+test_get_taxlot_columns()
+
+ +
+
+test_get_taxlots()
+
+ +
+
+test_get_taxlots_empty_page()
+
+ +
+
+test_get_taxlots_extra_data()
+
+ +
+
+test_get_taxlots_multiple_taxlots()
+
+ +
+
+test_get_taxlots_no_cycle_id()
+
+ +
+
+test_get_taxlots_page_not_an_integer()
+
+ +
+
+test_get_taxlots_profile_id()
+
+ +
+
+test_postoffice()
+
+ +
+
+test_update_pint_fields_with_modified_display_settings()
+
+ +
+ +
+
+class seed.tests.test_views.MainViewTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_home()
+
+ +
+ +
+
+class seed.tests.test_views.TestMCMViews(methodName='runTest')
+

Bases: TestCase

+
+
+assert_expected_mappings(actual, expected)
+

For each k,v pair of form column_name: [dest_col, confidence] +in actual, assert that expected contains the same column_name +and dest_col mapping.

+
+ +
+
+expected_mappings = {'address': ['owner_address', 70], 'building id': ['Building air leakage', 64], 'name': ['Name of Audit Certification Holder', 47], 'year built': ['year_built', 50]}
+
+ +
+
+raw_columns_expected = {'raw_columns': ['name', 'address', 'year built', 'building id'], 'status': 'success'}
+
+ +
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_create_dataset()
+

tests the create_dataset view, allows duplicate dataset names

+
+ +
+
+test_get_column_mapping_suggestions()
+
+ +
+
+test_get_column_mapping_suggestions_pm_file()
+
+ +
+
+test_get_column_mapping_suggestions_with_columns()
+
+ +
+
+test_get_raw_column_names()
+

Good case for get_raw_column_names.

+
+ +
+
+test_progress()
+

Make sure we retrieve data from cache properly.

+
+ +
+
+test_save_column_mappings()
+
+ +
+
+test_save_column_mappings_idempotent()
+

We need to make successive calls to save_column_mappings.

+
+ +
+ +
+
+

Tests

+
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.util.AccessLevelBaseTestCase(methodName='runTest')
+

Bases: TestCase

+

Base Test Case Class to handle Access Levels +Creates a root owner user, a root member user, +and a child member user +Useful for testing “setup” API endpoints +as well as “data” endpoints +Provides methods for logging in as different +users +Sets up the factories

+
+
+login_as_child_member()
+

Login to client as Child-Level member user

+
+ +
+
+login_as_root_member()
+

Login to client as Root-Level member user

+
+ +
+
+login_as_root_owner()
+

Login to client as Root-Level owner user

+
+ +
+
+setUp()
+

SUPERUSER

+
+ +
+ +
+
+class seed.tests.util.AssertDictSubsetMixin
+

Bases: object

+
+
+assertDictContainsSubset(subset, dictionary)
+

Checks whether dictionary is a superset of subset

+

This is a necessary polyfill b/c assertDictContainsSubset was deprecated +and I believe it’s much more readable compared to the implementation below

+
+ +
+ +
+
+class seed.tests.util.DataMappingBaseTestCase(methodName='runTest')
+

Bases: DeleteModelsTestCase

+

Base Test Case Class to handle data import

+
+
+create_import_file(user, org, cycle, source_type=0, data_state=1)
+
+ +
+
+set_up(import_file_source_type, user_name='test_user@demo.com', user_password='test_pass')
+
+ +
+ +
+
+class seed.tests.util.DeleteModelsTestCase(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+tearDown()
+

Hook method for deconstructing the test fixture after testing it.

+
+ +
+ +
+
+class seed.tests.util.FakeClient
+

Bases: object

+

An extremely light-weight test client.

+
+
+get(view_func, data, headers=None, **kwargs)
+
+ +
+
+post(view_func, data, headers=None, **kwargs)
+
+ +
+ +
+
+class seed.tests.util.FakeRequest(data=None, headers=None, user=None, method='POST', **kwargs)
+

Bases: object

+

A simple request stub.

+
+
+GET: Dict[str, Any] = {}
+
+ +
+
+META = {'REMOTE_ADDR': '127.0.0.1'}
+
+ +
+
+POST: Dict[str, Any] = {}
+
+ +
+
+body = None
+
+ +
+
+path = 'fake_login_path'
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.urls.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.urls.html new file mode 100644 index 00000000..be53be10 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.urls.html @@ -0,0 +1,161 @@ + + + + + + + URLs Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

URLs Package

+
+

Submodules

+
+
+

Accounts

+
+
+

APIs

+
+
+

Main

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.utils.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.utils.html new file mode 100644 index 00000000..4013ccf0 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.utils.html @@ -0,0 +1,563 @@ + + + + + + + Utilities Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Utilities Package

+
+

Submodules

+
+
+

APIs

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.utils.api.APIBypassCSRFMiddleware(get_response)
+

Bases: object

+

This middleware turns off CSRF protection for API clients.

+

It must come before CsrfViewMiddleware in settings.MIDDLEWARE.

+
+ +
+
+class seed.utils.api.OrgCreateMixin
+

Bases: OrgMixin

+

Mixin to add organization when creating model instance

+
+
+perform_create(serializer)
+

Override to add org

+
+ +
+ +
+
+class seed.utils.api.OrgCreateUpdateMixin
+

Bases: OrgCreateMixin, OrgUpdateMixin

+

Mixin to add organization when creating/updating model instance

+
+ +
+
+class seed.utils.api.OrgMixin
+

Bases: object

+

Provides get_organization and get_parent_org method

+
+
+get_organization(request, return_obj=False)
+

Get org from query param or request.user.

+
+
Parameters:
+
    +
  • request – request object.

  • +
  • return_obj – bool. Set to True if obj vs pk is desired.

  • +
+
+
Returns:
+

int representing a valid organization pk or organization object.

+
+
+
+ +
+
+get_parent_org(request)
+

Gets parent organization of org from query param or request. +:param request: Request object. +:return: organization object.

+
+ +
+ +
+
+class seed.utils.api.OrgQuerySetMixin
+

Bases: OrgMixin

+

Mixin proving a get_queryset method that filters on organization.

+

In order to use this mixin you must specify the model attributes on the +View[Set] class. By default it assumes there is an organization field +on the model. You can override this by setting the orgfilter attribute +to the appropriate fieldname. This also allows nested fields e.g. +foreign_key.organization +By default this retrieves organization from query string param OR the +default_organization or first returned organization of the logged in user. +You can force it to return the appropriate “parent” organization by setting +the force_parent attribute to True.

+
+
+get_queryset()
+

get_queryset filtered on organization

+
+ +
+ +
+
+class seed.utils.api.OrgUpdateMixin
+

Bases: OrgMixin

+

Mixin to add organization when updating model instance

+
+
+perform_update(serializer)
+

Override to add org

+
+ +
+ +
+
+class seed.utils.api.OrgValidateMixin
+

Bases: object

+

Mixin to provide a validate() method organization to ensure users belongs +to the same org as the instance referenced by a foreign key..

+

You must set org_validators on the Serializer that uses this Mixin. +This is a list of OrgValidator named tuples (where key is the key +on request data representing the foreign key, and field the foreign key +that represents the organization on the corresponding model.

+

my_validator = OrgValidator(key=’foreign_key, field=’organization_id’)

+

..example:

+
+
+
class MySerializer(OrgValidateMixin, serializers.ModelSerializer):
+
foreign_key= serializers.PrimaryKeyRelatedField(

query_set=MyModel.objects.all()

+
+
+

) +org_validators = [my_validator]

+
+
+
+

This ensures request.user belongs to the org MyModel.organization

+

You can traverse foreign key relationships by using a double underscore +in validator.field

+

In the example above setting validator field to be ‘property__org_id’ +is equivalent to MyModel.property.org_id

+

If you use this Mixin and write a validate method, you must call super +to ensure validation takes place.

+
+
+validate(data)
+

Object level validation.

+

Checks for self.org_validators on Serializers and +ensures users belongs to org corresponding to the foreign key +being set.

+
+ +
+
+validate_org(instance, user, validator)
+

Raise error if orgs do not match.

+
+
Parameters:
+
    +
  • instance (model instance) – value in request.data.get(key) to check against

  • +
  • validator – validator to user

  • +
+
+
Param:
+

org_id of user, from get_org_id(request)

+
+
Type:
+

OrgValidator named tuple

+
+
+
+ +
+ +
+
+class seed.utils.api.OrgValidator(key, field)
+

Bases: tuple

+
+
+field
+

Alias for field number 1

+
+ +
+
+key
+

Alias for field number 0

+
+ +
+ +
+
+class seed.utils.api.ProfileIdMixin
+

Bases: object

+

Provides methods to get the columns to show based on a profile ID

+
+
+get_show_columns(org_id, profile_id)
+

Get list of columns from the profile_id. The result will be in the form of

+
+
show_columns = {

‘fields’: [‘field_1’, ‘field_2’, …] +‘extra_data’: [‘extra_data_field_1’, ‘extra_data_field_2’, …]

+
+
+

}

+
+
Parameters:
+
    +
  • org_id – str, id of organization

  • +
  • profile_id – str, id of profile to retrieve

  • +
+
+
Returns:
+

dist of lists

+
+
+
+ +
+ +
+
+seed.utils.api.api_endpoint(fn)
+

Decorator function to mark a view as allowed to authenticate via API key.

+

Decorator must be used before login_required or has_perm to set +request.user for those decorators.

+
+ +
+
+seed.utils.api.api_endpoint_class(fn)
+

Decorator function to mark a view as allowed to authenticate via API key.

+

Decorator must be used before login_required or has_perm to set +request.user for those decorators.

+
+ +
+
+seed.utils.api.clean_api_regex(url)
+

Given a django-style url regex pattern, strip it down to a human-readable +url.

+

TODO: If pks ever appear in the url, this will need to account for that.

+
+ +
+
+seed.utils.api.drf_api_endpoint(fn)
+

Decorator to register a Django Rest Framework view with the list of API +endpoints. Marks it with is_api_endpoint = True as well as appending it +to the global endpoints list.

+
+ +
+
+seed.utils.api.format_api_docstring(docstring)
+

Cleans up a python method docstring for human consumption.

+
+ +
+
+seed.utils.api.get_all_urls(urllist, prefix='')
+

Recursive generator that traverses entire tree of URLs, starting with +urllist, yielding a tuple of (url_pattern, view_function) for each +one.

+
+ +
+
+seed.utils.api.get_api_endpoints()
+

Examines all views and returns those with is_api_endpoint set +to true (done by the @api_endpoint decorator).

+
+ +
+
+seed.utils.api.get_api_request_user(request)
+

Determines if this is an API request and returns the corresponding user if so.

+
+ +
+
+seed.utils.api.get_org_id_from_validator(instance, field)
+

For querysets Django enables you to do things like:

+

note double underscore. However you can’t do:

+

This presents an issue as getattr only works 1 level deep:

+
+

getattr(obj, ‘org.id’) does not work either.

+
+

This can be worked around using rgetattr (above). +This functions mimics getattr(obj, ‘org__id’) by +splitting field on __ and calling rgetattr on the result.

+
+ +
+
+seed.utils.api.rgetattr(obj, lst)
+

This enables recursive getattr look ups. +given obj, [‘a’, ‘b’, ‘c’] as params it will look up: +obj.a, a.b, b.c returning b.c unless one of the previous +values was None, in which case it returns None immediately.

+
+
Parameters:
+
    +
  • obj (object) – initial object to examine

  • +
  • lst (list) – list of successive attributes to look up

  • +
+
+
+
+ +
+
+

Buildings

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.utils.buildings.get_source_type(import_file, source_type='')
+

Used for converting ImportFile source_type into an int.

+
+ +
+
+

Organizations

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.utils.organizations.create_organization(user=None, org_name='test_org', *args, **kwargs)
+

Helper script to create a user/org relationship from scratch. This is heavily used and +creates the default labels, columns, and data quality rules when a new organization is created

+
+
Parameters:
+
    +
  • user – user inst.

  • +
  • org_name – str, name of Organization we’d like to create.

  • +
  • kwargs ((optional)) – ‘role’, int; ‘status’, str.

  • +
+
+
+
+ +
+
+seed.utils.organizations.create_suborganization(user, current_org, suborg_name='', user_role=10)
+
+ +
+
+seed.utils.organizations.default_pm_mappings()
+
+ +
+
+

Time

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.utils.time.convert_datestr(datestr, make_tz_aware=False)
+

Converts dates like 12/31/2010 into datetime objects. Dates are returned in UTC time

+

TODO: reconcile this with seed/lib/mcm/cleaners.py#L85-L85

+
+
Parameters:
+
    +
  • datestr – string, value to convert

  • +
  • make_tz_aware – bool, if set to true, then will convert the timezone into UTC time

  • +
+
+
Returns:
+

datetime or None

+
+
+
+ +
+
+seed.utils.time.convert_to_js_timestamp(timestamp)
+

converts a django/python datetime object to milliseconds since epoch

+
+ +
+
+seed.utils.time.parse_datetime(maybe_datetime)
+

Process a datetime value that may be None, timestamp, strftime.

+
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/modules/seed.views.html b/docs/code_documentation/3.0.0-beta.0/modules/seed.views.html new file mode 100644 index 00000000..2759f88b --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/modules/seed.views.html @@ -0,0 +1,232 @@ + + + + + + + Views Package — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Views Package

+
+

Submodules

+
+
+

Accounts

+
+
+

APIs

+
+
+

Main

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.views.main.angular_js_tests(request)
+

Jasmine JS unit test code covering AngularJS unit tests

+
+ +
+
+seed.views.main.celery_queue(self, request, *args, **kwargs)
+

Returns the number of running and queued celery tasks. This action can only be performed by superusers

+

Returns:

+
{
+    'active': {'total': n, 'tasks': []}, // Tasks that are currently being executed
+    'reserved': {'total': n, 'tasks': []}, // Tasks waiting to be executed
+    'scheduled': {'total': n, 'tasks': []}, // Tasks reserved by the worker when they have an eta or countdown
+    'maxConcurrency': The maximum number of active tasks
+}
+
+
+
+ +
+
+seed.views.main.error404(request, exception)
+
+ +
+
+seed.views.main.error410(request)
+
+ +
+
+seed.views.main.error500(request)
+
+ +
+
+seed.views.main.health_check(request)
+

Perform a health check without requiring authentication

+
+ +
+
+seed.views.main.home(request)
+

the main view for the app +Sets in the context for the django template:

+
    +
  • app_urls: a json object of all the URLs that is loaded in the JS global namespace

  • +
  • username: the request user’s username (first and last name)

  • +
+
+ +
+
+seed.views.main.version(self, request, *args, **kwargs)
+

Returns the SEED version and current git sha

+
+ +
+
+

Meters

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/objects.inv b/docs/code_documentation/3.0.0-beta.0/objects.inv new file mode 100644 index 00000000..961ba8e7 Binary files /dev/null and b/docs/code_documentation/3.0.0-beta.0/objects.inv differ diff --git a/docs/code_documentation/3.0.0-beta.0/py-modindex.html b/docs/code_documentation/3.0.0-beta.0/py-modindex.html new file mode 100644 index 00000000..2328f344 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/py-modindex.html @@ -0,0 +1,408 @@ + + + + + + Python Module Index — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ c | + s +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ c
+ config +
    + config.template_context +
    + config.tests +
    + config.utils +
    + config.views +
    + config.wsgi +
 
+ s
+ seed +
    + seed.data_importer +
    + seed.data_importer.managers +
    + seed.data_importer.utils +
    + seed.decorators +
    + seed.landing +
    + seed.landing.forms +
    + seed.landing.management +
    + seed.landing.management.commands +
    + seed.landing.models +
    + seed.landing.tests +
    + seed.landing.urls +
    + seed.landing.views +
    + seed.lib +
    + seed.lib.mappings +
    + seed.lib.mappings.mapper +
    + seed.lib.mappings.mapping_columns +
    + seed.lib.merging +
    + seed.lib.merging.merging +
    + seed.management +
    + seed.models +
    + seed.models.auditlog +
    + seed.models.columns +
    + seed.models.cycles +
    + seed.models.data_quality +
    + seed.models.models +
    + seed.models.properties +
    + seed.models.tax_lots +
    + seed.public +
    + seed.search +
    + seed.serializers +
    + seed.serializers.celery +
    + seed.serializers.labels +
    + seed.tasks +
    + seed.templatetags.breadcrumbs +
    + seed.test_helpers +
    + seed.test_helpers.factory.helpers +
    + seed.tests.test_admin_views +
    + seed.tests.test_decorators +
    + seed.tests.test_tasks +
    + seed.tests.test_views +
    + seed.tests.util +
    + seed.token_generators +
    + seed.utils +
    + seed.utils.api +
    + seed.utils.buildings +
    + seed.utils.organizations +
    + seed.utils.time +
    + seed.views +
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/search.html b/docs/code_documentation/3.0.0-beta.0/search.html new file mode 100644 index 00000000..ab33d922 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/search.html @@ -0,0 +1,133 @@ + + + + + + Search — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/searchindex.js b/docs/code_documentation/3.0.0-beta.0/searchindex.js new file mode 100644 index 00000000..40d953a1 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "aws", "data_model", "data_quality", "deployment", "developer_resources", "docker", "faq", "getting_started", "help", "index", "kubernetes_deployment", "license", "linux", "mapping", "matching", "migrations", "modules", "modules/config", "modules/seed", "modules/seed.cleansing", "modules/seed.data", "modules/seed.data_importer", "modules/seed.features", "modules/seed.landing", "modules/seed.landing.management", "modules/seed.landing.management.commands", "modules/seed.lib", "modules/seed.lib.mappings", "modules/seed.lib.merging", "modules/seed.management", "modules/seed.managers", "modules/seed.managers.tests", "modules/seed.mappings", "modules/seed.models", "modules/seed.public", "modules/seed.serializers", "modules/seed.templatetags", "modules/seed.test_helpers", "modules/seed.test_helpers.factory", "modules/seed.test_helpers.factory.lib", "modules/seed.tests", "modules/seed.tests.functional", "modules/seed.urls", "modules/seed.utils", "modules/seed.views", "setup_docker", "setup_osx", "translation"], "filenames": ["api.rst", "aws.rst", "data_model.rst", "data_quality.rst", "deployment.rst", "developer_resources.rst", "docker.rst", "faq.rst", "getting_started.rst", "help.rst", "index.rst", "kubernetes_deployment.rst", "license.rst", "linux.rst", "mapping.rst", "matching.rst", "migrations.rst", "modules.rst", "modules/config.rst", "modules/seed.rst", "modules/seed.cleansing.rst", "modules/seed.data.rst", "modules/seed.data_importer.rst", "modules/seed.features.rst", "modules/seed.landing.rst", "modules/seed.landing.management.rst", "modules/seed.landing.management.commands.rst", "modules/seed.lib.rst", "modules/seed.lib.mappings.rst", "modules/seed.lib.merging.rst", "modules/seed.management.rst", "modules/seed.managers.rst", "modules/seed.managers.tests.rst", "modules/seed.mappings.rst", "modules/seed.models.rst", "modules/seed.public.rst", "modules/seed.serializers.rst", "modules/seed.templatetags.rst", "modules/seed.test_helpers.rst", "modules/seed.test_helpers.factory.rst", "modules/seed.test_helpers.factory.lib.rst", "modules/seed.tests.rst", "modules/seed.tests.functional.rst", "modules/seed.urls.rst", "modules/seed.utils.rst", "modules/seed.views.rst", "setup_docker.rst", "setup_osx.rst", "translation.rst"], "titles": ["API", "AWS Setup", "Data Model", "Data Quality", "Deployment Guide", "Developer Resources", "Docker Deployment on AWS", "Frequently Asked Questions", "Getting Started", "Help", "Standard Energy Efficiency Data (SEED) Platform", "Kubernetes Deployment Guide with Helm", "License", "General Linux Setup", "Mapping", "Matching", "Migrations", "Modules", "Configuration", "SEED Package", "Data Quality Package", "Data Package", "Data Importer Package", "Features Package", "Landing Package", "seed.landing.management package", "Landing Management Package", "Library Packages", "seed.lib.mappings package", "seed.lib.merging package", "Management Package", "Managers Package", "Manager Tests Package", "Mapping Package", "Models", "Public Package", "Serializers Package", "Templatetags Package", "Test Helpers Package", "Test Helper Factor Package", "Test Helper Factory Lib Package", "Tests Package", "Tests (Functional) Package", "URLs Package", "Utilities Package", "Views Package", "Installation using Docker", "Installation on OSX", "Translating SEED"], "terms": {"i": [0, 1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 16, 19, 20, 22, 24, 28, 34, 37, 41, 44, 45, 46, 47, 48], "handl": [0, 2, 4, 5, 16, 28, 41], "via": [0, 5, 15, 18, 20, 24, 34, 44], "an": [0, 1, 2, 3, 5, 6, 7, 10, 11, 13, 14, 15, 16, 18, 19, 24, 34, 41, 44, 45, 46, 47, 48], "encod": 0, "author": [0, 19, 24, 28, 29, 37], "token": [0, 11, 17, 24, 37, 48], "set": [0, 1, 2, 4, 6, 10, 11, 13, 14, 15, 16, 18, 19, 20, 24, 28, 29, 34, 41, 44, 45, 46, 47], "http": [0, 4, 5, 6, 9, 11, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 47], "header": [0, 5, 14, 19, 24, 41, 48], "To": [0, 1, 2, 3, 4, 5, 11, 46, 47], "request": [0, 2, 9, 11, 13, 14, 18, 19, 24, 34, 41, 44, 45], "go": [0, 5, 34, 46], "app": [0, 1, 5, 7, 10, 11, 13, 22, 45, 47], "profil": [0, 1, 5, 6, 13, 14, 44, 47], "develop": [0, 4, 7, 10, 18, 47], "click": [0, 2, 3], "get": [0, 1, 2, 5, 6, 10, 11, 13, 15, 19, 20, 28, 34, 41, 44, 47, 48], "new": [0, 2, 11, 15, 16, 19, 20, 22, 29, 34, 41, 44, 47, 48], "kei": [0, 2, 4, 5, 6, 8, 11, 16, 19, 20, 24, 28, 29, 34, 41, 44, 48], "everi": [0, 1, 2, 5, 13, 34], "your": [0, 1, 4, 5, 6, 7, 11, 13, 16, 46, 47], "usernam": [0, 1, 5, 11, 13, 24, 41, 45, 46, 47], "email": [0, 5, 6, 7, 11, 13, 19, 24, 34, 41], "all": [0, 2, 5, 7, 11, 12, 13, 15, 16, 19, 20, 22, 24, 34, 37, 44, 45, 47, 48], "lowercas": [0, 14, 41], "basic": [0, 48], "auth": [0, 4, 24], "The": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 19, 20, 28, 34, 44, 45, 46, 47, 48], "sent": [0, 7], "form": [0, 2, 12, 17, 34, 41, 44], "credenti": [0, 11], "where": [0, 2, 3, 5, 9, 15, 20, 22, 44, 47, 48], "base64": 0, "join": [0, 9, 17], "singl": [0, 16, 19, 34, 47], "colon": 0, "us": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19, 20, 22, 28, 34, 41, 44, 47, 48], "python": [0, 4, 7, 8, 9, 10, 19, 34, 44], "librari": [0, 7, 10, 17], "import": [0, 3, 4, 5, 7, 10, 15, 16, 17, 20, 28, 34, 41, 46], "result": [0, 2, 5, 15, 16, 20, 28, 34, 44], "seed": [0, 1, 4, 5, 6, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 27, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 47], "platform": [0, 1, 4, 5, 6, 11, 12, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 47], "org": [0, 5, 6, 7, 9, 11, 13, 16, 19, 22, 24, 37, 41, 44, 46, 47], "version": [0, 4, 5, 6, 7, 11, 28, 34, 45, 46, 47], "user_email": 0, "api_kei": [0, 24, 47], "print": [0, 5], "json": [0, 1, 2, 5, 11, 13, 14, 17, 19, 28, 45, 48], "curl": [0, 1, 6, 13], "pass": [0, 5, 6, 13, 19, 34, 36, 46], "follow": [0, 1, 2, 4, 5, 6, 11, 12, 13, 15, 16, 34, 46, 47], "u": [0, 5, 6, 7, 10, 11, 12, 13, 22, 34], "If": [0, 1, 2, 4, 5, 6, 7, 11, 15, 16, 19, 20, 28, 34, 44, 46, 47, 48], "fail": [0, 5, 6, 16, 41, 46], "": [0, 1, 2, 5, 6, 7, 9, 10, 12, 13, 15, 18, 19, 20, 22, 24, 34, 41, 45, 46, 47, 48], "statu": [0, 19, 41, 44], "code": [0, 5, 9, 11, 12, 16, 19, 34, 45, 46, 47], "302": 0, "redirect": 0, "user": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 15, 16, 19, 24, 34, 41, 44, 45, 46, 48], "login": [0, 5, 8, 11, 13, 24, 41, 46], "mani": [0, 2, 13, 20, 24, 34, 48], "requir": [0, 1, 5, 6, 7, 10, 11, 12, 13, 16, 20, 24, 45, 47, 48], "paramet": [0, 16, 19, 20, 24, 28, 29, 34, 37, 44, 46], "queri": [0, 5, 16, 19, 20, 24, 34, 44], "string": [0, 16, 19, 20, 22, 24, 28, 34, 37, 44, 48], "url": [0, 5, 10, 11, 13, 16, 17, 19, 37, 44, 45], "A": [0, 1, 5, 12, 13, 14, 15, 20, 24, 34, 41, 47], "frequent": [0, 10], "includ": [0, 1, 5, 12, 13, 15, 16, 20, 22, 29, 34, 46], "organization_id": [0, 2, 5, 16, 19, 20, 34, 36, 44], "you": [0, 1, 4, 5, 7, 9, 11, 13, 16, 18, 34, 36, 44, 46, 47, 48], "belong": [0, 2, 44], "For": [0, 1, 2, 5, 6, 10, 11, 13, 15, 18, 34, 36, 41, 44, 46, 47], "exampl": [0, 1, 2, 5, 6, 9, 15, 16, 18, 19, 20, 24, 28, 34, 36, 37, 44, 46, 47, 48], "v2": [0, 11], "organ": [0, 1, 5, 7, 9, 10, 11, 13, 15, 16, 17, 19, 20, 22, 34, 47], "12": [0, 2, 5, 44, 48], "Or": [0, 15], "d": [0, 5, 6, 44, 47], "6": [0, 5, 34], "role": [0, 2, 44, 47], "viewer": 0, "update_rol": 0, "param": [0, 19, 20, 34, 44], "post": [0, 19, 41, 47], "data": [0, 1, 4, 5, 7, 9, 11, 12, 13, 14, 15, 16, 17, 24, 28, 29, 34, 41, 44, 48], "dump": [0, 10, 47], "from": [0, 1, 2, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 19, 20, 24, 28, 29, 34, 41, 44, 46, 47, 48], "object": [0, 5, 7, 14, 16, 19, 20, 22, 24, 28, 34, 36, 37, 39, 41, 44, 45], "specifi": [0, 5, 14, 15, 20, 44, 46], "each": [0, 2, 5, 11, 15, 16, 22, 29, 41, 44], "document": [0, 1, 2, 6, 9, 10, 12, 13, 14, 16], "In": [0, 1, 2, 5, 13, 16, 20, 22, 24, 34, 44, 46, 47], "case": [0, 2, 3, 5, 15, 16, 28, 34, 41, 44, 47], "error": [0, 4, 5, 16, 19, 20, 44, 46], "most": [0, 2, 3, 5, 6, 15, 20, 24, 34], "return": [0, 2, 5, 16, 19, 20, 22, 24, 28, 29, 34, 36, 37, 44, 45], "thi": [0, 1, 2, 3, 4, 5, 6, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 22, 24, 28, 29, 34, 36, 41, 44, 45, 46, 47, 48], "instead": [0, 2, 5, 34, 37, 47], "expect": [0, 5, 13, 16, 22, 41], "messag": [0, 4, 5, 24, 47], "explan": 0, "here": [0, 2, 5, 7, 11, 13, 15, 18, 22, 46], "list": [0, 2, 5, 6, 9, 11, 12, 15, 19, 20, 28, 29, 34, 36, 44], "interact": 0, "ar": [0, 1, 2, 3, 4, 5, 7, 11, 12, 13, 14, 15, 16, 19, 20, 22, 24, 28, 34, 44, 45, 46, 47, 48], "avail": [0, 1, 7, 9, 10, 13, 28, 48], "access": [0, 1, 5, 7, 10, 11, 13, 15, 41, 47], "menu": 0, "item": [0, 5, 11, 16, 28], "left": [0, 29], "navig": [0, 34, 47], "pane": 0, "within": [0, 1, 5, 13, 15, 19, 47], "account": [0, 4, 11, 15, 17, 22, 41, 44], "instanc": [0, 1, 2, 4, 6, 13, 15, 19, 20, 22, 24, 29, 34, 36, 44, 47], "view": [0, 10, 11, 14, 15, 17, 34, 44], "non": [0, 2, 8, 13, 34], "without": [0, 12, 15, 16, 41, 45], "swagger": 0, "server": [0, 1, 4, 5, 6, 8, 11, 14, 18], "provid": [1, 5, 6, 7, 10, 12, 13, 19, 22, 41, 44, 47, 48], "prefer": [1, 2, 6, 13, 16, 20, 22], "host": [1, 6, 7, 13, 16, 47], "django": [1, 2, 4, 6, 7, 8, 10, 11, 16, 18, 19, 20, 24, 34, 37, 44, 45, 46, 48], "project": [1, 4, 5, 6, 13, 18, 19], "excel": [1, 6, 13], "place": [1, 6, 13, 34, 44, 48], "gener": [1, 4, 6, 9, 10, 11, 17, 44, 47], "understand": [1, 6, 13], "layout": [1, 6, 13, 48], "ubuntu": [1, 5, 6, 8, 13], "18": [1, 5, 6, 13], "04": [1, 6, 13], "lt": 1, "These": [1, 2, 11, 14, 15, 34, 47], "instruct": [1, 8, 10, 11, 13, 46], "have": [1, 2, 3, 4, 5, 6, 7, 11, 13, 15, 16, 18, 19, 22, 34, 41, 45, 46, 47, 48], "been": [1, 2, 5, 15, 19, 20, 34, 47], "updat": [1, 2, 5, 6, 7, 13, 15, 16, 24, 25, 29, 34, 44, 47, 48], "It": [1, 2, 6, 9, 11, 18, 34, 44, 46, 48], "recommend": [1, 4, 5, 9, 13, 47], "docker": [1, 4, 5, 8, 10, 11, 13], "base": [1, 2, 5, 7, 10, 13, 19, 20, 22, 24, 28, 29, 34, 36, 37, 39, 41, 44, 46, 47, 48], "deploy": [1, 5, 10, 15, 18], "sudo": [1, 6, 13, 16, 47], "apt": [1, 6, 13, 16], "upgrad": [1, 6, 13, 16, 47], "instal": [1, 4, 5, 8, 11, 13, 16, 19, 48], "y": [1, 6], "libpq": [1, 13], "dev": [1, 11, 13, 46, 47], "pip": [1, 13, 16, 47], "libatla": [1, 13], "gfortran": [1, 13], "build": [1, 2, 7, 8, 9, 10, 13, 15, 17, 19, 20, 34, 41, 47], "essenti": [1, 13], "g": [1, 2, 4, 5, 9, 11, 13, 16, 34, 44, 47, 48], "npm": [1, 5, 8, 13, 16], "libxml2": [1, 13], "libxslt1": [1, 13], "git": [1, 6, 13, 45, 47], "mercuri": [1, 13], "libssl": [1, 13], "libffi": [1, 13], "uwsgi": [1, 13, 47], "core": [1, 13, 16, 19], "plugin": [1, 13], "postgresql": [1, 2, 4, 7, 8, 10, 16], "redi": [1, 8, 13, 16, 20], "abov": [1, 2, 5, 6, 12, 13, 15, 20, 44], "command": [1, 5, 6, 11, 13, 16, 18, 34, 46, 47], "quick": [1, 8, 11, 13], "okai": [1, 6], "local": [1, 4, 5, 6, 13, 16, 47, 48], "more": [1, 2, 4, 5, 11, 13, 15, 16, 41, 48], "perman": 1, "scalabl": 1, "solut": 1, "elasticach": [1, 13], "9": [1, 2, 5, 11, 13], "4": [1, 2, 5, 6, 12, 13, 15, 20, 34, 47], "support": [1, 4, 13, 16, 19, 36], "type": [1, 2, 11, 13, 20, 22, 29, 34, 44], "contrib": [1, 4, 5, 7, 13, 16, 24, 47], "can": [1, 2, 3, 4, 5, 7, 9, 10, 11, 13, 14, 15, 16, 19, 22, 28, 34, 44, 45, 46, 47, 48], "rd": [1, 13], "se": [1, 6], "clone": [1, 6, 13, 47], "repositori": [1, 5, 6, 9, 13, 16, 47], "github": [1, 5, 6, 9, 11, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 47], "com": [1, 5, 6, 9, 11, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 47], "enter": [1, 2, 11, 13], "repo": [1, 11, 13], "cd": [1, 5, 6, 13, 47], "r": [1, 5, 13, 16, 47], "txt": [1, 13, 16, 47], "j": [1, 5, 45, 47, 48], "copi": [1, 5, 13, 16, 19, 34, 47, 48], "local_untrack": [1, 4, 5, 7, 16, 46, 47], "py": [1, 4, 5, 7, 11, 16, 19, 24, 37, 44, 46, 47], "dist": [1, 13, 44, 47], "file": [1, 2, 4, 5, 6, 7, 11, 13, 14, 16, 20, 24, 28, 34, 46, 47, 48], "config": [1, 5, 11, 13, 16, 18, 46, 47], "directori": [1, 5, 6, 11, 13, 16, 46, 47], "add": [1, 4, 5, 6, 13, 14, 16, 20, 28, 44, 46, 47, 48], "password": [1, 5, 11, 13, 16, 19, 24, 41, 46, 47], "port": [1, 13, 16, 46, 47], "point": [1, 2, 5, 13, 14, 15, 22, 34, 46, 47], "manual": [1, 5, 10, 13, 14, 15, 16, 47, 48], "infrastructur": [1, 13], "default": [1, 2, 3, 5, 6, 11, 13, 16, 19, 20, 34, 36, 44, 46, 47], "engin": [1, 6, 13, 16, 47], "db": [1, 5, 6, 11, 13, 16, 20, 24, 34, 47], "backend": [1, 4, 13, 16, 34, 47], "postgresql_psycopg2": [1, 13], "name": [1, 2, 5, 6, 7, 11, 12, 13, 16, 18, 19, 20, 24, 28, 29, 34, 36, 37, 41, 44, 45, 46, 47], "arbitrari": [1, 2, 13, 36], "ani": [1, 2, 3, 4, 5, 6, 12, 13, 14, 15, 16, 18, 20, 22, 28, 29, 34, 41, 46, 47, 48], "valid": [1, 6, 7, 10, 13, 19, 20, 24, 34, 39, 44], "long": [1, 2, 13, 16, 28], "exist": [1, 2, 4, 5, 6, 10, 13, 16, 19, 20, 28, 29, 34, 41, 46, 47], "creat": [1, 2, 4, 5, 6, 11, 14, 15, 16, 19, 20, 22, 24, 28, 34, 41, 44, 46, 47, 48], "postgr": [1, 2, 5, 6, 11, 13, 16, 46, 47], "psql": [1, 5, 13, 47], "shell": [1, 5, 7, 16, 46, 47], "line": [1, 2, 5, 11, 16, 34, 47, 48], "createdb": [1, 13, 47], "tabl": [1, 5, 13, 16, 28, 34, 47], "migrat": [1, 8, 10, 13, 20], "manag": [1, 4, 7, 10, 13, 14, 16, 17, 19, 20, 24, 28, 34, 46, 47, 48], "syncdb": 1, "superus": [1, 5, 13, 41, 45, 47], "system": [1, 2, 5, 11, 13, 15, 47], "create_default_us": [1, 5, 11, 13, 47], "demo": [1, 5, 41, 47], "demo123": [1, 47], "must": [1, 5, 11, 12, 13, 14, 15, 16, 34, 44, 46, 47], "ti": [1, 13, 34], "visit": [1, 9, 13, 47], "admin": [1, 6, 8, 11, 13, 17, 19, 24], "parent": [1, 10, 13, 19, 20, 24, 29, 34, 44], "them": [1, 5, 13, 16, 41, 48], "reli": [1, 13], "both": [1, 2, 5, 7, 10, 13, 15, 19, 20, 34, 47], "should": [1, 2, 5, 11, 13, 15, 16, 18, 22, 34, 41, 46, 47, 48], "celery_broker_url": [1, 13, 16, 47], "ntmprk": 1, "0001": 1, "usw2": 1, "amazonaw": [1, 6, 11], "6379": [1, 13, 16, 47], "1": [1, 2, 4, 5, 6, 8, 11, 12, 13, 15, 20, 22, 34, 41, 44, 46], "django_redi": [1, 13, 16, 47], "rediscach": [1, 13, 16, 47], "locat": [1, 5, 13, 16, 20, 47], "save": [1, 5, 7, 10, 13, 14, 20, 22, 24, 29, 34, 47], "match": [1, 5, 10, 11, 13, 16, 19, 20, 22, 28, 44], "qualiti": [1, 7, 10, 13, 17, 44], "check": [1, 3, 13, 16, 19, 20, 28, 34, 41, 44, 45, 48], "etc": [1, 2, 5, 6, 13, 14, 15, 19, 46, 48], "connect": [1, 9, 11, 13, 15, 16, 46], "queue": [1, 13, 16], "start": [1, 2, 5, 10, 11, 13, 34, 39, 44, 46], "l": [1, 6, 13, 47], "info": [1, 5, 11, 13, 34, 47], "c": [1, 5, 6, 12, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47], "2": [1, 2, 5, 6, 8, 11, 12, 13, 15, 20, 34, 48], "max": [1, 5, 11, 13, 20, 47], "per": [1, 13, 15, 19, 20, 47, 48], "child": [1, 2, 13, 20, 24, 34, 41, 47], "1000": [1, 13, 20, 47], "eb": [1, 13, 47], "django_celery_beat": [1, 5, 13, 47], "schedul": [1, 13, 19, 45, 47], "databaseschedul": [1, 13, 47], "below": [2, 5, 6, 11, 16, 20, 22, 24, 28, 34, 41, 46, 47, 48], "out": [2, 5, 6, 7, 9, 12, 13, 20, 47, 48], "state": [2, 5, 12, 29, 34], "need": [2, 5, 7, 9, 11, 13, 14, 15, 16, 19, 22, 34, 41, 44, 46, 47, 48], "our": [2, 9, 13, 29, 41], "primari": [2, 19, 20], "tree": [2, 44, 48], "structur": [2, 20, 28], "node": [2, 11, 37, 47], "tip": 2, "referenc": [2, 44], "take": [2, 11, 16, 28, 34, 37, 44], "ha": [2, 5, 13, 14, 15, 19, 20, 34, 46], "load": [2, 13, 20, 24, 34, 45], "csv": [2, 28], "contain": [2, 6, 8, 9, 11, 12, 16, 18, 34, 41, 48], "inform": [2, 4, 5, 7, 9, 10, 11, 14, 34], "about": [2, 5, 34], "one": [2, 3, 4, 5, 7, 11, 15, 16, 18, 20, 24, 28, 34, 44, 48], "first": [2, 5, 6, 11, 15, 16, 19, 20, 24, 28, 34, 37, 44, 45, 46, 47], "bs0": 2, "At": [2, 4, 14, 15, 47, 48], "time": [2, 5, 6, 15, 16, 17, 20, 24, 34, 41, 46, 47, 48], "link": [2, 11, 16, 34, 37], "cb0": 2, "also": [2, 5, 9, 11, 12, 13, 15, 16, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 47], "relat": [2, 5, 16, 20, 24, 34, 41], "repres": [2, 5, 15, 19, 44], "databas": [2, 4, 6, 7, 8, 10, 14, 16, 20, 22, 29, 34, 46], "foreign": [2, 16, 44], "come": [2, 11, 20, 44], "fruition": 2, "sai": [2, 15], "bs1": 2, "wa": [2, 5, 15, 20, 22, 28, 34, 41, 44], "occur": [2, 5, 14, 15, 16], "bs2": 2, "merg": [2, 5, 10, 14, 16, 17, 34], "togeth": [2, 34], "given": [2, 3, 5, 15, 19, 22, 28, 34, 44], "record": [2, 3, 5, 14, 15, 19, 34], "b3": 2, "snapshot": [2, 15], "becaus": [2, 16, 19, 20, 48], "newer": [2, 5, 6, 13], "two": [2, 4, 5, 11, 15, 16, 22, 28, 34], "perspect": 2, "By": [2, 13, 34, 44, 47], "recent": [2, 15, 34], "allow": [2, 15, 18, 41, 44], "evolv": 2, "over": [2, 15, 34, 47, 48], "canon": [2, 29, 34, 48], "site": [2, 5, 7, 11, 34], "eui": [2, 16, 20, 34], "valu": [2, 4, 11, 13, 15, 20, 22, 24, 28, 34, 44, 46, 47, 48], "75": 2, "some": [2, 5, 7, 11, 15, 16, 34, 46, 47, 48], "chang": [2, 5, 15, 16, 34, 46, 47, 48], "caus": [2, 12, 16, 48], "80": [2, 11, 13], "submit": [2, 5, 9], "linkag": 2, "other": [2, 4, 5, 7, 9, 10, 12, 13, 15, 16, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "order": [2, 5, 11, 14, 15, 16, 44, 46, 48], "keep": [2, 16], "track": [2, 48], "addit": [2, 5, 14, 15, 16], "seed_buildingsnapshot_children": 2, "would": [2, 13, 15, 19, 28], "throughout": [2, 34], "applic": [2, 5, 7, 9, 10, 11, 15, 18], "search_build": 2, "endpoint": [2, 5, 10, 28, 41, 44], "search": [2, 10, 17], "activ": [2, 7, 10, 17, 24, 45, 47], "search_mapping_result": 2, "regardless": [2, 34], "whether": [2, 3, 12, 14, 19, 28, 41], "dure": [2, 3, 5, 15, 19], "map": [2, 5, 10, 16, 17, 19, 22, 29, 34, 41, 48], "preview": [2, 15], "section": [2, 7, 11, 37, 47], "illustr": 2, "purpos": [2, 5, 12, 34], "let": [2, 36], "suppos": 2, "bs3": 2, "bs4": 2, "And": 2, "correspond": [2, 14, 44], "look": [2, 6, 11, 16, 44, 47, 48], "like": [2, 5, 6, 11, 16, 36, 44, 46, 47, 48], "process": [2, 5, 14, 15, 19, 24, 28, 34, 41, 44, 47, 48], "raw": [2, 28, 34], "b0": 2, "c0": 2, "id1": 2, "11": [2, 5, 8], "id2": 2, "id3": 2, "13": [2, 5], "id4": 2, "14": [2, 5], "15": [2, 5], "sinc": [2, 5, 13, 15, 16, 34, 44, 47], "choos": [2, 15, 46, 48], "move": [2, 5, 13, 34], "onli": [2, 6, 15, 19, 20, 34, 41, 44, 45, 47], "deactiv": 2, "secondari": 2, "true": [2, 4, 5, 13, 19, 20, 22, 24, 28, 34, 36, 39, 44], "bs5": 2, "cb1": 2, "decid": [2, 13, 14, 28], "fals": [2, 5, 13, 18, 19, 20, 24, 28, 29, 34, 36, 44], "after": [2, 3, 4, 5, 6, 11, 15, 16, 19, 34, 41, 46], "bs6": 2, "even": [2, 12, 15, 22, 47], "though": [2, 15, 22, 47], "normal": [2, 5, 15, 16, 22, 28, 34, 47], "its": [2, 11, 12, 15], "anytim": 2, "unmatch": 2, "leaf": 2, "conceptu": 2, "sometim": 2, "devil": 2, "detail": [2, 6, 15], "ad": [2, 15, 20, 22, 28, 41], "least": [2, 15, 48], "consid": [2, 15], "simpl": [2, 6, 11, 13, 15, 20, 34, 37, 41], "properti": [2, 3, 5, 6, 15, 16, 17, 19, 20, 22, 24, 28, 44], "id": [2, 5, 11, 16, 19, 20, 22, 24, 34, 36, 37, 41, 44, 47], "year": [2, 15, 20, 34, 41], "end": [2, 7, 10, 14, 34, 39], "floor": [2, 34], "area": [2, 20, 34], "address": [2, 5, 13, 16, 19, 20, 34, 41], "releas": [2, 6, 10, 11, 16, 34, 41], "date": [2, 20, 34, 44], "499045": 2, "2000": 2, "1234": [2, 5], "fake": [2, 16], "st": 2, "thing": [2, 44, 47], "upload": [2, 7, 10, 14], "see": [2, 4, 5, 7, 11, 13, 16, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 48], "success": [2, 11, 19, 41, 44], "dialog": 2, "73700": 2, "modifi": [2, 11, 16, 34], "timestamp": [2, 44], "Then": [2, 15, 47], "lot": [2, 15, 20, 34], "empti": [2, 5, 11, 34], "source_typ": [2, 34, 41, 44], "0": [2, 4, 5, 7, 8, 13, 20, 28, 34, 39, 41, 44, 46], "column": [2, 10, 14, 16, 17, 28, 29, 44], "which": [2, 5, 11, 13, 15, 16, 22, 28, 34, 44, 46, 47, 48], "content": [2, 6, 17, 41], "extra_data_sourc": 2, "popul": [2, 5], "e": [2, 4, 5, 11, 13, 16, 28, 34, 37, 44, 46, 47, 48], "owner_postal_code_source_id": 2, "interest": [2, 34], "import_file_id": [2, 34], "refer": [2, 15, 16, 34], "data_importer_importfil": 2, "befor": [2, 6, 11, 15, 16, 20, 24, 41, 44, 46, 47], "hit": [2, 11], "continu": 2, "button": [2, 3, 48], "second": [2, 37], "73701": 2, "screen": [2, 16], "pm_property_id": [2, 20, 34], "year_end": [2, 20, 34], "gross_floor_area": [2, 20, 34], "address_line_1": [2, 20, 34], "release_d": [2, 20, 34], "That": [2, 15], "now": [2, 11, 19, 28, 47, 48], "same": [2, 5, 7, 10, 11, 15, 16, 28, 34, 37, 41, 44, 47], "next": [2, 15, 28], "2001": 2, "As": [2, 15, 48], "73702": 2, "pattern": [2, 44], "similarli": 2, "73703": 2, "appear": [2, 5, 44, 46], "howev": [2, 4, 5, 12, 16, 20, 44], "abl": [2, 11, 41], "make": [2, 5, 6, 7, 11, 15, 16, 18, 34, 41, 46, 47, 48], "confirm": [2, 41], "73704": 2, "ident": 2, "term": 2, "except": [2, 20, 24, 34, 36, 41, 45], "differ": [2, 5, 9, 11, 13, 15, 20, 22, 28, 29, 41, 46, 47, 48], "confid": [2, 5, 28, 34, 41], "canonical_building_id": 2, "null": 2, "last_modified_by_id": 2, "landing_seedus": [2, 47], "address_line_1_source_id": 2, "gross_floor_area_source_id": 2, "pm_property_id_source_id": 2, "release_date_source_id": 2, "year_ending_source_id": 2, "summar": 2, "5": [2, 5, 8, 12, 20, 34], "were": [2, 5, 15, 16, 22, 34], "twice": [2, 15], "row": [2, 3, 16, 20], "step": [2, 5, 11, 13, 15, 16, 47, 48], "20505": 2, "There": [2, 5, 11, 16, 48], "still": [2, 5, 47], "orgs_organ": 2, "filter": [2, 5, 19, 44], "get_build": 2, "membership": 2, "sourc": [2, 5, 7, 9, 10, 12, 16, 34, 46, 47, 48], "extend": [2, 19], "note": [2, 4, 6, 10, 13, 16, 19, 24, 34, 44, 46, 47, 48], "made": [2, 28], "input": 2, "none": [2, 5, 11, 19, 20, 24, 28, 34, 36, 37, 39, 41, 44], "itself": [2, 5], "so": [2, 5, 7, 14, 15, 16, 22, 28, 34, 44, 46, 48], "block": [2, 11, 34, 47], "number": [2, 5, 11, 15, 16, 19, 20, 34, 44, 45, 47], "block_number_source_id": 2, "unlik": [2, 11], "who": [2, 47], "block_numb": [2, 34], "nevertheless": 2, "year_built": [2, 20, 34, 41], "those": [2, 11, 15, 28, 34, 44], "street": 2, "usual": [2, 18, 47], "cannot": [2, 20, 34], "serv": 2, "storag": [2, 13, 16, 20], "an_unknown_field": 2, "something_els": [2, 19], "some_buildingsnapshot_id": 2, "another_buildingsnapshot_id": 2, "truncat": 2, "too": [2, 48], "255": 2, "charact": 2, "jurisdiction_tax_lot_id": [2, 20, 34], "custom_id_1": [2, 20, 34], "ubid": [2, 34], "lot_numb": [2, 34], "district": [2, 34], "owner": [2, 12, 13, 15, 34, 41, 47], "owner_email": [2, 34], "owner_telephon": [2, 34], "owner_address": [2, 34, 41], "owner_city_st": [2, 34], "owner_postal_cod": [2, 34], "property_nam": [2, 34], "address_line_2": [2, 34], "citi": [2, 34], "postal_cod": [2, 34], "state_provinc": 2, "building_certif": [2, 34], "No": [2, 16], "store": [2, 5, 11, 20, 34, 46], "run": [3, 4, 5, 6, 8, 11, 15, 16, 19, 45, 48], "pair": [3, 10, 15, 16, 41], "taxlot": [3, 5, 15, 16, 17, 19, 20, 48], "demand": 3, "select": [3, 5, 9, 11, 15, 28, 41], "inventori": [3, 29, 34], "page": [3, 4, 5, 10, 15, 19, 41, 47], "action": [3, 4, 5, 11, 15, 45], "defin": [3, 5, 14, 20, 24, 28, 34], "rule": [3, 15, 17, 20, 44], "broken": 3, "satisfi": 3, "notabl": 3, "when": [3, 5, 10, 11, 13, 14, 16, 19, 20, 24, 34, 41, 44, 45, 46, 47], "label": [3, 5, 15, 17, 20, 34, 44], "appli": [3, 5, 14, 20], "elabor": 3, "attach": [3, 47], "break": [3, 46], "doe": [3, 4, 5, 7, 10, 20, 29, 44, 47], "happen": [3, 10, 14, 15, 16], "due": [3, 5, 13, 46], "perform": [3, 4, 5, 7, 10, 16, 19, 45], "reason": [3, 15], "intend": [4, 47], "linux": [4, 6, 10, 46], "cloud": [4, 11], "aw": [4, 10, 47], "hardwar": 4, "offici": 4, "window": [4, 5, 8, 11], "product": [4, 5, 6, 12, 18, 46], "desir": [4, 5, 11, 13, 44, 47], "setup": [4, 5, 10, 19, 24, 41, 47], "prerequisit": [4, 8], "depend": [4, 5, 8, 11, 16], "javascript": [4, 5, 7, 8, 10], "configur": [4, 5, 8, 10, 16, 17, 20, 46], "cach": [4, 16, 19, 20, 34, 41, 47], "broker": [4, 47], "celeri": [4, 5, 16, 20, 36, 45, 46, 47], "background": 4, "task": [4, 17, 20, 22, 45, 47], "worker": [4, 45, 47], "initi": [4, 5, 15, 20, 24, 28, 41, 44, 47], "web": [4, 5, 6, 7, 10, 14, 46], "environ": [4, 5, 11, 46, 47], "variabl": [4, 5, 11, 18, 37, 46, 47], "mail": 4, "servic": [4, 6, 11, 12, 16, 48], "deploi": [4, 5, 11, 16], "kubernet": [4, 10], "helm": [4, 10], "cluster": 4, "resourc": [4, 10], "through": [4, 5, 11, 12, 34, 48], "variou": [4, 5, 9, 16], "custom": [4, 5, 6, 16, 18, 20, 22, 28, 34], "webserv": [4, 46], "issu": [4, 5, 9, 10, 13, 16, 44, 46], "enabl": [4, 5, 9, 11, 20, 44, 47], "up": [4, 5, 11, 13, 15, 16, 20, 24, 41, 44, 46, 47, 48], "io": [4, 5, 6], "raven_config": 4, "sentry_js_dsn": [4, 11], "frontend": 4, "moment": [4, 13], "sentry_sdk": 4, "integr": [4, 10], "djangointegr": 4, "celeryintegr": 4, "init": [4, 47], "dsn": [4, 11], "ingest": 4, "job": 4, "traces_sample_r": 4, "captur": [4, 5, 15], "100": [4, 11, 20, 39], "transact": 4, "we": [4, 5, 11, 13, 14, 19, 34, 41, 44, 48], "adjust": [4, 48], "wish": 4, "associ": [4, 15, 20, 34], "assum": [4, 11, 44, 47], "mai": [4, 12, 15, 16, 34, 44, 46, 47], "send": [4, 11, 13, 19, 20, 24], "pii": 4, "send_default_pii": 4, "job_id": 4, "3": [5, 11, 12, 13, 15, 20, 34, 46, 47], "beta": 5, "22": 5, "21": [5, 11], "20": 5, "19": 5, "17": 5, "16": [5, 13], "10": [5, 11, 13, 20, 44, 46], "7": 5, "osx": [5, 8], "translat": [5, 10], "philosophi": 5, "style": [5, 44], "don": [5, 46], "t": [5, 15, 16, 34, 44, 46, 47], "crazi": 5, "indirect": [5, 12], "interpol": 5, "precommit": 5, "format": [5, 11, 16, 19, 20, 28, 34, 41, 48], "static": [5, 13, 16, 20, 34, 36], "verifi": [5, 6, 13, 48], "syntax": 5, "call": [5, 11, 14, 20, 28, 34, 36, 41, 44, 47], "tox": 5, "begin": 5, "codebas": [5, 22], "benefit": [5, 7, 10], "elimin": 5, "accident": [5, 15], "mistak": 5, "prevent": [5, 15], "bug": 5, "well": [5, 7, 10, 16, 41, 44], "better": [5, 47, 48], "experi": 5, "exhaust": 5, "annot": 5, "function": [5, 7, 10, 11, 17, 19, 34, 37, 41, 44], "refactor": 5, "might": [5, 15, 18], "benefici": 5, "ambigu": [5, 15], "determin": [5, 34, 44], "ton": 5, "effort": 5, "built": [5, 20, 24, 34, 41], "collect": 5, "dict": [5, 19, 20, 28, 29, 34, 36, 41], "tupl": [5, 28, 34, 44], "capit": 5, "modul": [5, 10, 18, 41], "typeddict": 5, "notrequir": 5, "typing_extens": 5, "packag": [5, 8, 10, 11, 13, 17], "option": [5, 13, 19, 24, 34, 37, 44], "dictionari": [5, 20, 29, 34, 41], "common": [5, 6, 11], "gotcha": 5, "try": [5, 15, 28, 36, 41, 46], "class": [5, 19, 20, 22, 24, 28, 34, 36, 37, 39, 41, 44], "method": [5, 7, 10, 16, 19, 20, 22, 24, 28, 34, 36, 41, 44], "__future__": 5, "re": [5, 11, 15, 41, 47, 48], "warn": [5, 20], "runtim": 5, "sure": [5, 6, 7, 11, 16, 34, 41, 46, 47], "wast": 5, "pleas": [5, 9], "checker": 5, "feel": 5, "free": 5, "throw": 5, "ignor": [5, 15, 34], "problemat": 5, "top": [5, 24, 34, 48], "ci": 5, "current": [5, 19, 34, 45, 48], "mypi": 5, "own": [5, 13, 15], "extens": [5, 16, 34, 47], "vscode": 5, "pylanc": 5, "microsoft": 5, "pyright": 5, "typecheck": 5, "complic": 5, "mix": 5, "extra": [5, 29, 34], "propertyst": [5, 16, 17, 20, 29, 34], "taxlotst": [5, 16, 17, 20, 29, 34], "model": [5, 7, 10, 14, 16, 17, 29, 36, 44], "yet": 5, "database_column": [5, 34], "copar": [5, 34], "sql": [5, 34], "keep_field": 5, "makemigr": 5, "script": [5, 6, 16, 44, 47, 48], "new_db_field": 5, "def": [5, 19, 36], "forward": [5, 11, 20, 24, 34], "schema_editor": 5, "get_model": 5, "column_nam": [5, 16, 34, 41], "geocoding_confid": [5, 34], "table_nam": [5, 16, 20, 34], "display_nam": [5, 20, 34], "geocod": [5, 16, 34, 47], "column_descript": [5, 34], "data_typ": [5, 20, 34], "is_extra_data": [5, 16, 34], "count": [5, 34], "elif": 5, "col": [5, 28], "els": [5, 36], "than": [5, 11, 12, 15, 20, 28, 48], "0090_auto_20180425_1154": 5, "oper": 5, "runpython": 5, "unit": [5, 12, 16, 17, 20, 22, 34, 45], "fix": [5, 16], "failur": 5, "test_mapping_data": [5, 17], "test_kei": 5, "test_column": 5, "test_column_retrieve_schema": 5, "test_column_retrieve_db_field": 5, "workflow": [5, 9, 28], "toggl": 5, "mainten": 5, "mode": [5, 46, 47], "displai": [5, 15, 16, 34, 46], "api": [5, 7, 8, 9, 10, 14, 16, 17, 19, 24, 28, 41, 48], "exec": [5, 11, 16, 46], "seed_web": [5, 46], "sh": [5, 6, 16, 47, 48], "off": [5, 44, 46], "angular": [5, 48], "delimit": 5, "thu": 5, "renam": [5, 34], "BE": [5, 12], "interpolateprovid": 5, "startsymbol": 5, "endsymbol": 5, "eas": [5, 11], "automat": [5, 15, 16, 48], "readthedoc": 5, "en": 5, "latest": [5, 11, 15], "html": [5, 11, 13, 48], "xmlhttprequest": 5, "cooki": 5, "x": [5, 6], "csrftoken": 5, "seed_app": 5, "statehelperprovid": 5, "urlrouterprovid": 5, "locationprovid": 5, "home": [5, 6, 34, 45], "templateurl": 5, "static_url": [5, 13], "control": [5, 16, 34, 48], "profile_control": 5, "resolv": [5, 6, 15], "auth_payload": 5, "auth_servic": 5, "q": [5, 13, 19], "user_servic": 5, "var": [5, 47], "get_organ": [5, 44], "is_author": 5, "requires_superus": 5, "user_profile_payload": 5, "get_user_profil": 5, "found": [5, 11, 15, 34, 47], "doc": [5, 11, 47], "djangoproject": 5, "topic": [5, 9], "standard": [5, 7, 12, 18], "logger": 5, "level": [5, 15, 18, 20, 41, 44], "describ": [5, 14, 15, 34, 46], "sever": [5, 16, 20], "debug": [5, 13], "low": [5, 16, 34], "minor": 5, "problem": [5, 9], "major": [5, 48], "critic": 5, "written": [5, 7, 10, 12, 19], "do": [5, 11, 15, 16, 19, 28, 34, 44, 46, 47, 48], "hardcod": 5, "goal": [5, 15], "dynam": [5, 20, 24, 34], "espm": 5, "blob": [5, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "lib": [5, 10, 16, 17, 19, 38, 39, 44, 47], "pm": [5, 22, 28, 34], "brief": 5, "descript": [5, 18, 20, 34], "how": [5, 9, 10, 48], "drop": 5, "distribut": [5, 12], "part": [5, 16, 28], "third": [5, 11, 13], "last": [5, 15, 45], "span": 5, "multipl": [5, 7, 10, 15, 16, 34], "createus": [5, 13, 47], "seedus": [5, 9, 11, 13, 16, 17, 24, 47], "IF": [5, 12], "NOT": [5, 12], "postgi": [5, 8, 13, 16], "timescaledb": [5, 8, 13, 16], "testorg": 5, "timescaledb_pre_restor": 5, "previou": [5, 44], "pg_restor": 5, "backup": [5, 6, 16, 46], "prod": [5, 11, 13], "prod_20191203_000002": 5, "installed_vers": 5, "being": [5, 15, 19, 44, 45, 46, 47], "default_vers": 5, "pg_available_extens": 5, "timescaledb_post_restor": 5, "disabl": 5, "celerybeat": 5, "salesforc": [5, 19], "domain": [5, 19], "dev1": 5, "salesforce_en": 5, "periodictask": 5, "name__startswith": 5, "salesforce_sync_org": 5, "update_chang": 5, "jasmin": [5, 45], "angular_js_test": [5, 45], "vcr": 5, "cassett": 5, "reus": 5, "respons": [5, 6, 10, 19], "unless": [5, 44, 46], "want": [5, 11, 16, 34, 46, 47], "refresh": 5, "isn": 5, "anyth": [5, 7], "logic": [5, 34], "mapquest": [5, 8, 16], "work": [5, 6, 7, 10, 11, 12, 13, 16, 44, 46, 47], "ll": [5, 46, 48], "small": [5, 19], "testing_mapquest_api_kei": 5, "actual": [5, 15, 41], "just": [5, 11, 15, 34, 37, 46, 47, 48], "delet": [5, 16, 20, 22, 34], "old": [5, 6, 15, 16, 34], "ones": [5, 16, 22], "vcr_cassett": 5, "hidden": 5, "push": [5, 48], "coverag": 5, "report": [5, 9, 34, 41], "under": [5, 47, 48], "83": 5, "eslint": 5, "scss": 5, "stylelint": 5, "prettier": 5, "lint": 5, "older": [5, 16, 46], "websit": [5, 9, 11, 13, 47, 48], "rm": [5, 6, 16], "rf": [5, 16], "htmlout": 5, "sphinx": 5, "b": [5, 15, 28, 41, 44], "code_document": 5, "new_vers": 5, "developer_resourc": 5, "md": [5, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "outsid": 5, "nation": [5, 7, 10, 12], "lab": 5, "review": [5, 9, 48], "fill": [5, 6, 9, 34, 48], "agreement": 5, "fork": 5, "otherwis": [5, 6, 12], "ensur": [5, 11, 20, 24, 34, 44], "ticket": 5, "assign": [5, 19, 34], "board": 5, "progress": [5, 19, 20, 41, 48], "tracker": 5, "branch": [5, 19], "hotfix": 5, "appropri": [5, 6, 44, 46], "convent": 5, "issue_id": 5, "short": [5, 6, 24], "write": [5, 15, 44], "upon": [5, 16], "complet": [5, 15, 16], "pull": [5, 11, 48], "pr": [5, 16], "against": [5, 19, 20, 44], "auto": [5, 10, 48], "featur": [5, 9, 10, 15, 17, 19, 24, 48], "donotpublish": 5, "present": [5, 34, 44], "enhanc": 5, "improv": [5, 7, 10], "publish": [5, 11], "onc": [5, 11, 13, 14, 15, 19, 46, 48], "approv": [5, 12], "readi": [5, 11, 13, 47], "prepar": [5, 16], "prep": 5, "root": [5, 11, 16, 34, 41, 47], "alwai": [5, 15, 34], "rst": 5, "draft": 5, "changelog": 5, "cleanup": [5, 22, 34], "spell": 5, "correct": [5, 11, 16, 19, 34], "letter": 5, "miss": [5, 34], "ui": [5, 11, 14, 34, 48], "lokalis": [5, 48], "main": [5, 9, 11, 14, 17, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 47], "hub": 5, "seedplatform": [5, 6, 11], "amazon": [6, 11, 13], "m5ad": 6, "xlarg": 6, "launch": [6, 11], "remov": [6, 11, 16, 20, 28, 34, 46], "containerd": 6, "runc": 6, "commun": [6, 9, 16], "edit": [6, 15, 47], "transport": 6, "ca": 6, "certif": [6, 34, 41], "gnupg": 6, "agent": 6, "softwar": [6, 7, 10, 12], "fssl": 6, "download": [6, 11, 47], "gpg": 6, "deb": 6, "arch": 6, "amd64": 6, "lsb_releas": 6, "stabl": 6, "ce": 6, "cli": [6, 48], "group": [6, 7, 10, 15, 24], "groupadd": 6, "usermod": 6, "ag": [6, 16], "newgrp": 6, "dn": [6, 13], "correctli": [6, 20, 34], "ip": 6, "v6": 6, "getent": 6, "tutum": 6, "dnsutil": 6, "nslookup": 6, "west": [6, 11], "compos": [6, 16, 46], "25": 6, "unam": 6, "m": 6, "o": [6, 36], "usr": [6, 13, 16, 47], "bin": [6, 13, 16, 47], "chmod": 6, "checkout": [6, 16, 47], "export": [6, 13, 17, 19, 47], "postgres_us": [6, 11], "postgres_db": [6, 11], "postgres_password": [6, 11], "gdeus3fasd1askj89qkaldjfx": 6, "postgres_port": [6, 11], "5432": [6, 11, 13, 16, 47], "secret_kei": [6, 11], "96": 6, "7jg": 6, "_": 6, "z9c9qwwu2": 6, "w": 6, "hb3r322yf3lz": 6, "ekw": 6, "ly": 6, "until": [6, 11, 46], "restor": [6, 10, 47], "seed_admin_us": [6, 11], "seed_admin_password": [6, 11], "7febwal38": 6, "k3jlfa92lakj8ih4": 6, "seed_admin_org": [6, 11], "aws_access_key_id": [6, 11], "aws_access_kei": 6, "aws_secret_access_kei": [6, 11], "aws_secret_kei": 6, "aws_ses_region_nam": [6, 11], "aws_ses_region_endpoint": [6, 11], "server_email": [6, 11], "persist": [6, 15, 34], "volum": [6, 11, 46], "seed_pgdata": [6, 46], "seed_media": [6, 46], "mkdir": [6, 47], "p": [6, 13, 47], "path": [6, 19, 24, 34, 41, 47], "dir": 6, "wai": [6, 11, 12, 13, 47, 48], "swarm": 6, "stack": 6, "implement": [6, 7, 10, 20, 24, 34, 36, 41], "simpli": [6, 16, 20], "yml": [6, 11, 16, 46, 48], "filenam": [6, 34], "bash": [6, 11], "replac": [6, 11, 13, 16, 18, 47], "energi": [7, 9, 12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "effici": [7, 12, 34], "help": [7, 10, 16, 46, 47], "easili": [7, 10, 16, 19, 28], "larg": [7, 10, 11], "combin": [7, 10, 15, 18, 47], "clean": [7, 10, 16, 34, 44], "share": [7, 10, 16, 19], "easi": [7, 10, 11, 13, 47], "flexibl": [7, 10], "cost": [7, 10], "effect": [7, 10, 16], "demonstr": [7, 10], "econom": [7, 10], "environment": [7, 10], "program": [7, 10, 12, 15], "target": [7, 10, 15, 47], "invest": [7, 10], "angularj": [7, 10, 45], "bootstrap": [7, 10, 47], "front": [7, 10], "back": [7, 10, 14, 47], "browser": [7, 10, 47, 48], "interfac": [7, 10, 11], "full": [7, 10, 22, 34], "renew": [7, 10], "laboratori": [7, 10, 12], "fund": [7, 10], "depart": [7, 10, 12], "newdomain": 7, "staticfiles_storag": [7, 16], "comment": [7, 34, 47], "redeploi": 7, "recollect": 7, "compress": 7, "nodej": [8, 13], "nativ": [8, 11, 16, 48], "tutori": 9, "learn": 9, "forum": 9, "announc": 9, "question": [9, 10, 34], "buildingenergytool": 9, "inquiri": 9, "specif": [9, 12, 13, 15, 20, 22, 34], "tool": [9, 11, 48], "desk": 9, "relev": 9, "buildingdata": 9, "gov": [9, 28, 29], "open": [9, 16, 46, 47], "compon": 9, "client": [9, 14, 41, 44], "dataset": [9, 41], "encourag": 9, "seeddevelop": 9, "guid": 10, "monitor": [10, 11], "authent": [10, 13, 44, 45], "payload": 10, "children": [10, 20, 24, 34], "v": [10, 41, 44], "what": [10, 11, 13, 34, 46, 47], "realli": [10, 15], "buildingsnapshot": 10, "canonicalbuild": 10, "_source_id": 10, "field": [10, 15, 16, 19, 20, 24, 28, 29, 34, 36, 44, 47], "extra_data": [10, 20, 34, 44], "possibl": [10, 12, 15, 22, 29], "loss": [10, 12], "why": 10, "depth": 10, "land": [10, 17, 19], "public": [10, 17, 34], "serial": [10, 17, 44], "test": [10, 13, 16, 17, 19, 22, 31, 45, 47], "util": [10, 16, 17, 24], "nginx": [10, 13], "log": [10, 19, 34, 41, 44, 46, 47, 48], "bede": [10, 17], "complianc": 10, "reset": [10, 19, 20, 46], "contribut": 10, "best": [10, 15], "practic": 10, "licens": [10, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "ask": 10, "index": [10, 13], "robust": 11, "orchestr": 11, "further": 11, "choic": 11, "slightli": 11, "provis": 11, "googl": [11, 48], "gcp": 11, "azur": 11, "ak": 11, "userguid": 11, "cliv2": 11, "insert": [11, 34, 46], "secret": [11, 46, 47], "region": [11, 13], "east": [11, 13, 34], "output": [11, 46], "mac": [11, 46, 47], "homebrew": [11, 47], "brew": [11, 16, 47, 48], "did": [11, 20], "properli": [11, 41], "pod": 11, "replicaset": 11, "unfamiliar": 11, "gui": 11, "One": 11, "dashboard": 11, "parti": [11, 12, 13], "octant": 11, "eksctl": 11, "elast": 11, "disregard": 11, "eksct": 11, "termin": [11, 47], "adequ": 11, "permiss": [11, 12, 24], "bracket": 11, "m5": 11, "min": [11, 20, 28], "tag": [11, 37, 48], "env": [11, 46, 47], "persistentvolum": 11, "media": [11, 24, 46], "access_key_id": 11, "secret_access_kei": 11, "django_settings_modul": [11, 13, 47], "super": [11, 44, 46, 47], "yaml": [11, 19], "bsyncr": 11, "analysi": [11, 15], "bsyncr_server_port": 11, "5000": [11, 16], "bsyncr_server_host": 11, "sentri": 11, "sentry_raven_dsn": 11, "self": [11, 19, 28, 34, 36, 44, 45], "registr": 11, "secur": 11, "google_recaptcha_site_kei": 11, "recaptcha": 11, "google_recaptcha_secret_kei": 11, "imag": [11, 46], "noaa": 11, "noaa_token": 11, "context": [11, 17, 37, 45], "onlin": 11, "status": 11, "extern": 11, "ingress": 11, "someth": [11, 46, 47], "loadbalanc": 11, "154": 11, "227": 11, "my": [11, 13, 47], "uniqu": [11, 16, 34], "32291": 11, "tcp": 11, "dedeploi": 11, "find": [11, 15, 20, 34, 47], "talk": 11, "kubeconfig": 11, "yourself": [11, 46, 47], "seedorg": [11, 47], "badpass": [11, 13, 47], "restart": [11, 13, 16, 46, 47], "rollout": 11, "copyright": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "2017": 12, "2024": [12, 20], "allianc": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "sustain": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "llc": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "contributor": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "right": [12, 29, 48], "reserv": [12, 45], "redistribut": 12, "binari": 12, "modif": [12, 19], "permit": 12, "condit": [12, 20, 34], "met": 12, "retain": [12, 34], "notic": 12, "disclaim": 12, "reproduc": 12, "materi": 12, "neither": 12, "holder": [12, 41], "nor": 12, "endors": 12, "promot": [12, 34], "deriv": [12, 34], "prior": 12, "claus": 12, "trademark": 12, "confusingli": 12, "similar": [12, 13, 34], "design": 12, "govern": 12, "employe": 12, "respect": [12, 34], "BY": 12, "THE": 12, "AND": 12, "AS": 12, "express": [12, 48], "OR": [12, 44], "impli": 12, "warranti": 12, "BUT": 12, "limit": 12, "TO": [12, 13, 47], "OF": 12, "merchant": 12, "fit": 12, "FOR": 12, "particular": [12, 14, 15, 34], "IN": 12, "NO": 12, "event": [12, 15, 34], "shall": 12, "THEIR": 12, "liabl": 12, "direct": 12, "incident": 12, "special": [12, 16, 34], "exemplari": 12, "consequenti": 12, "damag": 12, "procur": 12, "substitut": 12, "good": [12, 41], "profit": 12, "busi": 12, "interrupt": 12, "ON": [12, 13, 47], "theori": 12, "liabil": 12, "contract": 12, "strict": 12, "tort": 12, "neglig": 12, "aris": 12, "advis": 12, "SUCH": 12, "2014": 12, "regent": 12, "univers": 12, "california": 12, "lawrenc": 12, "berkelei": 12, "subject": [12, 24], "receipt": 12, "dept": 12, "thereof": 12, "while": [13, 15, 46], "bare": 13, "bone": 13, "counterpart": 13, "desktop": [13, 46], "ppa": [13, 16], "timescal": [13, 16, 47], "python3": [13, 47], "gdal": 13, "selenium": 13, "protractor": 13, "jre": 13, "seeddb": [13, 16, 47], "seedpass": [13, 16, 47], "prompt": [13, 47], "tune": [13, 16], "su": [13, 47], "grant": [13, 47], "privileg": [13, 47], "alter": [13, 47], "createrol": 13, "exit": [13, 47], "pip3": [13, 16], "gi": [13, 16, 47], "localhost": [13, 16, 47], "could": [13, 16, 18, 28, 36, 46, 47], "mysql": 13, "dbshell": 13, "127": [13, 16, 41, 46, 47], "lbnl": 13, "Of": [13, 47], "cours": [13, 47], "somewher": [13, 47], "8000": [13, 47], "runserv": [13, 18, 47], "sit": 13, "behind": [13, 16], "dj": 13, "collectstat": 13, "lock": [13, 19, 41], "node_modul": 13, "openlay": 13, "ext": 13, "static_root": 13, "collected_stat": 13, "dedic": 13, "receiv": [13, 34, 41], "bashrc": [13, 47], "overrid": [13, 22, 34, 44], "sentry_dsn": 13, "xyz": 13, "getsentri": 13, "123": 13, "only_http": 13, "email_backend": 13, "django_s": 13, "sesbackend": 13, "consol": [13, 48], "quickstart": 13, "sandbox": 13, "sender": [13, 34], "recipi": 13, "notif": 13, "sn": 13, "notifi": 13, "bounc": 13, "dkim": 13, "spf": 13, "put": [13, 34, 47, 48], "compat": [13, 20], "gmail": 13, "emailbackend": 13, "domain_urlconf": 13, "down": [14, 44, 46], "overview": 14, "batch": 14, "invok": 14, "save_raw_data": 14, "done": [14, 19, 44, 47, 48], "know": [14, 15], "portfolio": [14, 22, 28], "metadata": 14, "data_import": [14, 22], "dataimportbackend": 14, "upload_complet": 14, "attribut": [14, 29, 44], "importfil": [14, 22, 44], "subsequ": [14, 15], "exactli": 14, "space": [14, 24, 34], "uppercas": 14, "relationship": [15, 34, 44], "between": [15, 24, 46, 47], "tax": [15, 20, 34], "thei": [15, 20, 28, 34, 45, 47], "criteria": 15, "customiz": 15, "high": [15, 20, 34], "identifi": [15, 16, 20], "represent": [15, 19], "discard": 15, "phone": 15, "shouldn": [15, 16], "much": [15, 41, 47], "whenev": 15, "execut": [15, 20, 24, 34, 45], "few": [15, 48], "unrel": 15, "scope": 15, "scenario": [15, 34], "exclud": [15, 19, 20, 22, 34], "overlap": 15, "prioriti": [15, 29, 34], "final": [15, 16, 28], "give": [15, 47], "protect": [15, 44], "period": [15, 34], "meter": [15, 16, 17, 22, 34], "mean": 15, "aggreg": 15, "altern": 15, "themselv": [15, 48], "mention": 15, "earlier": 15, "assumpt": 15, "avoid": [15, 47, 48], "unresolv": 15, "situat": [15, 46], "wouldn": 15, "cross": 15, "alreadi": [15, 16, 34, 47], "individu": 15, "explicit": 15, "trigger": [15, 46], "explicitli": 15, "chosen": 15, "incom": 15, "whole": [15, 18, 48], "round": 15, "origin": [15, 34], "establish": 15, "reestablish": 15, "commit": [15, 48], "affect": 15, "difficult": 15, "revers": [15, 20, 24, 34], "tri": 15, "unmerg": 15, "unlink": 15, "intervent": 15, "accomplish": 15, "veri": [15, 16, 34], "fact": 15, "lead": 15, "carri": 15, "consider": [15, 22], "taken": [15, 19], "entri": [15, 19], "anoth": [15, 18], "oppos": 15, "amongst": 15, "duplic": [15, 16, 28, 34, 41, 47, 48], "flag": 15, "doesn": [15, 46], "bit": 16, "celery_result_backend": 16, "celery_task_default_queu": 16, "celery_task_queu": 16, "exchang": 16, "routing_kei": 16, "notat": 16, "protocol": 16, "censu": 16, "tract": 16, "disadvantag": 16, "around": [16, 44], "minut": 16, "across": [16, 19, 34], "gaug": 16, "impact": 16, "deprec": [16, 41], "often": 16, "aros": 16, "upsert": 16, "typic": [16, 20, 34], "seed_column": 16, "300": 16, "kbtu": [16, 20], "ft2": 16, "units_pint": [16, 34], "complex": 16, "column_id": [16, 34], "seed_columnmapping_": 16, "constraint": 16, "seed_columnmapping_column_raw": 16, "old_id": 16, "seed_columnmapping_column_map": 16, "encount": [16, 19], "0118_match_merge_link_all_org": 16, "reorder": 16, "118": 16, "recogn": 16, "cycl": [16, 17, 41], "fulli": [16, 24], "superperm": 16, "whole_org_match_merge_link": 16, "insid": [16, 41, 46], "seri": 16, "tap": [16, 48], "timescaledb_mov": 16, "awhil": 16, "recalcul": 16, "pars": [16, 19, 34], "bldg": [16, 34], "cast": [16, 34], "bytestr": 16, "On": 16, "indic": [16, 41], "postgres_container_id": 16, "operationalerror": 16, "bower": 16, "vendor": 16, "css": 16, "default_file_storag": 16, "filesystemstorag": 16, "sign": 16, "submodul": [17, 25, 38], "templat": [17, 34, 45, 47], "sentry_j": [17, 18], "session_kei": [17, 18], "de_camel_cas": [17, 18], "robots_txt": [17, 18], "wsgi": [17, 19], "inherit": 17, "comparisonerror": [17, 20], "dataqualitycheck": [17, 20], "dataqualitytypecasterror": [17, 20], "unitmismatcherror": [17, 20], "format_pint_viol": [17, 20], "notdeletedmanag": [17, 22], "kbtu_thermal_conversion_factor": [17, 22], "usage_point_id": [17, 22], "subpackag": [17, 41], "customcreateuserform": [17, 24], "loginform": [17, 24], "userlogintest": [17, 24], "account_activation_s": [17, 24], "create_account": [17, 24], "landing_pag": [17, 24], "password_reset": [17, 24], "password_reset_complet": [17, 24], "password_reset_confirm": [17, 24], "password_reset_don": [17, 24], "password_set": [17, 24], "signup": [17, 19, 24, 41], "mapper": [17, 19], "create_column_regex": [17, 28], "get_pm_map": [17, 28], "mapping_column": 17, "mappingcolumn": [17, 28], "sort_dupl": [17, 28], "mapping_data": 17, "test_mapp": 17, "test_mapping_column": 17, "get_attrs_with_map": [17, 29], "get_propertystate_attr": [17, 29], "get_state_attr": [17, 29], "get_state_to_state_tupl": [17, 29], "get_taxlotstate_attr": [17, 29], "merge_st": [17, 29, 34], "seed_map": [17, 19], "auditlog": 17, "columncasterror": [17, 34], "validate_model": [17, 34], "statuslabel": [17, 20, 34, 36], "propertyauditlog": [17, 34], "propertyview": [17, 20, 34], "post_save_properti": [17, 34], "post_save_property_st": [17, 34], "post_save_property_view": [17, 34], "pre_delete_st": [17, 34], "set_default_access_level_inst": [17, 34], "sync_latitude_longitude_and_long_lat": [17, 34], "taxlotauditlog": [17, 34], "taxlotview": [17, 20, 34], "post_save_taxlot_st": [17, 34], "post_save_taxlot_view": [17, 34], "templatetag": [17, 19], "helper": [17, 19, 28, 37, 41, 44], "decor": [17, 44], "drfendpointmixin": [17, 19], "ajax_request": [17, 19], "ajax_request_class": [17, 19], "decorator_to_mixin": [17, 19], "get_prog_kei": [17, 19], "lock_and_track": [17, 19], "require_organization_id": [17, 19], "require_organization_id_class": [17, 19], "require_organization_membership": [17, 19], "factori": [17, 38, 39, 41], "build_shared_buildings_org": [17, 19], "create_inventory_queryset": [17, 19], "get_inventory_fieldnam": [17, 19], "get_orgs_w_public_field": [17, 19], "inventory_search_filter_sort": [17, 19], "parse_bodi": [17, 19], "process_search_param": [17, 19], "search_inventori": [17, 19], "search_properti": [17, 19], "search_taxlot": [17, 19], "delete_organ": [17, 19], "invite_new_user_to_se": [17, 19], "send_salesforce_error_log": [17, 19], "signuptokengener": [17, 19], "celerydatetimeseri": [17, 36], "labelseri": [17, 36], "adminviewstest": [17, 19, 41], "classdecoratortest": [17, 19, 41], "requireorganizationidtest": [17, 19, 41], "testdecor": [17, 19, 41], "testerror": [17, 19, 41], "testtask": [17, 19, 41], "datasetpermissionstest": [17, 19, 41], "getdatasetsviewstest": [17, 19, 41], "importfileviewstest": [17, 19, 41], "inventoryviewtest": [17, 19, 41], "mainviewtest": [17, 19, 41], "testmcmview": [17, 19, 41], "accesslevelbasetestcas": [17, 19, 41], "assertdictsubsetmixin": [17, 19, 41], "datamappingbasetestcas": [17, 19, 41], "deletemodelstestcas": [17, 19, 41], "fakecli": [17, 19, 41], "fakerequest": [17, 19, 41], "apibypasscsrfmiddlewar": [17, 44], "orgcreatemixin": [17, 44], "orgcreateupdatemixin": [17, 44], "orgmixin": [17, 44], "orgquerysetmixin": [17, 44], "orgupdatemixin": [17, 44], "orgvalidatemixin": [17, 44], "orgvalid": [17, 44], "profileidmixin": [17, 44], "api_endpoint": [17, 44], "api_endpoint_class": [17, 44], "clean_api_regex": [17, 44], "drf_api_endpoint": [17, 44], "format_api_docstr": [17, 44], "get_all_url": [17, 44], "get_api_endpoint": [17, 44], "get_api_request_us": [17, 44], "get_org_id_from_valid": [17, 44], "rgetattr": [17, 44], "get_source_typ": [17, 44], "create_organ": [17, 44], "create_suborgan": [17, 44], "default_pm_map": [17, 44], "convert_datestr": [17, 44], "convert_to_js_timestamp": [17, 44], "parse_datetim": [17, 44], "tm": [18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "template_context": 18, "expos": 18, "runfcgi": 18, "discov": 18, "wsgi_appl": 18, "sens": 18, "later": [18, 28, 46], "deleg": [18, 20, 24, 34], "introduc": 18, "middlewar": [18, 44], "framework": [18, 44], "breadcrumb": 19, "breadcrumbnod": [19, 37], "render": [19, 24, 37, 48], "urlbreadcrumbnod": [19, 37], "breadcrumb_root": [19, 37], "breadcrumb_url": [19, 37], "breadcrumb_url_root": [19, 37], "create_crumb": [19, 37], "create_crumb_first": [19, 37], "factor": [19, 22, 38], "chomski": [19, 38, 39], "djangofunctionalfactori": [19, 38, 39], "invalid_test_cc_numb": [19, 38, 39], "rand_bool": [19, 38, 39], "rand_citi": [19, 38, 39], "rand_city_suffix": [19, 38, 39], "rand_curr": [19, 38, 39], "rand_dat": [19, 38, 39], "rand_domain": [19, 38, 39], "rand_email": [19, 38, 39], "rand_float": [19, 38, 39], "rand_int": [19, 38, 39], "rand_nam": [19, 38, 39], "rand_phon": [19, 38, 39], "rand_plant_nam": [19, 38, 39], "rand_str": [19, 38, 39], "rand_street_address": [19, 38, 39], "rand_street_suffix": [19, 38, 39], "test_cc_numb": [19, 38, 39], "valid_test_cc_numb": [19, 38, 39], "test_add_org": [19, 41], "test_add_org_dup": [19, 41], "test_add_owner_existing_org_to_non_root": [19, 41], "test_add_user_existing_org": [19, 41], "test_add_user_new_org": [19, 41], "test_add_user_no_org": [19, 41], "test_signup_process": [19, 41], "test_signup_process_force_lowercase_email": [19, 41], "test_ajax_request_class_dict": [19, 41], "test_ajax_request_class_dict_status_error": [19, 41], "test_ajax_request_class_dict_status_fals": [19, 41], "test_ajax_request_class_format_typ": [19, 41], "test_require_organization_id_class_no_org_id": [19, 41], "test_require_organization_id_class_org_id": [19, 41], "test_require_organization_id_class_org_id_not_int": [19, 41], "test_require_organization_id_fail_no_kei": [19, 41], "test_require_organization_id_fail_not_numer": [19, 41], "test_require_organization_id_success_integ": [19, 41], "test_require_organization_id_success_str": [19, 41], "pk": [19, 41, 44], "test_get_prog_kei": [19, 41], "test_increment_cach": [19, 41], "test_lock": [19, 41], "test_locking_w_except": [19, 41], "test_progress": [19, 41], "unlock": [19, 41], "test_delete_organ": [19, 41], "test_dataset_count": [19, 41], "test_dataset_cr": [19, 41], "test_dataset_destroi": [19, 41], "test_dataset_list": [19, 41], "test_dataset_retriev": [19, 41], "test_dataset_upd": [19, 41], "test_delete_dataset": [19, 41], "test_get_dataset": [19, 41], "test_get_datasets_count": [19, 41], "test_get_datasets_count_invalid": [19, 41], "test_update_dataset": [19, 41], "test_delete_fil": [19, 41], "test_get_import_fil": [19, 41], "test_get_matching_and_geocoding_result": [19, 41], "test_get_cycl": [19, 41], "test_get_properti": [19, 41], "test_get_properties_cycle_id": [19, 41], "test_get_properties_empty_pag": [19, 41], "test_get_properties_page_not_an_integ": [19, 41], "test_get_properties_pint_field": [19, 41], "test_get_properties_profile_id": [19, 41], "test_get_properties_property_extra_data": [19, 41], "test_get_properties_select_al": [19, 41], "test_get_properties_taxlot_extra_data": [19, 41], "test_get_properties_with_taxlot": [19, 41], "test_get_properties_with_taxlots_with_footprint": [19, 41], "test_get_properties_wrong_query_param": [19, 41], "test_get_property_column": [19, 41], "test_get_property_multiple_taxlot": [19, 41], "test_get_taxlot": [19, 41], "test_get_taxlot_column": [19, 41], "test_get_taxlots_empty_pag": [19, 41], "test_get_taxlots_extra_data": [19, 41], "test_get_taxlots_multiple_taxlot": [19, 41], "test_get_taxlots_no_cycle_id": [19, 41], "test_get_taxlots_page_not_an_integ": [19, 41], "test_get_taxlots_profile_id": [19, 41], "test_postoffic": [19, 41], "test_update_pint_fields_with_modified_display_set": [19, 41], "test_hom": [19, 41], "assert_expected_map": [19, 41], "expected_map": [19, 41], "raw_columns_expect": [19, 41], "test_create_dataset": [19, 41], "test_get_column_mapping_suggest": [19, 41], "test_get_column_mapping_suggestions_pm_fil": [19, 41], "test_get_column_mapping_suggestions_with_column": [19, 41], "test_get_raw_column_nam": [19, 41], "test_save_column_map": [19, 41], "test_save_column_mappings_idempot": [19, 41], "login_as_child_memb": [19, 41], "login_as_root_memb": [19, 41], "login_as_root_own": [19, 41], "assertdictcontainssubset": [19, 41], "create_import_fil": [19, 41], "set_up": [19, 41], "teardown": [19, 41], "meta": [19, 24, 36, 41], "bodi": [19, 41], "alia": [19, 24, 36, 44, 47], "mixin": [19, 44], "func": 19, "annoi": 19, "slash": 19, "serializ": [19, 36], "http_accept": 19, "my_view": 19, "news_titl": 19, "titl": [19, 37], "convert": [19, 44], "loginrequiredmixin": 19, "login_requir": [19, 44], "myview": 19, "someview": 19, "some_decor": 19, "func_nam": 19, "import_file_pk": 19, "fn": [19, 44], "arg": [19, 20, 22, 24, 34, 36, 44, 45], "kwarg": [19, 20, 22, 24, 34, 36, 41, 44, 45], "executor": 19, "int": [19, 28, 34, 44], "pertain": [19, 22], "sibl": 19, "inventory_typ": [19, 34, 48], "order_bi": 19, "other_org": 19, "cycle_id": [19, 34], "queryset": [19, 20, 22, 44], "inst": [19, 29, 34, 44], "str": [19, 34, 41, 44], "publicli": 19, "sort": [19, 28], "tax_lot_id": [19, 20], "sort_revers": 19, "bool": [19, 20, 28, 34, 44], "asc": 19, "dsc": 19, "pagin": 19, "number_per_pag": 19, "show_shared_build": [19, 24], "global": [19, 44, 45, 47], "other_search_param": 19, "project_id": 19, "is_api_request": 19, "intern": 19, "boolean": [19, 20, 28, 34], "fieldnam": [19, 20, 44], "unicod": [19, 20], "org_pk": 19, "delete_organization_build": 19, "email_address": 19, "user_pk": 19, "first_nam": [19, 24], "invit": 19, "newli": 19, "default_token_gener": 19, "new_us": 19, "noth": 19, "sync": [19, 24], "aleck": 19, "landgraf": 19, "token_gener": 19, "master": [19, 24], "expir": 19, "three": 19, "dai": 19, "strategi": 19, "mechan": 19, "check_token": 19, "token_expir": 19, "make_token": 19, "data_qu": 20, "doesnotexist": [20, 24, 34], "objectdoesnotexist": [20, 24, 34], "multipleobjectsreturn": [20, 24, 34], "required_field": [20, 24], "add_invalid_geometry_entry_provid": 20, "row_id": 20, "add_result_comparison_error": 20, "rule_check": 20, "add_result_dimension_error": 20, "add_result_is_nul": 20, "add_result_max_error": 20, "rule_max": 20, "add_result_min_error": 20, "rule_min": 20, "add_result_missing_and_non": 20, "add_result_missing_req": 20, "add_result_string_error": 20, "add_result_type_error": 20, "add_rul": 20, "add_rule_if_new": 20, "cache_kei": 20, "check_data": 20, "record_typ": [20, 34], "get_fieldnam": 20, "wrapper": [20, 24, 34], "defer": [20, 24, 34], "read": [20, 22, 24, 34], "initialize_cach": 20, "chunk": 20, "random": 20, "initialize_rul": 20, "accessor": [20, 24, 34], "side": [20, 24, 34, 48], "forwardonetoonedescriptor": [20, 24, 34], "subclass": [20, 22, 24, 34, 36], "foreignkei": [20, 24, 34], "related_nam": [20, 24, 34], "forwardmanytoonedescriptor": [20, 24, 34], "remove_all_rul": 20, "remove_status_label": 20, "label_class": 20, "linked_id": 20, "rang": 20, "either": [20, 34, 41, 44, 46, 47, 48], "reset_all_rul": 20, "reiniti": 20, "reset_default_rul": 20, "reset_result": 20, "classmethod": [20, 24, 34, 39], "retriev": [20, 34, 41, 44], "previous": 20, "backward": 20, "obj": [20, 36, 44], "retrieve_result_by_address": 20, "retrieve_result_by_tax_lot_id": 20, "jurisdict": [20, 34], "reversemanytoonedescriptor": [20, 24, 34], "create_forward_many_to_many_manag": [20, 24, 34], "save_to_cach": 20, "rememb": 20, "update_status_label": 20, "add_to_result": 20, "default_rul": 20, "not_nul": 20, "rule_typ": 20, "conditioned_floor_area": [20, 34], "7000000": 20, "ft": 20, "energy_scor": [20, 34], "generation_d": [20, 34], "20241231": 20, "18890101": 20, "occupied_floor_area": [20, 34], "recent_sale_d": [20, 34], "site_eui": [20, 34], "site_eui_weather_norm": [20, 34], "source_eui": [20, 34], "source_eui_weather_norm": [20, 34], "1700": 20, "rule_exclud": 20, "rule_includ": 20, "rule_not_nul": 20, "rule_rang": 20, "rule_requir": 20, "rule_type_custom": 20, "rule_type_default": 20, "severity_error": 20, "severity_valid": 20, "severity_warn": 20, "type_area": 20, "type_d": 20, "type_eui": 20, "type_numb": 20, "type_str": 20, "type_year": 20, "data_quality_check": 20, "data_quality_check_id": 20, "for_derived_column": 20, "format_str": 20, "get_data_type_displai": 20, "integerfield": [20, 34], "get_rule_type_displai": 20, "get_severity_displai": 20, "maximum_valid": 20, "greater": [20, 28, 47], "maximum": [20, 45], "minimum_valid": 20, "less": 20, "minimum": 20, "status_label": 20, "status_label_id": 20, "str_to_data_typ": 20, "therefor": 20, "definit": 20, "variant": 20, "text_match": 20, "valid_text": 20, "text": 20, "regex": [20, 28, 44], "source_valu": 20, "pint": 20, "violat": [20, 34], "human": [20, 44], "readabl": [20, 41, 44], "quantiti": 20, "formatted_valu": 20, "formatted_min": 20, "formatted_max": 20, "get_al": 22, "filesystem": 22, "get_queryset": [22, 44], "behavior": 22, "use_for_related_field": 22, "countri": 22, "thermal": 22, "convers": 22, "nrel": [22, 28], "deduc": 22, "regard": 22, "align": 22, "thermal_conversion_assumpt": 22, "enum": 22, "concept": 22, "sole": 22, "irrespect": 22, "raw_source_id": 22, "extract": 22, "usag": 22, "greenbutton": 22, "uri": 22, "eula": [24, 25], "usercreationform": 24, "widget": 24, "emailinput": 24, "base_field": 24, "password1": 24, "charfield": [24, 34], "password2": 24, "emailfield": 24, "declared_field": 24, "auto_id": 24, "id_": 24, "prefix": [24, 44], "error_class": 24, "errorlist": 24, "label_suffix": 24, "empty_permit": 24, "field_ord": 24, "use_required_attribut": 24, "abstractbaseus": 24, "permissionsmixin": 24, "abstract": 24, "compliant": [24, 34], "username_field": 24, "analysis_set": 24, "columnmapping_set": 24, "cycle_set": 24, "date_join": 24, "deactivate_us": 24, "default_building_detail_custom_column": 24, "default_custom_column": 24, "default_organ": [24, 44], "default_organization_id": 24, "email_us": 24, "from_email": 24, "generate_kei": 24, "adapt": 24, "tastypi": 24, "toastdriven": 24, "l47": 24, "get_absolute_url": 24, "get_full_nam": 24, "plu": 24, "last_nam": 24, "get_next_by_date_join": 24, "datetimefield": [24, 34], "is_next": [24, 34], "get_previous_by_date_join": 24, "get_short_nam": 24, "greenassessmentpropertyauditlog_set": 24, "pizza": [24, 34], "manytomanyfield": [24, 34], "manytomanydescriptor": [24, 34], "importrecord_set": 24, "is_staff": 24, "logentry_set": 24, "modified_import_record": 24, "oauth2_provider_accesstoken": 24, "oauth2_provider_appl": 24, "oauth2_provider_gr": 24, "oauth2_provider_refreshtoken": 24, "usermanag": 24, "organizationuser_set": 24, "postofficeemail_set": 24, "postofficeemailtemplate_set": 24, "process_header_request": 24, "user_permiss": 24, "methodnam": [24, 41], "runtest": [24, 41], "testcas": [24, 41], "hook": [24, 34, 41], "fixtur": [24, 41], "exercis": [24, 41], "test_simple_login": 24, "happi": [24, 41], "uidb64": 24, "dan": [28, 29], "gunter": [28, 29], "dkgunter": [28, 29], "lbl": [28, 29, 47], "raw_column": [28, 41], "sanit": 28, "raw_data": 28, "resolve_dupl": 28, "xlsx": 28, "attempt": 28, "from_field": 28, "nichola": 28, "dest_column": 28, "previous_map": 28, "map_arg": 28, "default_map": 28, "threshold": 28, "probabilist": 28, "unknown": 28, "mainli": 28, "build_column_map": 28, "add_map": 28, "potenti": 28, "preced": 28, "apply_threshold": 28, "suggest": 28, "meet": 28, "forc": [28, 34, 41, 44], "separ": [28, 36, 46], "equal": 28, "final_map": 28, "downstream": 28, "raw_column_1": 28, "db_column_1": 28, "raw_column_2": 28, "first_suggested_map": 28, "grab": 28, "dup_map_field": 28, "highest": 28, "win": 28, "battl": 28, "set_initial_mapping_cmp": 28, "initial_mapping_cmp": 28, "hash": [28, 34], "detect": 28, "cmp": 28, "data_set_build": 29, "attr": 29, "state_list": 29, "merged_st": [29, 34], "state1": [29, 34], "state2": [29, 34], "ignore_merge_protect": 29, "favor": [29, 34], "column_exclude_field": 34, "bounding_box": 34, "centroid": 34, "data_st": [34, 41], "import_fil": [34, 44], "long_lat": 34, "raw_access_level_instance_error": 34, "raw_access_level_instance_id": 34, "hash_object": 34, "normalized_address": 34, "source_eui_modeled_orig": 34, "site_eui_orig": 34, "occupied_floor_area_orig": 34, "site_eui_weather_normalized_orig": 34, "site_eui_modeled_orig": 34, "source_eui_orig": 34, "gross_floor_area_orig": 34, "conditioned_floor_area_orig": 34, "source_eui_weather_normalized_orig": 34, "column_merge_favor_exist": 34, "column_merge_favor_new": 34, "column_merge_protect": 34, "pm_parent_property_id": 34, "jurisdiction_property_id": 34, "audit": [34, 41], "audit_template_building_id": 34, "postal": 34, "latitud": 34, "longitud": 34, "footprint": 34, "property_footprint": 34, "geometri": 34, "taxlot_footprint": 34, "datetim": [34, 44], "gross": 34, "use_descript": 34, "star": 34, "score": 34, "integ": 34, "property_not": 34, "property_typ": 34, "telephon": 34, "building_count": 34, "sale": 34, "occupi": 34, "home_energy_score_id": 34, "weather": 34, "site_eui_model": 34, "source_eui_model": 34, "alert": 34, "energy_alert": 34, "space_alert": 34, "number_properti": 34, "egrid": 34, "subregion": 34, "egrid_subregion_cod": 34, "total": [34, 45], "ghg": 34, "emiss": 34, "total_ghg_emiss": 34, "margin": 34, "total_marginal_ghg_emiss": 34, "intens": 34, "total_ghg_emissions_intens": 34, "ghg_intens": 34, "total_marginal_ghg_emissions_intens": 34, "zone": 34, "property_timezon": 34, "data_type_pars": 34, "callabl": 34, "lambda": 34, "fromisoformat": 34, "float": 34, "excluded_api_field": 34, "excluded_column_return_field": 34, "excluded_mapping_field": 34, "geocoded_address": 34, "geocoded_postal_cod": 34, "geocoded_side_of_street": 34, "geocoded_countri": 34, "geocoded_st": 34, "geocoded_counti": 34, "geocoded_c": 34, "geocoded_neighborhood": 34, "excluded_rename_from_field": 34, "excluded_rename_to_field": 34, "internal_type_to_data_typ": 34, "booleanfield": 34, "datefield": 34, "floatfield": 34, "doubl": [34, 44], "jsonfield": 34, "pointfield": 34, "polygonfield": 34, "textfield": 34, "pinned_column": 34, "quantity_unit_column": 34, "shared_field_typ": 34, "shared_non": 34, "shared_publ": 34, "unmappable_property_field": 34, "unmappable_taxlot_field": 34, "account_name_column": 34, "actual_emission_column": 34, "actual_energy_column": 34, "benchmark_id_column": 34, "cast_column_valu": 34, "column_data_typ": 34, "allow_non": 34, "rais": [34, 36, 44], "castexcept": 34, "wide": 34, "clean_field": 34, "validationerror": 34, "non_field_error": 34, "column_list_profil": 34, "columnlistprofilecolumn_set": 34, "comstock_map": 34, "contact_email_column": 34, "contact_name_column": 34, "create_map": 34, "arrai": 34, "columnmap": 34, "create_mappings_from_fil": 34, "absolut": 34, "data_admin_account_name_column": 34, "data_admin_email_column": 34, "data_admin_name_column": 34, "dataviewparameter_set": 34, "delete_al": 34, "invalid": 34, "irrevers": 34, "column_map": 34, "derived_column": 34, "restaur": 34, "onetoonefield": 34, "derived_column_id": 34, "derivedcolumn_set": 34, "derivedcolumnparameter_set": 34, "geocoding_ord": 34, "get_merge_protection_displai": 34, "merge_protect": 34, "get_next_by_cr": 34, "get_next_by_modifi": 34, "get_previous_by_cr": 34, "get_previous_by_modifi": 34, "get_shared_field_type_displai": 34, "goal_area_column": 34, "goal_eui_column1": 34, "goal_eui_column2": 34, "goal_eui_column3": 34, "is_matching_criteria": 34, "mapped_map": 34, "raw_map": 34, "recognize_empti": 34, "rename_column": 34, "new_column_nam": 34, "vice": 34, "versa": 34, "overwrit": [34, 46], "retrieve_al": 34, "org_id": [34, 44], "liter": 34, "only_us": 34, "include_rel": 34, "exclude_deriv": 34, "grid": 34, "retrieve_all_by_tupl": 34, "retrieve_db_field_name_for_hash_comparison": 34, "independ": 34, "md5": 34, "quickli": 34, "superset": [34, 41], "retrieve_db_field_table_and_names_from_db_t": 34, "retrieve_db_field": 34, "retrieve_db_fields_from_db_t": 34, "retrieve_db_typ": 34, "field_nam": 34, "field_name_2": 34, "data_type_2": 34, "retrieve_mapping_column": 34, "retrieve_prior": 34, "data_007": 34, "data_008": 34, "salesforce_column": 34, "force_insert": 34, "force_upd": 34, "insist": 34, "equival": [34, 44], "save_column_nam": 34, "model_obj": 34, "ever": [34, 44], "seen": [34, 46], "target_emission_column": 34, "target_energy_column": 34, "unit_id": 34, "x_axis_column": 34, "analysispropertyview_set": 34, "dataview_set": 34, "event_set": 34, "get_next_by_end": 34, "get_next_by_start": 34, "get_or_create_default": 34, "get_previous_by_end": 34, "get_previous_by_start": 34, "goal_baseline_cycl": 34, "goal_current_cycl": 34, "importfile_set": 34, "propertyview_set": 34, "taxlotproperty_set": 34, "taxlotview_set": 34, "user_id": 34, "color": [34, 36], "super_organ": [34, 36], "show_in_list": [34, 36], "timestampedmodel": 34, "blue_choic": 34, "blue": 34, "color_choic": 34, "red": 34, "light": [34, 41], "green": [34, 47], "white": 34, "orang": 34, "grai": 34, "default_label": 34, "residenti": 34, "exempt": 34, "ownership": 34, "gray_choic": 34, "green_choic": 34, "light_blue_choic": 34, "orange_choic": 34, "red_choic": 34, "white_choic": 34, "and_filter_group": 34, "compliance_label": 34, "exclude_filter_group": 34, "get_color_displai": 34, "django_extens": 34, "creationdatetimefield": 34, "modificationdatetimefield": 34, "indication_label": 34, "or_filter_group": 34, "rule_set": 34, "super_organization_id": 34, "to_dict": 34, "violation_label": 34, "measur": 34, "decim": 34, "unit_typ": 34, "column_set": 34, "get_unit_type_displai": 34, "unit_nam": 34, "overtim": 34, "remain": [34, 47, 48], "unchang": 34, "access_level_inst": 34, "access_level_instance_id": 34, "copy_met": 34, "source_property_id": 34, "source_persist": 34, "aren": 34, "bulk": 34, "reassign": 34, "data_logg": 34, "get_next_by_upd": 34, "get_previous_by_upd": 34, "goalnote_set": 34, "historical_not": 34, "reverseonetoonedescriptor": 34, "inventory_docu": 34, "parent_properti": 34, "parent_property_id": 34, "property_set": 34, "parent1": 34, "parent2": 34, "parent_state1": 34, "parent_state2": 34, "import_filenam": 34, "get_record_type_displai": 34, "parent1_id": 34, "parent2_id": 34, "parent_state1_id": 34, "parent_state2_id": 34, "propertyauditlog_parent1": 34, "propertyauditlog_parent2": 34, "state_id": 34, "view_id": 34, "pytz": 34, "timezon": [34, 44], "all_timezon": 34, "alaska": 34, "aleutian": 34, "arizona": 34, "central": 34, "indiana": 34, "eastern": 34, "hawaii": 34, "stark": 34, "michigan": 34, "mountain": 34, "pacif": 34, "samoa": 34, "analysispropertyview": 34, "building_fil": 34, "get_data_state_displai": 34, "get_merge_state_displai": 34, "get_source_type_displai": 34, "histori": 34, "measure_set": 34, "merge_relationship": 34, "property_id": 34, "propertyauditlog_st": 34, "propertymeasure_set": 34, "raw_access_level_inst": 34, "simul": [34, 41], "include_related_data": 34, "mask": 34, "ubidmodel_set": 34, "world": 34, "characterist": 34, "gapauditlog_view": 34, "greenassessmentproperty_set": 34, "initialize_audit_log": 34, "propertyauditlog_view": 34, "tax_lot_st": 34, "tax_lot_view": 34, "ubidmodel": 34, "ahead": 34, "touch": 34, "ali": 34, "tax_lot": 34, "taxlotauditlog_parent1": 34, "taxlotauditlog_parent2": 34, "stub": [34, 41], "taxlotauditlog_parent_state1": 34, "taxlotauditlog_parent_state2": 34, "taxlotauditlog_st": 34, "property_st": 34, "property_view": 34, "taxlot_id": 34, "taxlotauditlog_view": 34, "skipkei": 36, "ensure_ascii": 36, "check_circular": 36, "allow_nan": 36, "sort_kei": 36, "indent": 36, "jsonencod": 36, "typeerror": 36, "iter": 36, "seed_decod": 36, "seed_dump": 36, "seed_load": 36, "modelseri": [36, 44], "extra_kwarg": 36, "write_onli": 36, "is_appli": 36, "get_is_appli": 36, "to_represent": 36, "primit": 36, "datatyp": 36, "bitbucket": 37, "mathiasdm": 37, "render_func": 37, "url_nod": 37, "parser": 37, "andrii": 37, "drozdyuk": 37, "url_var": 37, "context_var": 37, "just_context_var": 37, "crumb": 37, "produc": 37, "person_detail": 37, "person_url": 37, "person": 37, "argument": 37, "test_help": 39, "start_year": 39, "1900": 39, "end_year": 39, "2011": 39, "length": 39, "test_admin_view": 41, "dupe": 41, "entir": [41, 44], "creation": 41, "test_decor": 41, "34": 41, "sum": 41, "increment": 41, "had": 41, "finish": [41, 46], "counter": 41, "test_task": 41, "deal": 41, "test_view": 41, "k": 41, "dest_col": 41, "assert": 41, "70": 41, "air": 41, "leakag": 41, "64": 41, "47": 41, "50": 41, "create_dataset": 41, "get_raw_column_nam": 41, "save_column_map": 41, "member": 41, "subset": 41, "necessari": [41, 46], "polyfil": 41, "believ": 41, "compar": [41, 48], "import_file_source_typ": 41, "user_nam": 41, "test_us": 41, "user_password": 41, "test_pass": 41, "deconstruct": 41, "extrem": 41, "weight": 41, "view_func": 41, "remote_addr": 41, "fake_login_path": 41, "get_respons": 44, "turn": 44, "csrf": 44, "csrfviewmiddlewar": 44, "perform_cr": 44, "get_parent_org": 44, "return_obj": 44, "prove": 44, "orgfilt": 44, "nest": 44, "foreign_kei": 44, "force_par": 44, "perform_upd": 44, "org_valid": 44, "my_valid": 44, "myseri": 44, "primarykeyrelatedfield": 44, "query_set": 44, "mymodel": 44, "travers": 44, "underscor": 44, "property__org_id": 44, "validate_org": 44, "get_org_id": 44, "show": [44, 47], "get_show_column": 44, "profile_id": 44, "show_column": 44, "field_1": 44, "field_2": 44, "extra_data_field_1": 44, "extra_data_field_2": 44, "mark": 44, "has_perm": 44, "strip": 44, "todo": 44, "regist": [44, 47], "rest": 44, "is_api_endpoint": 44, "append": 44, "docstr": 44, "consumpt": 44, "urllist": 44, "recurs": 44, "yield": 44, "url_pattern": 44, "view_funct": 44, "examin": [44, 47], "getattr": 44, "deep": 44, "mimic": 44, "org__id": 44, "split": 44, "__": 44, "lst": 44, "immedi": 44, "org_nam": 44, "test_org": 44, "scratch": 44, "heavili": 44, "current_org": 44, "suborg_nam": 44, "user_rol": 44, "datestr": 44, "make_tz_awar": 44, "31": 44, "2010": 44, "utc": 44, "reconcil": 44, "mcm": 44, "cleaner": 44, "l85": 44, "millisecond": 44, "epoch": 44, "maybe_datetim": 44, "strftime": 44, "cover": 45, "celery_queu": 45, "queu": 45, "n": 45, "wait": [45, 46], "eta": 45, "countdown": 45, "maxconcurr": 45, "error404": 45, "error410": 45, "error500": 45, "health_check": 45, "health": 45, "app_url": 45, "namespac": 45, "sha": 45, "toolbox": 46, "concours": 46, "6038": 46, "Be": 46, "patient": 46, "successfulli": 46, "coupl": 46, "everyth": 46, "converg": 46, "overridden": 46, "forget": 46, "live": 46, "reload": 46, "f": 46, "docker_dev": 46, "probabl": [46, 48], "unfortun": 46, "seed_db_volum": 46, "mount": 46, "seed_media_volum": 46, "folder": [46, 47], "switch": [46, 47], "seed_pgdata_prod": 46, "nocaptur": 46, "stdout": 46, "worth": 46, "_log": 46, "pdb": 46, "remot": 46, "remote_pdb": 46, "set_trac": 46, "breakpoint": 46, "remotepdb": 46, "session": 46, "41653": 46, "netcat": 46, "nc": 46, "machin": 47, "skip": 47, "virtualenv": 47, "conda": 47, "succe": 47, "forg": 47, "crfsuit": 47, "macport": 47, "graphviz": 47, "pyenv": 47, "although": 47, "easiest": 47, "pollut": 47, "easier": 47, "postgresql94": 47, "opt": 47, "defaultdb": 47, "chown": 47, "initdb": 47, "stop": 47, "alias": 47, "postactiv": 47, "pg_start": 47, "pg_ctl": 47, "pg_stop": 47, "launchag": 47, "whoami": 47, "WITH": 47, "postgis2": 47, "becom": 47, "remaind": 47, "maintain": 47, "compil": 47, "gcc": 47, "clang": 47, "cmake": 47, "openssl": 47, "dopenssl_root_dir": 47, "conf": 47, "uncom": [47, 48], "shared_preload_librari": 47, "config_fil": 47, "virtualenvwrapp": 47, "workon": 47, "cc": 47, "cp": 47, "favorit": 47, "editor": 47, "plan_purchas": 47, "business_edit": 47, "business_edition_fre": 47, "me": 47, "consum": 47, "directli": 47, "deadbeef": 47, "hard": 47, "statement": 47, "encapsul": 47, "stand": 47, "alon": 47, "foreground": 47, "seem": 47, "lokalise2": 48, "get_python_transl": 48, "get_angular_transl": 48, "usemissingtranslationhandlerlog": 48, "untransl": 48, "lokal": 48, "tl": 48, "dr": 48, "english": 48, "littl": 48, "care": 48, "held": 48, "languag": 48, "mo": 48, "suppli": 48, "sniff": 48, "accept": 48, "swap": 48, "dom": 48, "wherev": 48, "wrinkl": 48, "plural": 48, "flow": 48, "visibl": 48, "smooth": 48, "nice": 48, "speaker": 48, "screenshot": 48, "clarifi": 48, "phrase": 48, "placehold": 48, "fairli": 48, "straightforward": 48, "profession": 48, "mostli": 48, "visual": 48, "ok": 48, "french": 48, "german": 48, "wordi": 48, "rel": 48, "element": 48, "expand": 48, "oddli": 48, "err": 48, "clever": 48, "aim": 48, "compet": 48, "h2": 48, "include_shared_taxlot": 48, "include_shar": 48}, "objects": {"config": [[18, 0, 0, "-", "template_context"], [18, 0, 0, "-", "tests"], [18, 0, 0, "-", "utils"], [18, 0, 0, "-", "views"], [18, 0, 0, "-", "wsgi"]], "config.template_context": [[18, 1, 1, "", "sentry_js"], [18, 1, 1, "", "session_key"]], "config.utils": [[18, 1, 1, "", "de_camel_case"]], "config.views": [[18, 1, 1, "", "robots_txt"]], "": [[19, 0, 0, "-", "seed"]], "seed": [[22, 0, 0, "-", "data_importer"], [19, 0, 0, "-", "decorators"], [24, 0, 0, "-", "landing"], [27, 0, 0, "-", "lib"], [30, 0, 0, "-", "management"], [34, 0, 0, "-", "models"], [35, 0, 0, "-", "public"], [19, 0, 0, "-", "search"], [36, 0, 0, "-", "serializers"], [19, 0, 0, "-", "tasks"], [38, 0, 0, "-", "test_helpers"], [19, 0, 0, "-", "token_generators"], [19, 0, 0, "-", "utils"], [45, 0, 0, "-", "views"]], "seed.data_importer": [[22, 0, 0, "-", "managers"], [22, 0, 0, "-", "utils"]], "seed.data_importer.managers": [[22, 2, 1, "", "NotDeletedManager"]], "seed.data_importer.managers.NotDeletedManager": [[22, 3, 1, "", "get_all"], [22, 3, 1, "", "get_queryset"], [22, 4, 1, "", "use_for_related_fields"]], "seed.data_importer.utils": [[22, 1, 1, "", "kbtu_thermal_conversion_factors"], [22, 1, 1, "", "usage_point_id"]], "seed.decorators": [[19, 4, 1, "", "DRFEndpointMixin"], [19, 1, 1, "", "ajax_request"], [19, 1, 1, "", "ajax_request_class"], [19, 1, 1, "", "decorator_to_mixin"], [19, 1, 1, "", "get_prog_key"], [19, 1, 1, "", "lock_and_track"], [19, 1, 1, "", "require_organization_id"], [19, 1, 1, "", "require_organization_id_class"], [19, 1, 1, "", "require_organization_membership"]], "seed.landing": [[24, 0, 0, "-", "forms"], [25, 0, 0, "-", "management"], [24, 0, 0, "-", "models"], [24, 0, 0, "-", "tests"], [24, 0, 0, "-", "urls"], [24, 0, 0, "-", "views"]], "seed.landing.forms": [[24, 2, 1, "", "CustomCreateUserForm"], [24, 2, 1, "", "LoginForm"]], "seed.landing.forms.CustomCreateUserForm": [[24, 2, 1, "", "Meta"], [24, 4, 1, "", "base_fields"], [24, 4, 1, "", "declared_fields"], [24, 5, 1, "", "media"]], "seed.landing.forms.CustomCreateUserForm.Meta": [[24, 4, 1, "", "fields"], [24, 4, 1, "", "model"], [24, 4, 1, "", "widgets"]], "seed.landing.forms.LoginForm": [[24, 4, 1, "", "base_fields"], [24, 4, 1, "", "declared_fields"], [24, 5, 1, "", "media"]], "seed.landing.management": [[26, 0, 0, "-", "commands"]], "seed.landing.models": [[24, 2, 1, "", "SEEDUser"]], "seed.landing.models.SEEDUser": [[24, 6, 1, "", "DoesNotExist"], [24, 6, 1, "", "MultipleObjectsReturned"], [24, 4, 1, "", "REQUIRED_FIELDS"], [24, 4, 1, "", "USERNAME_FIELD"], [24, 4, 1, "", "analysis_set"], [24, 4, 1, "", "api_key"], [24, 4, 1, "", "columnmapping_set"], [24, 4, 1, "", "cycle_set"], [24, 4, 1, "", "date_joined"], [24, 3, 1, "", "deactivate_user"], [24, 4, 1, "", "default_building_detail_custom_columns"], [24, 4, 1, "", "default_custom_columns"], [24, 4, 1, "", "default_organization"], [24, 4, 1, "", "default_organization_id"], [24, 4, 1, "", "email"], [24, 3, 1, "", "email_user"], [24, 4, 1, "", "first_name"], [24, 3, 1, "", "generate_key"], [24, 3, 1, "", "get_absolute_url"], [24, 3, 1, "", "get_full_name"], [24, 3, 1, "", "get_next_by_date_joined"], [24, 3, 1, "", "get_previous_by_date_joined"], [24, 3, 1, "", "get_short_name"], [24, 4, 1, "", "greenassessmentpropertyauditlog_set"], [24, 4, 1, "", "groups"], [24, 4, 1, "", "id"], [24, 4, 1, "", "importrecord_set"], [24, 4, 1, "", "is_staff"], [24, 4, 1, "", "last_name"], [24, 4, 1, "", "logentry_set"], [24, 4, 1, "", "modified_import_records"], [24, 4, 1, "", "notes"], [24, 4, 1, "", "oauth2_provider_accesstoken"], [24, 4, 1, "", "oauth2_provider_application"], [24, 4, 1, "", "oauth2_provider_grant"], [24, 4, 1, "", "oauth2_provider_refreshtoken"], [24, 4, 1, "", "objects"], [24, 4, 1, "", "organizationuser_set"], [24, 4, 1, "", "orgs"], [24, 4, 1, "", "postofficeemail_set"], [24, 4, 1, "", "postofficeemailtemplate_set"], [24, 3, 1, "", "process_header_request"], [24, 3, 1, "", "save"], [24, 4, 1, "", "show_shared_buildings"], [24, 4, 1, "", "user_permissions"], [24, 4, 1, "", "username"]], "seed.landing.tests": [[24, 2, 1, "", "UserLoginTest"]], "seed.landing.tests.UserLoginTest": [[24, 3, 1, "", "setUp"], [24, 3, 1, "", "test_simple_login"]], "seed.landing.views": [[24, 1, 1, "", "account_activation_sent"], [24, 1, 1, "", "activate"], [24, 1, 1, "", "create_account"], [24, 1, 1, "", "landing_page"], [24, 1, 1, "", "password_reset"], [24, 1, 1, "", "password_reset_complete"], [24, 1, 1, "", "password_reset_confirm"], [24, 1, 1, "", "password_reset_done"], [24, 1, 1, "", "password_set"], [24, 1, 1, "", "signup"]], "seed.lib": [[28, 0, 0, "-", "mappings"], [29, 0, 0, "-", "merging"]], "seed.lib.mappings": [[28, 0, 0, "-", "mapper"], [28, 0, 0, "-", "mapping_columns"]], "seed.lib.mappings.mapper": [[28, 1, 1, "", "create_column_regexes"], [28, 1, 1, "", "get_pm_mapping"]], "seed.lib.mappings.mapping_columns": [[28, 2, 1, "", "MappingColumns"], [28, 1, 1, "", "sort_duplicates"]], "seed.lib.mappings.mapping_columns.MappingColumns": [[28, 3, 1, "", "add_mappings"], [28, 3, 1, "", "apply_threshold"], [28, 5, 1, "", "duplicates"], [28, 5, 1, "", "final_mappings"], [28, 3, 1, "", "first_suggested_mapping"], [28, 3, 1, "", "resolve_duplicate"], [28, 3, 1, "", "set_initial_mapping_cmp"]], "seed.lib.merging": [[29, 0, 0, "-", "merging"]], "seed.lib.merging.merging": [[29, 1, 1, "", "get_attrs_with_mapping"], [29, 1, 1, "", "get_propertystate_attrs"], [29, 1, 1, "", "get_state_attrs"], [29, 1, 1, "", "get_state_to_state_tuple"], [29, 1, 1, "", "get_taxlotstate_attrs"], [29, 1, 1, "", "merge_state"]], "seed.models": [[34, 0, 0, "-", "auditlog"], [34, 0, 0, "-", "columns"], [34, 0, 0, "-", "cycles"], [20, 0, 0, "-", "data_quality"], [34, 0, 0, "-", "models"], [34, 0, 0, "-", "properties"], [34, 0, 0, "-", "tax_lots"]], "seed.models.columns": [[34, 2, 1, "", "Column"], [34, 6, 1, "", "ColumnCastError"], [34, 1, 1, "", "validate_model"]], "seed.models.columns.Column": [[34, 4, 1, "", "COLUMN_EXCLUDE_FIELDS"], [34, 4, 1, "", "COLUMN_MERGE_FAVOR_EXISTING"], [34, 4, 1, "", "COLUMN_MERGE_FAVOR_NEW"], [34, 4, 1, "", "COLUMN_MERGE_PROTECTION"], [34, 4, 1, "", "DATABASE_COLUMNS"], [34, 4, 1, "", "DATA_TYPE_PARSERS"], [34, 6, 1, "", "DoesNotExist"], [34, 4, 1, "", "EXCLUDED_API_FIELDS"], [34, 4, 1, "", "EXCLUDED_COLUMN_RETURN_FIELDS"], [34, 4, 1, "", "EXCLUDED_MAPPING_FIELDS"], [34, 4, 1, "", "EXCLUDED_RENAME_FROM_FIELDS"], [34, 4, 1, "", "EXCLUDED_RENAME_TO_FIELDS"], [34, 4, 1, "", "INTERNAL_TYPE_TO_DATA_TYPE"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "PINNED_COLUMNS"], [34, 4, 1, "", "QUANTITY_UNIT_COLUMNS"], [34, 4, 1, "", "SHARED_FIELD_TYPES"], [34, 4, 1, "", "SHARED_NONE"], [34, 4, 1, "", "SHARED_PUBLIC"], [34, 4, 1, "", "UNMAPPABLE_PROPERTY_FIELDS"], [34, 4, 1, "", "UNMAPPABLE_TAXLOT_FIELDS"], [34, 4, 1, "", "account_name_column"], [34, 4, 1, "", "actual_emission_column"], [34, 4, 1, "", "actual_energy_column"], [34, 4, 1, "", "benchmark_id_column"], [34, 3, 1, "", "cast"], [34, 3, 1, "", "cast_column_value"], [34, 3, 1, "", "clean"], [34, 4, 1, "", "column_description"], [34, 4, 1, "", "column_list_profiles"], [34, 4, 1, "", "column_name"], [34, 4, 1, "", "columnlistprofilecolumn_set"], [34, 4, 1, "", "comstock_mapping"], [34, 4, 1, "", "contact_email_column"], [34, 4, 1, "", "contact_name_column"], [34, 3, 1, "", "create_mappings"], [34, 3, 1, "", "create_mappings_from_file"], [34, 4, 1, "", "created"], [34, 4, 1, "", "data_admin_account_name_column"], [34, 4, 1, "", "data_admin_email_column"], [34, 4, 1, "", "data_admin_name_column"], [34, 4, 1, "", "data_type"], [34, 4, 1, "", "dataviewparameter_set"], [34, 3, 1, "", "delete_all"], [34, 4, 1, "", "derived_column"], [34, 4, 1, "", "derived_column_id"], [34, 4, 1, "", "derivedcolumn_set"], [34, 4, 1, "", "derivedcolumnparameter_set"], [34, 4, 1, "", "display_name"], [34, 4, 1, "", "geocoding_order"], [34, 3, 1, "", "get_merge_protection_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_modified"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_modified"], [34, 3, 1, "", "get_shared_field_type_display"], [34, 4, 1, "", "goal_area_columns"], [34, 4, 1, "", "goal_eui_column1s"], [34, 4, 1, "", "goal_eui_column2s"], [34, 4, 1, "", "goal_eui_column3s"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_file"], [34, 4, 1, "", "import_file_id"], [34, 4, 1, "", "is_extra_data"], [34, 4, 1, "", "is_matching_criteria"], [34, 4, 1, "", "mapped_mappings"], [34, 4, 1, "", "merge_protection"], [34, 4, 1, "", "modified"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "raw_mappings"], [34, 4, 1, "", "recognize_empty"], [34, 3, 1, "", "rename_column"], [34, 3, 1, "", "retrieve_all"], [34, 3, 1, "", "retrieve_all_by_tuple"], [34, 3, 1, "", "retrieve_db_field_name_for_hash_comparison"], [34, 3, 1, "", "retrieve_db_field_table_and_names_from_db_tables"], [34, 3, 1, "", "retrieve_db_fields"], [34, 3, 1, "", "retrieve_db_fields_from_db_tables"], [34, 3, 1, "", "retrieve_db_types"], [34, 3, 1, "", "retrieve_mapping_columns"], [34, 3, 1, "", "retrieve_priorities"], [34, 4, 1, "", "salesforce_column"], [34, 3, 1, "", "save"], [34, 3, 1, "", "save_column_names"], [34, 4, 1, "", "shared_field_type"], [34, 4, 1, "", "table_name"], [34, 4, 1, "", "target_emission_column"], [34, 4, 1, "", "target_energy_column"], [34, 4, 1, "", "unit"], [34, 4, 1, "", "unit_id"], [34, 4, 1, "", "units_pint"], [34, 4, 1, "", "x_axis_columns"]], "seed.models.cycles": [[34, 2, 1, "", "Cycle"]], "seed.models.cycles.Cycle": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "analysispropertyview_set"], [34, 4, 1, "", "created"], [34, 4, 1, "", "cycles"], [34, 4, 1, "", "dataview_set"], [34, 4, 1, "", "end"], [34, 4, 1, "", "event_set"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_end"], [34, 3, 1, "", "get_next_by_start"], [34, 3, 1, "", "get_or_create_default"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_end"], [34, 3, 1, "", "get_previous_by_start"], [34, 4, 1, "", "goal_baseline_cycles"], [34, 4, 1, "", "goal_current_cycles"], [34, 4, 1, "", "id"], [34, 4, 1, "", "importfile_set"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "propertyview_set"], [34, 4, 1, "", "start"], [34, 4, 1, "", "taxlotproperty_set"], [34, 4, 1, "", "taxlotview_set"], [34, 4, 1, "", "user"], [34, 4, 1, "", "user_id"]], "seed.models.data_quality": [[20, 6, 1, "", "ComparisonError"], [20, 2, 1, "", "DataQualityCheck"], [20, 6, 1, "", "DataQualityTypeCastError"], [20, 2, 1, "", "Rule"], [20, 6, 1, "", "UnitMismatchError"], [20, 1, 1, "", "format_pint_violation"]], "seed.models.data_quality.DataQualityCheck": [[20, 6, 1, "", "DoesNotExist"], [20, 6, 1, "", "MultipleObjectsReturned"], [20, 4, 1, "", "REQUIRED_FIELDS"], [20, 3, 1, "", "add_invalid_geometry_entry_provided"], [20, 3, 1, "", "add_result_comparison_error"], [20, 3, 1, "", "add_result_dimension_error"], [20, 3, 1, "", "add_result_is_null"], [20, 3, 1, "", "add_result_max_error"], [20, 3, 1, "", "add_result_min_error"], [20, 3, 1, "", "add_result_missing_and_none"], [20, 3, 1, "", "add_result_missing_req"], [20, 3, 1, "", "add_result_string_error"], [20, 3, 1, "", "add_result_type_error"], [20, 3, 1, "", "add_rule"], [20, 3, 1, "", "add_rule_if_new"], [20, 3, 1, "", "cache_key"], [20, 3, 1, "", "check_data"], [20, 3, 1, "", "get_fieldnames"], [20, 4, 1, "", "id"], [20, 3, 1, "", "initialize_cache"], [20, 3, 1, "", "initialize_rules"], [20, 4, 1, "", "name"], [20, 4, 1, "", "objects"], [20, 4, 1, "", "organization"], [20, 4, 1, "", "organization_id"], [20, 3, 1, "", "remove_all_rules"], [20, 3, 1, "", "remove_status_label"], [20, 3, 1, "", "reset_all_rules"], [20, 3, 1, "", "reset_default_rules"], [20, 3, 1, "", "reset_results"], [20, 3, 1, "", "retrieve"], [20, 3, 1, "", "retrieve_result_by_address"], [20, 3, 1, "", "retrieve_result_by_tax_lot_id"], [20, 4, 1, "", "rules"], [20, 3, 1, "", "save_to_cache"], [20, 3, 1, "", "update_status_label"]], "seed.models.data_quality.Rule": [[20, 4, 1, "", "DATA_TYPES"], [20, 4, 1, "", "DEFAULT_RULES"], [20, 6, 1, "", "DoesNotExist"], [20, 6, 1, "", "MultipleObjectsReturned"], [20, 4, 1, "", "RULE_EXCLUDE"], [20, 4, 1, "", "RULE_INCLUDE"], [20, 4, 1, "", "RULE_NOT_NULL"], [20, 4, 1, "", "RULE_RANGE"], [20, 4, 1, "", "RULE_REQUIRED"], [20, 4, 1, "", "RULE_TYPE"], [20, 4, 1, "", "RULE_TYPE_CUSTOM"], [20, 4, 1, "", "RULE_TYPE_DEFAULT"], [20, 4, 1, "", "SEVERITY"], [20, 4, 1, "", "SEVERITY_ERROR"], [20, 4, 1, "", "SEVERITY_VALID"], [20, 4, 1, "", "SEVERITY_WARNING"], [20, 4, 1, "", "TYPE_AREA"], [20, 4, 1, "", "TYPE_DATE"], [20, 4, 1, "", "TYPE_EUI"], [20, 4, 1, "", "TYPE_NUMBER"], [20, 4, 1, "", "TYPE_STRING"], [20, 4, 1, "", "TYPE_YEAR"], [20, 4, 1, "", "condition"], [20, 4, 1, "", "data_quality_check"], [20, 4, 1, "", "data_quality_check_id"], [20, 4, 1, "", "data_type"], [20, 4, 1, "", "description"], [20, 4, 1, "", "enabled"], [20, 4, 1, "", "field"], [20, 4, 1, "", "for_derived_column"], [20, 3, 1, "", "format_strings"], [20, 3, 1, "", "get_data_type_display"], [20, 3, 1, "", "get_rule_type_display"], [20, 3, 1, "", "get_severity_display"], [20, 4, 1, "", "id"], [20, 4, 1, "", "max"], [20, 3, 1, "", "maximum_valid"], [20, 4, 1, "", "min"], [20, 3, 1, "", "minimum_valid"], [20, 4, 1, "", "name"], [20, 4, 1, "", "not_null"], [20, 4, 1, "", "objects"], [20, 4, 1, "", "required"], [20, 4, 1, "", "rule_type"], [20, 4, 1, "", "severity"], [20, 4, 1, "", "status_label"], [20, 4, 1, "", "status_label_id"], [20, 3, 1, "", "str_to_data_type"], [20, 4, 1, "", "table_name"], [20, 4, 1, "", "text_match"], [20, 4, 1, "", "units"], [20, 3, 1, "", "valid_text"]], "seed.models.models": [[34, 2, 1, "", "StatusLabel"], [34, 2, 1, "", "Unit"]], "seed.models.models.StatusLabel": [[34, 4, 1, "", "BLUE_CHOICE"], [34, 4, 1, "", "COLOR_CHOICES"], [34, 4, 1, "", "DEFAULT_LABELS"], [34, 6, 1, "", "DoesNotExist"], [34, 4, 1, "", "GRAY_CHOICE"], [34, 4, 1, "", "GREEN_CHOICE"], [34, 4, 1, "", "LIGHT_BLUE_CHOICE"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "ORANGE_CHOICE"], [34, 4, 1, "", "RED_CHOICE"], [34, 4, 1, "", "WHITE_CHOICE"], [34, 4, 1, "", "and_filter_groups"], [34, 4, 1, "", "color"], [34, 4, 1, "", "compliance_label"], [34, 4, 1, "", "exclude_filter_groups"], [34, 3, 1, "", "get_color_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_modified"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_modified"], [34, 4, 1, "", "id"], [34, 4, 1, "", "indication_label"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "or_filter_groups"], [34, 4, 1, "", "propertyview_set"], [34, 4, 1, "", "rule_set"], [34, 4, 1, "", "show_in_list"], [34, 4, 1, "", "super_organization"], [34, 4, 1, "", "super_organization_id"], [34, 4, 1, "", "taxlotview_set"], [34, 3, 1, "", "to_dict"], [34, 4, 1, "", "violation_label"]], "seed.models.models.Unit": [[34, 4, 1, "", "DATE"], [34, 4, 1, "", "DATETIME"], [34, 4, 1, "", "DECIMAL"], [34, 6, 1, "", "DoesNotExist"], [34, 4, 1, "", "FLOAT"], [34, 4, 1, "", "INTEGER"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "STRING"], [34, 4, 1, "", "UNIT_TYPES"], [34, 4, 1, "", "column_set"], [34, 3, 1, "", "get_unit_type_display"], [34, 4, 1, "", "id"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "unit_name"], [34, 4, 1, "", "unit_type"]], "seed.models.properties": [[34, 2, 1, "", "Property"], [34, 2, 1, "", "PropertyAuditLog"], [34, 2, 1, "", "PropertyState"], [34, 2, 1, "", "PropertyView"], [34, 1, 1, "", "post_save_property"], [34, 1, 1, "", "post_save_property_state"], [34, 1, 1, "", "post_save_property_view"], [34, 1, 1, "", "pre_delete_state"], [34, 1, 1, "", "set_default_access_level_instance"], [34, 1, 1, "", "sync_latitude_longitude_and_long_lat"]], "seed.models.properties.Property": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "access_level_instance"], [34, 4, 1, "", "access_level_instance_id"], [34, 4, 1, "", "analysispropertyview_set"], [34, 3, 1, "", "copy_meters"], [34, 4, 1, "", "created"], [34, 4, 1, "", "data_loggers"], [34, 4, 1, "", "events"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 4, 1, "", "goalnote_set"], [34, 4, 1, "", "historical_note"], [34, 4, 1, "", "id"], [34, 4, 1, "", "inventory_documents"], [34, 4, 1, "", "meters"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "parent_property"], [34, 4, 1, "", "parent_property_id"], [34, 4, 1, "", "property_set"], [34, 4, 1, "", "updated"], [34, 4, 1, "", "views"]], "seed.models.properties.PropertyAuditLog": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "created"], [34, 4, 1, "", "description"], [34, 3, 1, "", "get_record_type_display"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_filename"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "parent1"], [34, 4, 1, "", "parent1_id"], [34, 4, 1, "", "parent2"], [34, 4, 1, "", "parent2_id"], [34, 4, 1, "", "parent_state1"], [34, 4, 1, "", "parent_state1_id"], [34, 4, 1, "", "parent_state2"], [34, 4, 1, "", "parent_state2_id"], [34, 4, 1, "", "propertyauditlog_parent1"], [34, 4, 1, "", "propertyauditlog_parent2"], [34, 4, 1, "", "record_type"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 4, 1, "", "view"], [34, 4, 1, "", "view_id"]], "seed.models.properties.PropertyState": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "address_line_1"], [34, 4, 1, "", "address_line_2"], [34, 4, 1, "", "analysispropertyview"], [34, 4, 1, "", "audit_template_building_id"], [34, 4, 1, "", "bounding_box"], [34, 4, 1, "", "building_certification"], [34, 4, 1, "", "building_count"], [34, 4, 1, "", "building_files"], [34, 4, 1, "", "centroid"], [34, 4, 1, "", "city"], [34, 3, 1, "", "clean"], [34, 4, 1, "", "conditioned_floor_area"], [34, 4, 1, "", "conditioned_floor_area_orig"], [34, 3, 1, "", "coparent"], [34, 4, 1, "", "created"], [34, 4, 1, "", "custom_id_1"], [34, 4, 1, "", "data_state"], [34, 4, 1, "", "egrid_subregion_code"], [34, 4, 1, "", "energy_alerts"], [34, 4, 1, "", "energy_score"], [34, 4, 1, "", "extra_data"], [34, 4, 1, "", "generation_date"], [34, 4, 1, "", "geocoding_confidence"], [34, 3, 1, "", "get_data_state_display"], [34, 3, 1, "", "get_merge_state_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 3, 1, "", "get_source_type_display"], [34, 4, 1, "", "gross_floor_area"], [34, 4, 1, "", "gross_floor_area_orig"], [34, 4, 1, "", "hash_object"], [34, 3, 1, "", "history"], [34, 4, 1, "", "home_energy_score_id"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_file"], [34, 4, 1, "", "import_file_id"], [34, 4, 1, "", "jurisdiction_property_id"], [34, 4, 1, "", "latitude"], [34, 4, 1, "", "long_lat"], [34, 4, 1, "", "longitude"], [34, 4, 1, "", "lot_number"], [34, 4, 1, "", "measure_set"], [34, 4, 1, "", "measures"], [34, 3, 1, "", "merge_relationships"], [34, 4, 1, "", "merge_state"], [34, 4, 1, "", "normalized_address"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "occupied_floor_area"], [34, 4, 1, "", "occupied_floor_area_orig"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "owner"], [34, 4, 1, "", "owner_address"], [34, 4, 1, "", "owner_city_state"], [34, 4, 1, "", "owner_email"], [34, 4, 1, "", "owner_postal_code"], [34, 4, 1, "", "owner_telephone"], [34, 4, 1, "", "parent_state1"], [34, 4, 1, "", "parent_state2"], [34, 4, 1, "", "pm_parent_property_id"], [34, 4, 1, "", "pm_property_id"], [34, 4, 1, "", "postal_code"], [34, 3, 1, "", "promote"], [34, 4, 1, "", "property_footprint"], [34, 4, 1, "", "property_name"], [34, 4, 1, "", "property_notes"], [34, 4, 1, "", "property_timezone"], [34, 4, 1, "", "property_type"], [34, 4, 1, "", "propertyauditlog_state"], [34, 4, 1, "", "propertymeasure_set"], [34, 4, 1, "", "propertyview_set"], [34, 4, 1, "", "raw_access_level_instance"], [34, 4, 1, "", "raw_access_level_instance_error"], [34, 4, 1, "", "raw_access_level_instance_id"], [34, 4, 1, "", "recent_sale_date"], [34, 4, 1, "", "release_date"], [34, 3, 1, "", "save"], [34, 4, 1, "", "scenarios"], [34, 4, 1, "", "simulation"], [34, 4, 1, "", "site_eui"], [34, 4, 1, "", "site_eui_modeled"], [34, 4, 1, "", "site_eui_modeled_orig"], [34, 4, 1, "", "site_eui_orig"], [34, 4, 1, "", "site_eui_weather_normalized"], [34, 4, 1, "", "site_eui_weather_normalized_orig"], [34, 4, 1, "", "source_eui"], [34, 4, 1, "", "source_eui_modeled"], [34, 4, 1, "", "source_eui_modeled_orig"], [34, 4, 1, "", "source_eui_orig"], [34, 4, 1, "", "source_eui_weather_normalized"], [34, 4, 1, "", "source_eui_weather_normalized_orig"], [34, 4, 1, "", "source_type"], [34, 4, 1, "", "space_alerts"], [34, 4, 1, "", "state"], [34, 3, 1, "", "to_dict"], [34, 4, 1, "", "total_ghg_emissions"], [34, 4, 1, "", "total_ghg_emissions_intensity"], [34, 4, 1, "", "total_marginal_ghg_emissions"], [34, 4, 1, "", "total_marginal_ghg_emissions_intensity"], [34, 4, 1, "", "ubid"], [34, 4, 1, "", "ubidmodel_set"], [34, 4, 1, "", "updated"], [34, 4, 1, "", "use_description"], [34, 4, 1, "", "year_built"], [34, 4, 1, "", "year_ending"]], "seed.models.properties.PropertyView": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "cycle"], [34, 4, 1, "", "cycle_id"], [34, 4, 1, "", "gapauditlog_view"], [34, 4, 1, "", "greenassessmentproperty_set"], [34, 4, 1, "", "id"], [34, 5, 1, "", "import_filename"], [34, 3, 1, "", "initialize_audit_logs"], [34, 4, 1, "", "labels"], [34, 4, 1, "", "notes"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "property"], [34, 4, 1, "", "property_id"], [34, 4, 1, "", "propertyauditlog_view"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 3, 1, "", "tax_lot_states"], [34, 3, 1, "", "tax_lot_views"], [34, 4, 1, "", "taxlotproperty_set"]], "seed.models.tax_lots": [[34, 2, 1, "", "TaxLot"], [34, 2, 1, "", "TaxLotAuditLog"], [34, 2, 1, "", "TaxLotState"], [34, 2, 1, "", "TaxLotView"], [34, 1, 1, "", "post_save_taxlot_state"], [34, 1, 1, "", "post_save_taxlot_view"], [34, 1, 1, "", "set_default_access_level_instance"], [34, 1, 1, "", "sync_latitude_longitude_and_long_lat"]], "seed.models.tax_lots.TaxLot": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "access_level_instance"], [34, 4, 1, "", "access_level_instance_id"], [34, 4, 1, "", "created"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 4, 1, "", "id"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "updated"], [34, 4, 1, "", "views"]], "seed.models.tax_lots.TaxLotAuditLog": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "created"], [34, 4, 1, "", "description"], [34, 3, 1, "", "get_record_type_display"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_filename"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "parent1"], [34, 4, 1, "", "parent1_id"], [34, 4, 1, "", "parent2"], [34, 4, 1, "", "parent2_id"], [34, 4, 1, "", "parent_state1"], [34, 4, 1, "", "parent_state1_id"], [34, 4, 1, "", "parent_state2"], [34, 4, 1, "", "parent_state2_id"], [34, 4, 1, "", "record_type"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 4, 1, "", "taxlotauditlog_parent1"], [34, 4, 1, "", "taxlotauditlog_parent2"], [34, 4, 1, "", "view"], [34, 4, 1, "", "view_id"]], "seed.models.tax_lots.TaxLotState": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "address_line_1"], [34, 4, 1, "", "address_line_2"], [34, 4, 1, "", "block_number"], [34, 4, 1, "", "bounding_box"], [34, 4, 1, "", "centroid"], [34, 4, 1, "", "city"], [34, 3, 1, "", "coparent"], [34, 4, 1, "", "created"], [34, 4, 1, "", "custom_id_1"], [34, 4, 1, "", "data_state"], [34, 4, 1, "", "district"], [34, 4, 1, "", "extra_data"], [34, 4, 1, "", "geocoding_confidence"], [34, 3, 1, "", "get_data_state_display"], [34, 3, 1, "", "get_merge_state_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 4, 1, "", "hash_object"], [34, 3, 1, "", "history"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_file"], [34, 4, 1, "", "import_file_id"], [34, 4, 1, "", "jurisdiction_tax_lot_id"], [34, 4, 1, "", "latitude"], [34, 4, 1, "", "long_lat"], [34, 4, 1, "", "longitude"], [34, 3, 1, "", "merge_relationships"], [34, 4, 1, "", "merge_state"], [34, 4, 1, "", "normalized_address"], [34, 4, 1, "", "number_properties"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "postal_code"], [34, 3, 1, "", "promote"], [34, 4, 1, "", "raw_access_level_instance"], [34, 4, 1, "", "raw_access_level_instance_error"], [34, 4, 1, "", "raw_access_level_instance_id"], [34, 3, 1, "", "save"], [34, 4, 1, "", "state"], [34, 4, 1, "", "taxlot_footprint"], [34, 4, 1, "", "taxlotauditlog_parent_state1"], [34, 4, 1, "", "taxlotauditlog_parent_state2"], [34, 4, 1, "", "taxlotauditlog_state"], [34, 4, 1, "", "taxlotview_set"], [34, 3, 1, "", "to_dict"], [34, 4, 1, "", "ubid"], [34, 4, 1, "", "ubidmodel_set"], [34, 4, 1, "", "updated"]], "seed.models.tax_lots.TaxLotView": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "cycle"], [34, 4, 1, "", "cycle_id"], [34, 4, 1, "", "id"], [34, 5, 1, "", "import_filename"], [34, 3, 1, "", "initialize_audit_logs"], [34, 4, 1, "", "labels"], [34, 4, 1, "", "notes"], [34, 4, 1, "", "objects"], [34, 3, 1, "", "property_states"], [34, 3, 1, "", "property_views"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 4, 1, "", "taxlot"], [34, 4, 1, "", "taxlot_id"], [34, 4, 1, "", "taxlotauditlog_view"], [34, 4, 1, "", "taxlotproperty_set"]], "seed.search": [[19, 1, 1, "", "build_shared_buildings_orgs"], [19, 1, 1, "", "create_inventory_queryset"], [19, 1, 1, "", "get_inventory_fieldnames"], [19, 1, 1, "", "get_orgs_w_public_fields"], [19, 1, 1, "", "inventory_search_filter_sort"], [19, 1, 1, "", "parse_body"], [19, 1, 1, "", "process_search_params"], [19, 1, 1, "", "search_inventory"], [19, 1, 1, "", "search_properties"], [19, 1, 1, "", "search_taxlots"]], "seed.serializers": [[36, 0, 0, "-", "celery"], [36, 0, 0, "-", "labels"]], "seed.serializers.celery": [[36, 2, 1, "", "CeleryDatetimeSerializer"]], "seed.serializers.celery.CeleryDatetimeSerializer": [[36, 3, 1, "", "default"], [36, 3, 1, "", "seed_decoder"], [36, 3, 1, "", "seed_dumps"], [36, 3, 1, "", "seed_loads"]], "seed.serializers.labels": [[36, 2, 1, "", "LabelSerializer"]], "seed.serializers.labels.LabelSerializer": [[36, 2, 1, "", "Meta"], [36, 3, 1, "", "get_is_applied"], [36, 3, 1, "", "to_representation"]], "seed.serializers.labels.LabelSerializer.Meta": [[36, 4, 1, "", "extra_kwargs"], [36, 4, 1, "", "fields"], [36, 4, 1, "", "model"]], "seed.tasks": [[19, 1, 1, "", "delete_organization"], [19, 1, 1, "", "invite_new_user_to_seed"], [19, 1, 1, "", "send_salesforce_error_log"]], "seed.templatetags": [[37, 0, 0, "-", "breadcrumbs"]], "seed.templatetags.breadcrumbs": [[37, 2, 1, "", "BreadcrumbNode"], [37, 2, 1, "", "UrlBreadcrumbNode"], [37, 1, 1, "", "breadcrumb"], [37, 1, 1, "", "breadcrumb_root"], [37, 1, 1, "", "breadcrumb_url"], [37, 1, 1, "", "breadcrumb_url_root"], [37, 1, 1, "", "create_crumb"], [37, 1, 1, "", "create_crumb_first"]], "seed.templatetags.breadcrumbs.BreadcrumbNode": [[37, 3, 1, "", "render"]], "seed.templatetags.breadcrumbs.UrlBreadcrumbNode": [[37, 3, 1, "", "render"]], "seed.test_helpers.factory": [[39, 0, 0, "-", "helpers"]], "seed.test_helpers.factory.helpers": [[39, 2, 1, "", "DjangoFunctionalFactory"]], "seed.test_helpers.factory.helpers.DjangoFunctionalFactory": [[39, 3, 1, "", "invalid_test_cc_number"], [39, 3, 1, "", "rand_bool"], [39, 3, 1, "", "rand_city"], [39, 3, 1, "", "rand_city_suffix"], [39, 3, 1, "", "rand_currency"], [39, 3, 1, "", "rand_date"], [39, 3, 1, "", "rand_domain"], [39, 3, 1, "", "rand_email"], [39, 3, 1, "", "rand_float"], [39, 3, 1, "", "rand_int"], [39, 3, 1, "", "rand_name"], [39, 3, 1, "", "rand_phone"], [39, 3, 1, "", "rand_plant_name"], [39, 3, 1, "", "rand_str"], [39, 3, 1, "", "rand_street_address"], [39, 3, 1, "", "rand_street_suffix"], [39, 3, 1, "", "test_cc_number"], [39, 3, 1, "", "valid_test_cc_number"]], "seed.tests": [[41, 0, 0, "-", "test_admin_views"], [41, 0, 0, "-", "test_decorators"], [41, 0, 0, "-", "test_tasks"], [41, 0, 0, "-", "test_views"], [41, 0, 0, "-", "util"]], "seed.tests.test_admin_views": [[41, 2, 1, "", "AdminViewsTest"]], "seed.tests.test_admin_views.AdminViewsTest": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_add_org"], [41, 3, 1, "", "test_add_org_dupe"], [41, 3, 1, "", "test_add_owner_existing_org_to_non_root"], [41, 3, 1, "", "test_add_user_existing_org"], [41, 3, 1, "", "test_add_user_new_org"], [41, 3, 1, "", "test_add_user_no_org"], [41, 3, 1, "", "test_signup_process"], [41, 3, 1, "", "test_signup_process_force_lowercase_email"]], "seed.tests.test_decorators": [[41, 2, 1, "", "ClassDecoratorTests"], [41, 2, 1, "", "RequireOrganizationIDTests"], [41, 2, 1, "", "TestDecorators"], [41, 6, 1, "", "TestError"]], "seed.tests.test_decorators.ClassDecoratorTests": [[41, 3, 1, "", "test_ajax_request_class_dict"], [41, 3, 1, "", "test_ajax_request_class_dict_status_error"], [41, 3, 1, "", "test_ajax_request_class_dict_status_false"], [41, 3, 1, "", "test_ajax_request_class_format_type"], [41, 3, 1, "", "test_require_organization_id_class_no_org_id"], [41, 3, 1, "", "test_require_organization_id_class_org_id"], [41, 3, 1, "", "test_require_organization_id_class_org_id_not_int"]], "seed.tests.test_decorators.RequireOrganizationIDTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_require_organization_id_fail_no_key"], [41, 3, 1, "", "test_require_organization_id_fail_not_numeric"], [41, 3, 1, "", "test_require_organization_id_success_integer"], [41, 3, 1, "", "test_require_organization_id_success_string"]], "seed.tests.test_decorators.TestDecorators": [[41, 4, 1, "", "locked"], [41, 4, 1, "", "pk"], [41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_get_prog_key"], [41, 3, 1, "", "test_increment_cache"], [41, 3, 1, "", "test_locking"], [41, 3, 1, "", "test_locking_w_exception"], [41, 3, 1, "", "test_progress"], [41, 4, 1, "", "unlocked"]], "seed.tests.test_tasks": [[41, 2, 1, "", "TestTasks"]], "seed.tests.test_tasks.TestTasks": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_delete_organization"]], "seed.tests.test_views": [[41, 2, 1, "", "DatasetPermissionsTests"], [41, 2, 1, "", "GetDatasetsViewsTests"], [41, 2, 1, "", "ImportFileViewsTests"], [41, 2, 1, "", "InventoryViewTests"], [41, 2, 1, "", "MainViewTests"], [41, 2, 1, "", "TestMCMViews"]], "seed.tests.test_views.DatasetPermissionsTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_dataset_count"], [41, 3, 1, "", "test_dataset_create"], [41, 3, 1, "", "test_dataset_destroy"], [41, 3, 1, "", "test_dataset_list"], [41, 3, 1, "", "test_dataset_retrieve"], [41, 3, 1, "", "test_dataset_update"]], "seed.tests.test_views.GetDatasetsViewsTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_delete_dataset"], [41, 3, 1, "", "test_get_dataset"], [41, 3, 1, "", "test_get_datasets"], [41, 3, 1, "", "test_get_datasets_count"], [41, 3, 1, "", "test_get_datasets_count_invalid"], [41, 3, 1, "", "test_update_dataset"]], "seed.tests.test_views.ImportFileViewsTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_delete_file"], [41, 3, 1, "", "test_get_import_file"], [41, 3, 1, "", "test_get_matching_and_geocoding_results"]], "seed.tests.test_views.InventoryViewTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_get_cycles"], [41, 3, 1, "", "test_get_properties"], [41, 3, 1, "", "test_get_properties_cycle_id"], [41, 3, 1, "", "test_get_properties_empty_page"], [41, 3, 1, "", "test_get_properties_page_not_an_integer"], [41, 3, 1, "", "test_get_properties_pint_fields"], [41, 3, 1, "", "test_get_properties_profile_id"], [41, 3, 1, "", "test_get_properties_property_extra_data"], [41, 3, 1, "", "test_get_properties_select_all"], [41, 3, 1, "", "test_get_properties_taxlot_extra_data"], [41, 3, 1, "", "test_get_properties_with_taxlots"], [41, 3, 1, "", "test_get_properties_with_taxlots_with_footprints"], [41, 3, 1, "", "test_get_properties_wrong_query_params"], [41, 3, 1, "", "test_get_property"], [41, 3, 1, "", "test_get_property_columns"], [41, 3, 1, "", "test_get_property_multiple_taxlots"], [41, 3, 1, "", "test_get_taxlot"], [41, 3, 1, "", "test_get_taxlot_columns"], [41, 3, 1, "", "test_get_taxlots"], [41, 3, 1, "", "test_get_taxlots_empty_page"], [41, 3, 1, "", "test_get_taxlots_extra_data"], [41, 3, 1, "", "test_get_taxlots_multiple_taxlots"], [41, 3, 1, "", "test_get_taxlots_no_cycle_id"], [41, 3, 1, "", "test_get_taxlots_page_not_an_integer"], [41, 3, 1, "", "test_get_taxlots_profile_id"], [41, 3, 1, "", "test_postoffice"], [41, 3, 1, "", "test_update_pint_fields_with_modified_display_settings"]], "seed.tests.test_views.MainViewTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_home"]], "seed.tests.test_views.TestMCMViews": [[41, 3, 1, "", "assert_expected_mappings"], [41, 4, 1, "", "expected_mappings"], [41, 4, 1, "", "raw_columns_expected"], [41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_create_dataset"], [41, 3, 1, "", "test_get_column_mapping_suggestions"], [41, 3, 1, "", "test_get_column_mapping_suggestions_pm_file"], [41, 3, 1, "", "test_get_column_mapping_suggestions_with_columns"], [41, 3, 1, "", "test_get_raw_column_names"], [41, 3, 1, "", "test_progress"], [41, 3, 1, "", "test_save_column_mappings"], [41, 3, 1, "", "test_save_column_mappings_idempotent"]], "seed.tests.util": [[41, 2, 1, "", "AccessLevelBaseTestCase"], [41, 2, 1, "", "AssertDictSubsetMixin"], [41, 2, 1, "", "DataMappingBaseTestCase"], [41, 2, 1, "", "DeleteModelsTestCase"], [41, 2, 1, "", "FakeClient"], [41, 2, 1, "", "FakeRequest"]], "seed.tests.util.AccessLevelBaseTestCase": [[41, 3, 1, "", "login_as_child_member"], [41, 3, 1, "", "login_as_root_member"], [41, 3, 1, "", "login_as_root_owner"], [41, 3, 1, "", "setUp"]], "seed.tests.util.AssertDictSubsetMixin": [[41, 3, 1, "", "assertDictContainsSubset"]], "seed.tests.util.DataMappingBaseTestCase": [[41, 3, 1, "", "create_import_file"], [41, 3, 1, "", "set_up"]], "seed.tests.util.DeleteModelsTestCase": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "tearDown"]], "seed.tests.util.FakeClient": [[41, 3, 1, "", "get"], [41, 3, 1, "", "post"]], "seed.tests.util.FakeRequest": [[41, 4, 1, "", "GET"], [41, 4, 1, "", "META"], [41, 4, 1, "", "POST"], [41, 4, 1, "", "body"], [41, 4, 1, "", "path"]], "seed.token_generators": [[19, 2, 1, "", "SignupTokenGenerator"]], "seed.token_generators.SignupTokenGenerator": [[19, 3, 1, "", "check_token"], [19, 3, 1, "", "make_token"]], "seed.utils": [[44, 0, 0, "-", "api"], [44, 0, 0, "-", "buildings"], [44, 0, 0, "-", "organizations"], [44, 0, 0, "-", "time"]], "seed.utils.api": [[44, 2, 1, "", "APIBypassCSRFMiddleware"], [44, 2, 1, "", "OrgCreateMixin"], [44, 2, 1, "", "OrgCreateUpdateMixin"], [44, 2, 1, "", "OrgMixin"], [44, 2, 1, "", "OrgQuerySetMixin"], [44, 2, 1, "", "OrgUpdateMixin"], [44, 2, 1, "", "OrgValidateMixin"], [44, 2, 1, "", "OrgValidator"], [44, 2, 1, "", "ProfileIdMixin"], [44, 1, 1, "", "api_endpoint"], [44, 1, 1, "", "api_endpoint_class"], [44, 1, 1, "", "clean_api_regex"], [44, 1, 1, "", "drf_api_endpoint"], [44, 1, 1, "", "format_api_docstring"], [44, 1, 1, "", "get_all_urls"], [44, 1, 1, "", "get_api_endpoints"], [44, 1, 1, "", "get_api_request_user"], [44, 1, 1, "", "get_org_id_from_validator"], [44, 1, 1, "", "rgetattr"]], "seed.utils.api.OrgCreateMixin": [[44, 3, 1, "", "perform_create"]], "seed.utils.api.OrgMixin": [[44, 3, 1, "", "get_organization"], [44, 3, 1, "", "get_parent_org"]], "seed.utils.api.OrgQuerySetMixin": [[44, 3, 1, "", "get_queryset"]], "seed.utils.api.OrgUpdateMixin": [[44, 3, 1, "", "perform_update"]], "seed.utils.api.OrgValidateMixin": [[44, 3, 1, "", "validate"], [44, 3, 1, "", "validate_org"]], "seed.utils.api.OrgValidator": [[44, 4, 1, "", "field"], [44, 4, 1, "", "key"]], "seed.utils.api.ProfileIdMixin": [[44, 3, 1, "", "get_show_columns"]], "seed.utils.buildings": [[44, 1, 1, "", "get_source_type"]], "seed.utils.organizations": [[44, 1, 1, "", "create_organization"], [44, 1, 1, "", "create_suborganization"], [44, 1, 1, "", "default_pm_mappings"]], "seed.utils.time": [[44, 1, 1, "", "convert_datestr"], [44, 1, 1, "", "convert_to_js_timestamp"], [44, 1, 1, "", "parse_datetime"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute", "5": "py:property", "6": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"], "5": ["py", "property", "Python property"], "6": ["py", "exception", "Python exception"]}, "titleterms": {"api": [0, 43, 44, 45, 47], "authent": 0, "payload": 0, "respons": 0, "endpoint": 0, "aw": [1, 6, 11, 13], "setup": [1, 8, 11, 13], "prerequisit": [1, 13, 47], "amazon": 1, "web": [1, 11, 13], "servic": [1, 13], "depend": [1, 13, 47], "python": [1, 5, 13, 47], "javascript": [1, 13, 47], "databas": [1, 5, 13, 47], "configur": [1, 11, 13, 18, 47], "cach": [1, 13], "messag": [1, 13], "broker": [1, 13], "run": [1, 13, 46, 47], "celeri": [1, 11, 13], "background": [1, 13], "task": [1, 13, 19, 41], "worker": [1, 13], "data": [2, 3, 10, 20, 21, 22], "model": [2, 19, 20, 22, 24, 34, 35, 41], "todo": [2, 14], "parent": 2, "children": 2, "match": [2, 14, 15], "manual": 2, "v": 2, "auto": 2, "what": [2, 7, 15], "realli": 2, "happen": 2, "buildingsnapshot": 2, "tabl": [2, 10], "import": [2, 14, 22], "when": [2, 15], "canonicalbuild": 2, "organ": [2, 44], "_source_id": 2, "field": [2, 5], "extra_data": 2, "save": 2, "possibl": 2, "loss": 2, "qualiti": [3, 20], "deploy": [4, 6, 11, 16], "guid": [4, 11], "migrat": [4, 5, 16, 47], "monitor": 4, "sentri": 4, "develop": [5, 8, 9, 13, 16, 46], "resourc": [5, 11], "gener": [5, 13, 19, 34, 48], "note": [5, 15], "pre": 5, "commit": 5, "ruff": 5, "set": [5, 7], "type": 5, "hint": 5, "usag": 5, "check": 5, "django": [5, 13, 47], "ad": 5, "new": 5, "nginx": 5, "angularj": 5, "integr": 5, "templat": [5, 18], "tag": 5, "csrf": 5, "token": [5, 19], "ajax": 5, "request": 5, "rout": 5, "partial": 5, "view": [5, 18, 19, 20, 22, 24, 41, 45], "log": [5, 11], "bede": [5, 21], "complianc": 5, "manag": [5, 11, 22, 25, 26, 30, 31, 32], "column": [5, 34], "reset": 5, "restor": 5, "dump": 5, "test": [5, 18, 20, 24, 32, 38, 39, 40, 41, 42, 46], "build": [5, 44, 46], "document": 5, "contribut": 5, "instruct": [5, 47], "best": 5, "practic": 5, "releas": 5, "docker": [6, 16, 46], "instal": [6, 46, 47], "deploi": 6, "frequent": 7, "ask": 7, "question": 7, "i": [7, 15], "seed": [7, 9, 10, 19, 25, 28, 29, 33, 48], "platform": [7, 9, 10], "issu": 7, "why": [7, 15], "domain": 7, "exampl": 7, "com": 7, "aren": 7, "t": [7, 48], "static": 7, "asset": 7, "being": 7, "serv": 7, "correctli": 7, "get": 8, "start": [8, 47], "help": 9, "For": 9, "user": [9, 13, 47], "standard": 10, "energi": 10, "effici": 10, "indic": 10, "kubernet": 11, "helm": 11, "cluster": 11, "cli": 11, "kubectl": 11, "ek": 11, "control": 11, "specif": 11, "chart": 11, "exist": [11, 15], "upgrad": 11, "redeploi": 11, "stack": 11, "In": [11, 15], "updat": [11, 26], "other": 11, "licens": 12, "linux": 13, "postgresql": [13, 47], "creat": 13, "initi": 13, "server": [13, 46, 47], "product": 13, "environ": 13, "variabl": 13, "mail": 13, "se": 13, "smtp": 13, "local_untrack": 13, "py": 13, "map": [14, 28, 33], "pair": 14, "doe": 15, "how": 15, "us": [15, 46], "cycl": [15, 34], "merg": [15, 29], "link": 15, "across": 15, "put": 15, "them": 15, "togeth": 15, "Not": 15, "search": [15, 19], "depth": 15, "version": 16, "3": 16, "0": [16, 47], "beta": 16, "2": [16, 47], "22": 16, "21": 16, "20": 16, "1": [16, 47], "19": 16, "18": 16, "17": 16, "4": 16, "16": 16, "15": 16, "14": 16, "13": 16, "12": 16, "11": [16, 47], "10": 16, "7": 16, "9": 16, "6": 16, "base": [16, 42], "ubuntu": [16, 46], "max": 16, "osx": [16, 46, 47], "5": [16, 47], "modul": [17, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 45], "submodul": [18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42, 43, 44, 45], "context": 18, "util": [18, 19, 22, 41, 44], "wsgi": 18, "packag": [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47], "subpackag": [19, 24, 25, 30, 31, 38, 39], "inherit": [19, 20], "decor": [19, 41], "factori": [19, 40], "content": [19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 45], "url": [22, 24, 43], "featur": 23, "land": [24, 25, 26], "form": 24, "eula": 26, "librari": 27, "lib": [28, 29, 40], "mapper": [28, 33], "mapping_column": 28, "mapping_data": 28, "test_mapp": 28, "test_mapping_column": 28, "test_mapping_data": 28, "json": [31, 32], "seed_map": 33, "auditlog": 34, "join": 34, "properti": 34, "taxlot": 34, "public": 35, "serial": 36, "label": 36, "templatetag": 37, "breadcrumb": 37, "helper": [38, 39, 40], "factor": 39, "chomski": 40, "admin": [41, 47], "export": 41, "function": 42, "page": 42, "account": [43, 45], "main": [43, 45], "time": 44, "meter": 45, "nativ": 46, "window": 46, "contain": 46, "non": 46, "debug": 46, "quick": 47, "postgi": 47, "timescaledb": 47, "nodej": 47, "npm": 47, "mapquest": 47, "kei": 47, "redi": 47, "login": 47, "translat": 48, "philosophi": 48, "style": 48, "don": 48, "go": 48, "crazi": 48, "indirect": 48, "interpol": 48}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx.ext.intersphinx": 1, "sphinx": 60}, "alltitles": {"API": [[0, "api"]], "Authentication": [[0, "authentication"]], "Payloads": [[0, "payloads"]], "Responses": [[0, "responses"]], "API Endpoints": [[0, "api-endpoints"]], "AWS Setup": [[1, "aws-setup"]], "Prerequisites": [[1, "prerequisites"], [13, "prerequisites"], [47, "prerequisites"]], "Amazon Web Services (AWS) Dependencies": [[1, "amazon-web-services-aws-dependencies"]], "Python Dependencies": [[1, "python-dependencies"], [13, "python-dependencies"]], "JavaScript Dependencies": [[1, "javascript-dependencies"], [13, "javascript-dependencies"]], "Database Configuration": [[1, "database-configuration"]], "Cache and Message Broker": [[1, "cache-and-message-broker"], [13, "cache-and-message-broker"]], "Running Celery the Background Task Worker": [[1, "running-celery-the-background-task-worker"]], "Data Model": [[2, "data-model"]], "Todo": [[2, "id1"], [14, "id2"], [14, "id3"]], "parents and children": [[2, "parents-and-children"]], "matching": [[2, "matching"]], "manual-matching vs auto-matching": [[2, "manual-matching-vs-auto-matching"]], "what really happens to the BuildingSnapshot table on import (and when)": [[2, "what-really-happens-to-the-buildingsnapshot-table-on-import-and-when"]], "what really happens to the CanonicalBuilding table on import (and when)": [[2, "what-really-happens-to-the-canonicalbuilding-table-on-import-and-when"]], "organization": [[2, "organization"]], "*_source_id fields": [[2, "source-id-fields"]], "extra_data": [[2, "extra-data"]], "saving and possible data loss": [[2, "saving-and-possible-data-loss"]], "Data Quality": [[3, "data-quality"]], "Deployment Guide": [[4, "deployment-guide"]], "Migrations": [[4, "migrations"], [16, "migrations"]], "Monitoring": [[4, "monitoring"]], "Sentry": [[4, "sentry"]], "Developer Resources": [[5, "developer-resources"]], "General Notes": [[5, "general-notes"]], "Pre-commit": [[5, "pre-commit"]], "Ruff Settings": [[5, "ruff-settings"]], "Python Type Hints": [[5, "python-type-hints"]], "Usage": [[5, "usage"]], "Type Checking": [[5, "type-checking"]], "Django Notes": [[5, "django-notes"]], "Adding New Fields to Database": [[5, "adding-new-fields-to-database"]], "NGINX Notes": [[5, "nginx-notes"]], "AngularJS Integration Notes": [[5, "angularjs-integration-notes"]], "Template Tags": [[5, "template-tags"]], "Django CSRF Token and AJAX Requests": [[5, "django-csrf-token-and-ajax-requests"]], "Routes and Partials or Views": [[5, "routes-and-partials-or-views"]], "Logging": [[5, "logging"]], "BEDES Compliance and Managing Columns": [[5, "bedes-compliance-and-managing-columns"]], "Resetting the Database": [[5, "resetting-the-database"]], "Restoring a Database Dump": [[5, "restoring-a-database-dump"]], "Migrating the Database": [[5, "migrating-the-database"]], "Testing": [[5, "testing"]], "Building Documentation": [[5, "building-documentation"]], "Contribution Instructions / Best Practices": [[5, "contribution-instructions-best-practices"]], "Release Instructions": [[5, "release-instructions"]], "Docker Deployment on AWS": [[6, "docker-deployment-on-aws"]], "Installation": [[6, "installation"]], "Deploying with Docker": [[6, "deploying-with-docker"]], "Frequently Asked Questions": [[7, "frequently-asked-questions"]], "Questions": [[7, "questions"]], "What is the SEED Platform?": [[7, "what-is-the-seed-platform"]], "Issues": [[7, "issues"]], "Why is the domain set to example.com?": [[7, "why-is-the-domain-set-to-example-com"]], "Why aren\u2019t the static assets being served correctly?": [[7, "why-aren-t-the-static-assets-being-served-correctly"]], "Getting Started": [[8, "getting-started"]], "Development Setup": [[8, "development-setup"]], "Help": [[9, "help"]], "For SEED Platform Users": [[9, "for-seed-platform-users"]], "For SEED Platform Developers": [[9, "for-seed-platform-developers"]], "Standard Energy Efficiency Data (SEED) Platform": [[10, "standard-energy-efficiency-data-seed-platform"]], "Indices and tables": [[10, "indices-and-tables"]], "Kubernetes Deployment Guide with Helm": [[11, "kubernetes-deployment-guide-with-helm"]], "Setup": [[11, "setup"]], "Cluster": [[11, "cluster"]], "AWS CLI Configuration": [[11, "aws-cli-configuration"]], "Kubectl": [[11, "kubectl"]], "Helm": [[11, "helm"]], "EKS Control (AWS Specific)": [[11, "eks-control-aws-specific"]], "Charts": [[11, "charts"]], "Deployment": [[11, "deployment"]], "Managing Existing Clusters": [[11, "managing-existing-clusters"]], "Upgrade/Redeploy the Helm Stack": [[11, "upgrade-redeploy-the-helm-stack"]], "Managing the Kubernetes Cluster (AWS Specific)": [[11, "managing-the-kubernetes-cluster-aws-specific"]], "Logging In": [[11, "logging-in"]], "Update web and web-celery": [[11, "update-web-and-web-celery"]], "Other Resources": [[11, "other-resources"]], "License": [[12, "license"]], "General Linux Setup": [[13, "general-linux-setup"]], "Configure PostgreSQL": [[13, "configure-postgresql"]], "Django Database Configuration": [[13, "django-database-configuration"]], "Creating the initial user": [[13, "creating-the-initial-user"]], "Running celery the background task worker": [[13, "running-celery-the-background-task-worker"]], "Running the development web server": [[13, "running-the-development-web-server"]], "Running a production web server": [[13, "running-a-production-web-server"]], "Environment Variables": [[13, "environment-variables"]], "Mail Services": [[13, "mail-services"]], "AWS SES Service": [[13, "aws-ses-service"]], "SMTP service": [[13, "smtp-service"]], "local_untracked.py": [[13, "local-untracked-py"]], "Mapping": [[14, "mapping"], [14, "id1"]], "Import": [[14, "import"]], "Matching": [[14, "matching"], [15, "matching"]], "Pairing": [[14, "pairing"]], "What is it?": [[15, "what-is-it"]], "Why does it exist?": [[15, "why-does-it-exist"]], "How and when is it used?": [[15, "how-and-when-is-it-used"]], "In-Cycle Merging": [[15, "in-cycle-merging"]], "Linking (Across Cycles)": [[15, "linking-across-cycles"]], "Putting them Together, Match-Merge-Linking": [[15, "putting-them-together-match-merge-linking"]], "Note on In-Cycle Not-merged Matches": [[15, "note-on-in-cycle-not-merged-matches"]], "Match Searching in Depth": [[15, "match-searching-in-depth"]], "Version Develop": [[16, "version-develop"]], "Version 3.0.0-beta.0": [[16, "version-3-0-0-beta-0"]], "Version 2.22.0": [[16, "version-2-22-0"]], "Version 2.21.0": [[16, "version-2-21-0"]], "Version 2.20.1": [[16, "version-2-20-1"]], "Version 2.20.0": [[16, "version-2-20-0"]], "Version 2.19.0": [[16, "version-2-19-0"]], "Version 2.18.1": [[16, "version-2-18-1"]], "Version 2.18.0": [[16, "version-2-18-0"]], "Version 2.17.4": [[16, "version-2-17-4"]], "Version 2.17.3": [[16, "version-2-17-3"]], "Version 2.17.2": [[16, "version-2-17-2"]], "Version 2.17.1": [[16, "version-2-17-1"]], "Version 2.17.0": [[16, "version-2-17-0"]], "Version 2.16.0": [[16, "version-2-16-0"]], "Version 2.15.2": [[16, "version-2-15-2"]], "Version 2.15.1": [[16, "version-2-15-1"]], "Version 2.15.0": [[16, "version-2-15-0"]], "Version 2.14.0": [[16, "version-2-14-0"]], "Version 2.13.0": [[16, "version-2-13-0"]], "Version 2.12.0 - 2.12.4": [[16, "version-2-12-0-2-12-4"]], "Version 2.11.0": [[16, "version-2-11-0"]], "Version 2.10.0": [[16, "version-2-10-0"]], "Version 2.7.3 to 2.9.0": [[16, "version-2-7-3-to-2-9-0"]], "Version 2.7.2": [[16, "version-2-7-2"]], "Version 2.7.1": [[16, "version-2-7-1"]], "Version 2.7.0": [[16, "version-2-7-0"]], "Version 2.6.1": [[16, "version-2-6-1"]], "Version 2.6.0": [[16, "version-2-6-0"]], "Docker-based Deployment": [[16, "docker-based-deployment"], [16, "id1"]], "Ubuntu": [[16, "ubuntu"]], "Max OSX": [[16, "max-osx"]], "Version 2.5.2": [[16, "version-2-5-2"]], "Version 2.5.1": [[16, "version-2-5-1"]], "Version 2.5.0": [[16, "version-2-5-0"]], "Development": [[16, "development"]], "Modules": [[17, "modules"]], "Configuration": [[18, "configuration"]], "Submodules": [[18, "submodules"], [19, "submodules"], [20, "submodules"], [21, "submodules"], [22, "submodules"], [23, "submodules"], [24, "submodules"], [26, "submodules"], [27, "submodules"], [28, "submodules"], [29, "submodules"], [31, "submodules"], [32, "submodules"], [33, "submodules"], [34, "submodules"], [35, "submodules"], [36, "submodules"], [37, "submodules"], [39, "submodules"], [40, "submodules"], [41, "submodules"], [42, "submodules"], [43, "submodules"], [44, "submodules"], [45, "submodules"]], "Template Context": [[18, "module-config.template_context"]], "Tests": [[18, "module-config.tests"], [20, "tests"], [24, "module-seed.landing.tests"], [41, "tests"]], "Utils": [[18, "module-config.utils"], [19, "module-seed.utils"], [22, "module-seed.data_importer.utils"], [41, "module-seed.tests.util"]], "Views": [[18, "module-config.views"], [19, "module-seed.views"], [20, "views"], [22, "views"], [24, "module-seed.landing.views"], [41, "module-seed.tests.test_views"]], "WSGI": [[18, "module-config.wsgi"]], "SEED Package": [[19, "seed-package"]], "Subpackages": [[19, "subpackages"], [24, "subpackages"], [25, "subpackages"], [30, "subpackages"], [31, "subpackages"], [38, "subpackages"], [39, "subpackages"]], "Inheritance": [[19, "inheritance"], [20, "inheritance"]], "Decorators": [[19, "module-seed.decorators"], [41, "module-seed.tests.test_decorators"]], "Factory": [[19, "factory"]], "Models": [[19, "module-seed.models"], [20, "module-seed.models.data_quality"], [22, "models"], [24, "module-seed.landing.models"], [34, "models"], [35, "models"], [41, "models"]], "Search": [[19, "module-seed.search"]], "Tasks": [[19, "module-seed.tasks"], [41, "module-seed.tests.test_tasks"]], "Token Generator": [[19, "module-seed.token_generators"]], "Module contents": [[19, "module-seed"], [21, "module-contents"], [22, "module-seed.data_importer"], [23, "module-contents"], [24, "module-seed.landing"], [25, "module-seed.landing.management"], [26, "module-seed.landing.management.commands"], [27, "module-seed.lib"], [28, "module-seed.lib.mappings"], [29, "module-seed.lib.merging"], [30, "module-seed.management"], [31, "module-contents"], [32, "module-contents"], [33, "module-contents"], [34, "module-seed.models"], [35, "module-seed.public"], [36, "module-seed.serializers"], [38, "module-seed.test_helpers"], [45, "module-seed.views"]], "Data Quality Package": [[20, "data-quality-package"]], "Data Package": [[21, "data-package"]], "BEDES": [[21, "bedes"]], "Data Importer Package": [[22, "data-importer-package"]], "Managers": [[22, "module-seed.data_importer.managers"]], "URLs": [[22, "urls"], [24, "module-seed.landing.urls"]], "Features Package": [[23, "features-package"]], "Landing Package": [[24, "landing-package"]], "Forms": [[24, "module-seed.landing.forms"]], "seed.landing.management package": [[25, "seed-landing-management-package"]], "Landing Management Package": [[26, "landing-management-package"]], "Update EULA": [[26, "update-eula"]], "Library Packages": [[27, "library-packages"]], "seed.lib.mappings package": [[28, "seed-lib-mappings-package"]], "seed.lib.mappings.mapper module": [[28, "module-seed.lib.mappings.mapper"]], "seed.lib.mappings.mapping_columns module": [[28, "module-seed.lib.mappings.mapping_columns"]], "seed.lib.mappings.mapping_data module": [[28, "seed-lib-mappings-mapping-data-module"]], "seed.lib.mappings.test_mapper module": [[28, "seed-lib-mappings-test-mapper-module"]], "seed.lib.mappings.test_mapping_columns module": [[28, "seed-lib-mappings-test-mapping-columns-module"]], "seed.lib.mappings.test_mapping_data module": [[28, "seed-lib-mappings-test-mapping-data-module"]], "seed.lib.merging package": [[29, "seed-lib-merging-package"]], "seed.lib.merging.merging module": [[29, "module-seed.lib.merging.merging"]], "Management Package": [[30, "management-package"]], "Managers Package": [[31, "managers-package"]], "JSON": [[31, "json"]], "Manager Tests Package": [[32, "manager-tests-package"]], "Test JSON Manager": [[32, "test-json-manager"]], "Mapping Package": [[33, "mapping-package"]], "seed.mappings.mapper module": [[33, "seed-mappings-mapper-module"]], "seed.mappings.seed_mappings module": [[33, "seed-mappings-seed-mappings-module"]], "AuditLog": [[34, "module-seed.models.auditlog"]], "Columns": [[34, "module-seed.models.columns"]], "Cycles": [[34, "module-seed.models.cycles"]], "Joins": [[34, "joins"]], "Generic Models": [[34, "module-seed.models.models"]], "Properties": [[34, "module-seed.models.properties"]], "TaxLots": [[34, "module-seed.models.tax_lots"]], "Public Package": [[35, "public-package"]], "Serializers Package": [[36, "serializers-package"]], "Serializers": [[36, "module-seed.serializers.celery"]], "Labels": [[36, "module-seed.serializers.labels"]], "Templatetags Package": [[37, "templatetags-package"]], "Breadcrumbs": [[37, "module-seed.templatetags.breadcrumbs"]], "Test Helpers Package": [[38, "test-helpers-package"]], "Test Helper Factor Package": [[39, "test-helper-factor-package"]], "Helpers": [[39, "module-seed.test_helpers.factory.helpers"]], "Test Helper Factory Lib Package": [[40, "test-helper-factory-lib-package"]], "Chomsky": [[40, "chomsky"]], "Tests Package": [[41, "tests-package"]], "Admin Views": [[41, "module-seed.tests.test_admin_views"]], "Exporters": [[41, "exporters"]], "Tests (Functional) Package": [[42, "tests-functional-package"]], "Base": [[42, "base"]], "Page": [[42, "page"]], "Pages": [[42, "pages"]], "URLs Package": [[43, "urls-package"]], "Accounts": [[43, "accounts"], [45, "accounts"]], "APIs": [[43, "apis"], [44, "module-seed.utils.api"], [45, "apis"]], "Main": [[43, "main"], [45, "main"]], "Utilities Package": [[44, "utilities-package"]], "Buildings": [[44, "module-seed.utils.buildings"]], "Organizations": [[44, "module-seed.utils.organizations"]], "Time": [[44, "module-seed.utils.time"]], "Views Package": [[45, "views-package"]], "Meters": [[45, "meters"]], "Installation using Docker": [[46, "installation-using-docker"]], "Docker Native (Ubuntu)": [[46, "docker-native-ubuntu"]], "Docker Native (Windows/OSX)": [[46, "docker-native-windows-osx"]], "Building and Running Containers for Non-Development": [[46, "building-and-running-containers-for-non-development"]], "Using Docker for Development": [[46, "using-docker-for-development"]], "Build": [[46, "build"]], "Running the Server": [[46, "running-the-server"]], "Running Tests": [[46, "running-tests"]], "Debugging": [[46, "debugging"]], "Installation on OSX": [[47, "installation-on-osx"]], "Quick Installation Instructions": [[47, "quick-installation-instructions"]], "PostgreSQL 11.1": [[47, "postgresql-11-1"]], "PostGIS 2.5": [[47, "postgis-2-5"]], "TimescaleDB 1.5.0": [[47, "timescaledb-1-5-0"]], "Python Packages": [[47, "python-packages"]], "NodeJS/npm": [[47, "nodejs-npm"]], "Configure Django and Databases": [[47, "configure-django-and-databases"]], "MapQuest API Key": [[47, "mapquest-api-key"]], "Run Django Migrations": [[47, "run-django-migrations"]], "Django Admin User": [[47, "django-admin-user"]], "Install Redis": [[47, "install-redis"]], "Install JavaScript Dependencies": [[47, "install-javascript-dependencies"]], "Start the Server": [[47, "start-the-server"]], "Login": [[47, "login"]], "Translating SEED": [[48, "translating-seed"]], "General philosophies / style": [[48, "general-philosophies-style"]], "Don\u2019t go crazy with indirection and interpolation": [[48, "don-t-go-crazy-with-indirection-and-interpolation"]]}, "indexentries": {"config.template_context": [[18, "module-config.template_context"]], "config.tests": [[18, "module-config.tests"]], "config.utils": [[18, "module-config.utils"]], "config.views": [[18, "module-config.views"]], "config.wsgi": [[18, "module-config.wsgi"]], "de_camel_case() (in module config.utils)": [[18, "config.utils.de_camel_case"]], "module": [[18, "module-config.template_context"], [18, "module-config.tests"], [18, "module-config.utils"], [18, "module-config.views"], [18, "module-config.wsgi"], [19, "module-seed"], [19, "module-seed.decorators"], [19, "module-seed.models"], [19, "module-seed.search"], [19, "module-seed.tasks"], [19, "module-seed.token_generators"], [19, "module-seed.utils"], [19, "module-seed.views"], [20, "module-seed.models.data_quality"], [22, "module-seed.data_importer"], [22, "module-seed.data_importer.managers"], [22, "module-seed.data_importer.utils"], [24, "module-seed.landing"], [24, "module-seed.landing.forms"], [24, "module-seed.landing.models"], [24, "module-seed.landing.tests"], [24, "module-seed.landing.urls"], [24, "module-seed.landing.views"], [25, "module-seed.landing.management"], [26, "module-seed.landing.management.commands"], [27, "module-seed.lib"], [27, "module-seed.lib.mappings"], [27, "module-seed.lib.merging"], [28, "module-seed.lib.mappings"], [28, "module-seed.lib.mappings.mapper"], [28, "module-seed.lib.mappings.mapping_columns"], [29, "module-seed.lib.merging"], [29, "module-seed.lib.merging.merging"], [30, "module-seed.management"], [34, "module-seed.models"], [34, "module-seed.models.auditlog"], [34, "module-seed.models.columns"], [34, "module-seed.models.cycles"], [34, "module-seed.models.models"], [34, "module-seed.models.properties"], [34, "module-seed.models.tax_lots"], [35, "module-seed.public"], [36, "module-seed.serializers"], [36, "module-seed.serializers.celery"], [36, "module-seed.serializers.labels"], [37, "module-seed.templatetags.breadcrumbs"], [38, "module-seed.test_helpers"], [39, "module-seed.test_helpers.factory.helpers"], [41, "module-seed.tests.test_admin_views"], [41, "module-seed.tests.test_decorators"], [41, "module-seed.tests.test_tasks"], [41, "module-seed.tests.test_views"], [41, "module-seed.tests.util"], [44, "module-seed.utils.api"], [44, "module-seed.utils.buildings"], [44, "module-seed.utils.organizations"], [44, "module-seed.utils.time"], [45, "module-seed.views"]], "robots_txt() (in module config.views)": [[18, "config.views.robots_txt"]], "sentry_js() (in module config.template_context)": [[18, "config.template_context.sentry_js"]], "session_key() (in module config.template_context)": [[18, "config.template_context.session_key"]], "drfendpointmixin (in module seed.decorators)": [[19, "seed.decorators.DRFEndpointMixin"]], "signuptokengenerator (class in seed.token_generators)": [[19, "seed.token_generators.SignupTokenGenerator"]], "ajax_request() (in module seed.decorators)": [[19, "seed.decorators.ajax_request"]], "ajax_request_class() (in module seed.decorators)": [[19, "seed.decorators.ajax_request_class"]], "build_shared_buildings_orgs() (in module seed.search)": [[19, "seed.search.build_shared_buildings_orgs"]], "check_token() (seed.token_generators.signuptokengenerator method)": [[19, "seed.token_generators.SignupTokenGenerator.check_token"]], "create_inventory_queryset() (in module seed.search)": [[19, "seed.search.create_inventory_queryset"]], "decorator_to_mixin() (in module seed.decorators)": [[19, "seed.decorators.decorator_to_mixin"]], "delete_organization() (in module seed.tasks)": [[19, "seed.tasks.delete_organization"]], "get_inventory_fieldnames() (in module seed.search)": [[19, "seed.search.get_inventory_fieldnames"]], "get_orgs_w_public_fields() (in module seed.search)": [[19, "seed.search.get_orgs_w_public_fields"]], "get_prog_key() (in module seed.decorators)": [[19, "seed.decorators.get_prog_key"]], "inventory_search_filter_sort() (in module seed.search)": [[19, "seed.search.inventory_search_filter_sort"]], "invite_new_user_to_seed() (in module seed.tasks)": [[19, "seed.tasks.invite_new_user_to_seed"]], "lock_and_track() (in module seed.decorators)": [[19, "seed.decorators.lock_and_track"]], "make_token() (seed.token_generators.signuptokengenerator method)": [[19, "seed.token_generators.SignupTokenGenerator.make_token"]], "parse_body() (in module seed.search)": [[19, "seed.search.parse_body"]], "process_search_params() (in module seed.search)": [[19, "seed.search.process_search_params"]], "require_organization_id() (in module seed.decorators)": [[19, "seed.decorators.require_organization_id"]], "require_organization_id_class() (in module seed.decorators)": [[19, "seed.decorators.require_organization_id_class"]], "require_organization_membership() (in module seed.decorators)": [[19, "seed.decorators.require_organization_membership"]], "search_inventory() (in module seed.search)": [[19, "seed.search.search_inventory"]], "search_properties() (in module seed.search)": [[19, "seed.search.search_properties"]], "search_taxlots() (in module seed.search)": [[19, "seed.search.search_taxlots"]], "seed": [[19, "module-seed"]], "seed.decorators": [[19, "module-seed.decorators"]], "seed.models": [[19, "module-seed.models"], [34, "module-seed.models"]], "seed.search": [[19, "module-seed.search"]], "seed.tasks": [[19, "module-seed.tasks"]], "seed.token_generators": [[19, "module-seed.token_generators"]], "seed.utils": [[19, "module-seed.utils"]], "seed.views": [[19, "module-seed.views"], [45, "module-seed.views"]], "send_salesforce_error_log() (in module seed.tasks)": [[19, "seed.tasks.send_salesforce_error_log"]], "comparisonerror": [[20, "seed.models.data_quality.ComparisonError"]], "data_types (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.DATA_TYPES"]], "default_rules (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.DEFAULT_RULES"]], "dataqualitycheck (class in seed.models.data_quality)": [[20, "seed.models.data_quality.DataQualityCheck"]], "dataqualitycheck.doesnotexist": [[20, "seed.models.data_quality.DataQualityCheck.DoesNotExist"]], "dataqualitycheck.multipleobjectsreturned": [[20, "seed.models.data_quality.DataQualityCheck.MultipleObjectsReturned"]], "dataqualitytypecasterror": [[20, "seed.models.data_quality.DataQualityTypeCastError"]], "required_fields (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.REQUIRED_FIELDS"]], "rule_exclude (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_EXCLUDE"]], "rule_include (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_INCLUDE"]], "rule_not_null (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_NOT_NULL"]], "rule_range (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_RANGE"]], "rule_required (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_REQUIRED"]], "rule_type (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_TYPE"], [20, "seed.models.data_quality.Rule.rule_type"]], "rule_type_custom (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_TYPE_CUSTOM"]], "rule_type_default (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_TYPE_DEFAULT"]], "rule (class in seed.models.data_quality)": [[20, "seed.models.data_quality.Rule"]], "rule.doesnotexist": [[20, "seed.models.data_quality.Rule.DoesNotExist"]], "rule.multipleobjectsreturned": [[20, "seed.models.data_quality.Rule.MultipleObjectsReturned"]], "severity (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY"], [20, "seed.models.data_quality.Rule.severity"]], "severity_error (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY_ERROR"]], "severity_valid (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY_VALID"]], "severity_warning (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY_WARNING"]], "type_area (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_AREA"]], "type_date (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_DATE"]], "type_eui (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_EUI"]], "type_number (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_NUMBER"]], "type_string (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_STRING"]], "type_year (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_YEAR"]], "unitmismatcherror": [[20, "seed.models.data_quality.UnitMismatchError"]], "add_invalid_geometry_entry_provided() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_invalid_geometry_entry_provided"]], "add_result_comparison_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_comparison_error"]], "add_result_dimension_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_dimension_error"]], "add_result_is_null() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_is_null"]], "add_result_max_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_max_error"]], "add_result_min_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_min_error"]], "add_result_missing_and_none() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_missing_and_none"]], "add_result_missing_req() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_missing_req"]], "add_result_string_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_string_error"]], "add_result_type_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_type_error"]], "add_rule() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_rule"]], "add_rule_if_new() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_rule_if_new"]], "cache_key() (seed.models.data_quality.dataqualitycheck static method)": [[20, "seed.models.data_quality.DataQualityCheck.cache_key"]], "check_data() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.check_data"]], "condition (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.condition"]], "data_quality_check (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.data_quality_check"]], "data_quality_check_id (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.data_quality_check_id"]], "data_type (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.data_type"]], "description (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.description"]], "enabled (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.enabled"]], "field (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.field"]], "for_derived_column (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.for_derived_column"]], "format_pint_violation() (in module seed.models.data_quality)": [[20, "seed.models.data_quality.format_pint_violation"]], "format_strings() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.format_strings"]], "get_data_type_display() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.get_data_type_display"]], "get_fieldnames() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.get_fieldnames"]], "get_rule_type_display() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.get_rule_type_display"]], "get_severity_display() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.get_severity_display"]], "id (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.id"]], "id (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.id"]], "initialize_cache() (seed.models.data_quality.dataqualitycheck static method)": [[20, "seed.models.data_quality.DataQualityCheck.initialize_cache"]], "initialize_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.initialize_rules"]], "max (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.max"]], "maximum_valid() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.maximum_valid"]], "min (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.min"]], "minimum_valid() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.minimum_valid"]], "name (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.name"]], "name (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.name"]], "not_null (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.not_null"]], "objects (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.objects"]], "objects (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.objects"]], "organization (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.organization"]], "organization_id (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.organization_id"]], "remove_all_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.remove_all_rules"]], "remove_status_label() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.remove_status_label"]], "required (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.required"]], "reset_all_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.reset_all_rules"]], "reset_default_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.reset_default_rules"]], "reset_results() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.reset_results"]], "retrieve() (seed.models.data_quality.dataqualitycheck class method)": [[20, "seed.models.data_quality.DataQualityCheck.retrieve"]], "retrieve_result_by_address() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.retrieve_result_by_address"]], "retrieve_result_by_tax_lot_id() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.retrieve_result_by_tax_lot_id"]], "rules (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.rules"]], "save_to_cache() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.save_to_cache"]], "seed.models.data_quality": [[20, "module-seed.models.data_quality"]], "status_label (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.status_label"]], "status_label_id (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.status_label_id"]], "str_to_data_type() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.str_to_data_type"]], "table_name (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.table_name"]], "text_match (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.text_match"]], "units (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.units"]], "update_status_label() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.update_status_label"]], "valid_text() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.valid_text"]], "notdeletedmanager (class in seed.data_importer.managers)": [[22, "seed.data_importer.managers.NotDeletedManager"]], "get_all() (seed.data_importer.managers.notdeletedmanager method)": [[22, "seed.data_importer.managers.NotDeletedManager.get_all"]], "get_queryset() (seed.data_importer.managers.notdeletedmanager method)": [[22, "seed.data_importer.managers.NotDeletedManager.get_queryset"]], "kbtu_thermal_conversion_factors() (in module seed.data_importer.utils)": [[22, "seed.data_importer.utils.kbtu_thermal_conversion_factors"]], "seed.data_importer": [[22, "module-seed.data_importer"]], "seed.data_importer.managers": [[22, "module-seed.data_importer.managers"]], "seed.data_importer.utils": [[22, "module-seed.data_importer.utils"]], "usage_point_id() (in module seed.data_importer.utils)": [[22, "seed.data_importer.utils.usage_point_id"]], "use_for_related_fields (seed.data_importer.managers.notdeletedmanager attribute)": [[22, "seed.data_importer.managers.NotDeletedManager.use_for_related_fields"]], "customcreateuserform (class in seed.landing.forms)": [[24, "seed.landing.forms.CustomCreateUserForm"]], "customcreateuserform.meta (class in seed.landing.forms)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta"]], "loginform (class in seed.landing.forms)": [[24, "seed.landing.forms.LoginForm"]], "required_fields (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.REQUIRED_FIELDS"]], "seeduser (class in seed.landing.models)": [[24, "seed.landing.models.SEEDUser"]], "seeduser.doesnotexist": [[24, "seed.landing.models.SEEDUser.DoesNotExist"]], "seeduser.multipleobjectsreturned": [[24, "seed.landing.models.SEEDUser.MultipleObjectsReturned"]], "username_field (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.USERNAME_FIELD"]], "userlogintest (class in seed.landing.tests)": [[24, "seed.landing.tests.UserLoginTest"]], "account_activation_sent() (in module seed.landing.views)": [[24, "seed.landing.views.account_activation_sent"]], "activate() (in module seed.landing.views)": [[24, "seed.landing.views.activate"]], "analysis_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.analysis_set"]], "api_key (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.api_key"]], "base_fields (seed.landing.forms.customcreateuserform attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.base_fields"]], "base_fields (seed.landing.forms.loginform attribute)": [[24, "seed.landing.forms.LoginForm.base_fields"]], "columnmapping_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.columnmapping_set"]], "create_account() (in module seed.landing.views)": [[24, "seed.landing.views.create_account"]], "cycle_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.cycle_set"]], "date_joined (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.date_joined"]], "deactivate_user() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.deactivate_user"]], "declared_fields (seed.landing.forms.customcreateuserform attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.declared_fields"]], "declared_fields (seed.landing.forms.loginform attribute)": [[24, "seed.landing.forms.LoginForm.declared_fields"]], "default_building_detail_custom_columns (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_building_detail_custom_columns"]], "default_custom_columns (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_custom_columns"]], "default_organization (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_organization"]], "default_organization_id (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_organization_id"]], "email (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.email"]], "email_user() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.email_user"]], "fields (seed.landing.forms.customcreateuserform.meta attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta.fields"]], "first_name (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.first_name"]], "generate_key() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.generate_key"]], "get_absolute_url() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_absolute_url"]], "get_full_name() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_full_name"]], "get_next_by_date_joined() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_next_by_date_joined"]], "get_previous_by_date_joined() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_previous_by_date_joined"]], "get_short_name() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_short_name"]], "greenassessmentpropertyauditlog_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.greenassessmentpropertyauditlog_set"]], "groups (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.groups"]], "id (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.id"]], "importrecord_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.importrecord_set"]], "is_staff (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.is_staff"]], "landing_page() (in module seed.landing.views)": [[24, "seed.landing.views.landing_page"]], "last_name (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.last_name"]], "logentry_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.logentry_set"]], "media (seed.landing.forms.customcreateuserform property)": [[24, "seed.landing.forms.CustomCreateUserForm.media"]], "media (seed.landing.forms.loginform property)": [[24, "seed.landing.forms.LoginForm.media"]], "model (seed.landing.forms.customcreateuserform.meta attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta.model"]], "modified_import_records (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.modified_import_records"]], "notes (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.notes"]], "oauth2_provider_accesstoken (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.oauth2_provider_accesstoken"]], "oauth2_provider_application (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.oauth2_provider_application"]], "oauth2_provider_grant (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.oauth2_provider_grant"]], "oauth2_provider_refreshtoken (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.oauth2_provider_refreshtoken"]], "objects (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.objects"]], "organizationuser_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.organizationuser_set"]], "orgs (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.orgs"]], "password_reset() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset"]], "password_reset_complete() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset_complete"]], "password_reset_confirm() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset_confirm"]], "password_reset_done() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset_done"]], "password_set() (in module seed.landing.views)": [[24, "seed.landing.views.password_set"]], "postofficeemail_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.postofficeemail_set"]], "postofficeemailtemplate_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.postofficeemailtemplate_set"]], "process_header_request() (seed.landing.models.seeduser class method)": [[24, "seed.landing.models.SEEDUser.process_header_request"]], "save() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.save"]], "seed.landing": [[24, "module-seed.landing"]], "seed.landing.forms": [[24, "module-seed.landing.forms"]], "seed.landing.models": [[24, "module-seed.landing.models"]], "seed.landing.tests": [[24, "module-seed.landing.tests"]], "seed.landing.urls": [[24, "module-seed.landing.urls"]], "seed.landing.views": [[24, "module-seed.landing.views"]], "setup() (seed.landing.tests.userlogintest method)": [[24, "seed.landing.tests.UserLoginTest.setUp"]], "show_shared_buildings (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.show_shared_buildings"]], "signup() (in module seed.landing.views)": [[24, "seed.landing.views.signup"]], "test_simple_login() (seed.landing.tests.userlogintest method)": [[24, "seed.landing.tests.UserLoginTest.test_simple_login"]], "user_permissions (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.user_permissions"]], "username (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.username"]], "widgets (seed.landing.forms.customcreateuserform.meta attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta.widgets"]], "seed.landing.management": [[25, "module-seed.landing.management"]], "seed.landing.management.commands": [[26, "module-seed.landing.management.commands"]], "seed.lib": [[27, "module-seed.lib"]], "seed.lib.mappings": [[27, "module-seed.lib.mappings"], [28, "module-seed.lib.mappings"]], "seed.lib.merging": [[27, "module-seed.lib.merging"], [29, "module-seed.lib.merging"]], "mappingcolumns (class in seed.lib.mappings.mapping_columns)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns"]], "add_mappings() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.add_mappings"]], "apply_threshold() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.apply_threshold"]], "create_column_regexes() (in module seed.lib.mappings.mapper)": [[28, "seed.lib.mappings.mapper.create_column_regexes"]], "duplicates (seed.lib.mappings.mapping_columns.mappingcolumns property)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.duplicates"]], "final_mappings (seed.lib.mappings.mapping_columns.mappingcolumns property)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.final_mappings"]], "first_suggested_mapping() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.first_suggested_mapping"]], "get_pm_mapping() (in module seed.lib.mappings.mapper)": [[28, "seed.lib.mappings.mapper.get_pm_mapping"]], "resolve_duplicate() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.resolve_duplicate"]], "seed.lib.mappings.mapper": [[28, "module-seed.lib.mappings.mapper"]], "seed.lib.mappings.mapping_columns": [[28, "module-seed.lib.mappings.mapping_columns"]], "set_initial_mapping_cmp() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.set_initial_mapping_cmp"]], "sort_duplicates() (in module seed.lib.mappings.mapping_columns)": [[28, "seed.lib.mappings.mapping_columns.sort_duplicates"]], "get_attrs_with_mapping() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_attrs_with_mapping"]], "get_propertystate_attrs() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_propertystate_attrs"]], "get_state_attrs() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_state_attrs"]], "get_state_to_state_tuple() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_state_to_state_tuple"]], "get_taxlotstate_attrs() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_taxlotstate_attrs"]], "merge_state() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.merge_state"]], "seed.lib.merging.merging": [[29, "module-seed.lib.merging.merging"]], "seed.management": [[30, "module-seed.management"]], "blue_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.BLUE_CHOICE"]], "color_choices (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.COLOR_CHOICES"]], "column_exclude_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_EXCLUDE_FIELDS"]], "column_merge_favor_existing (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_MERGE_FAVOR_EXISTING"]], "column_merge_favor_new (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_MERGE_FAVOR_NEW"]], "column_merge_protection (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_MERGE_PROTECTION"]], "column (class in seed.models.columns)": [[34, "seed.models.columns.Column"]], "column.doesnotexist": [[34, "seed.models.columns.Column.DoesNotExist"]], "column.multipleobjectsreturned": [[34, "seed.models.columns.Column.MultipleObjectsReturned"]], "columncasterror": [[34, "seed.models.columns.ColumnCastError"]], "cycle (class in seed.models.cycles)": [[34, "seed.models.cycles.Cycle"]], "cycle.doesnotexist": [[34, "seed.models.cycles.Cycle.DoesNotExist"]], "cycle.multipleobjectsreturned": [[34, "seed.models.cycles.Cycle.MultipleObjectsReturned"]], "database_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.DATABASE_COLUMNS"]], "data_type_parsers (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.DATA_TYPE_PARSERS"]], "date (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.DATE"]], "datetime (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.DATETIME"]], "decimal (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.DECIMAL"]], "default_labels (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.DEFAULT_LABELS"]], "excluded_api_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_API_FIELDS"]], "excluded_column_return_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_COLUMN_RETURN_FIELDS"]], "excluded_mapping_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_MAPPING_FIELDS"]], "excluded_rename_from_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_RENAME_FROM_FIELDS"]], "excluded_rename_to_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_RENAME_TO_FIELDS"]], "float (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.FLOAT"]], "gray_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.GRAY_CHOICE"]], "green_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.GREEN_CHOICE"]], "integer (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.INTEGER"]], "internal_type_to_data_type (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.INTERNAL_TYPE_TO_DATA_TYPE"]], "light_blue_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.LIGHT_BLUE_CHOICE"]], "orange_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.ORANGE_CHOICE"]], "pinned_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.PINNED_COLUMNS"]], "property (class in seed.models.properties)": [[34, "seed.models.properties.Property"]], "property.doesnotexist": [[34, "seed.models.properties.Property.DoesNotExist"]], "property.multipleobjectsreturned": [[34, "seed.models.properties.Property.MultipleObjectsReturned"]], "propertyauditlog (class in seed.models.properties)": [[34, "seed.models.properties.PropertyAuditLog"]], "propertyauditlog.doesnotexist": [[34, "seed.models.properties.PropertyAuditLog.DoesNotExist"]], "propertyauditlog.multipleobjectsreturned": [[34, "seed.models.properties.PropertyAuditLog.MultipleObjectsReturned"]], "propertystate (class in seed.models.properties)": [[34, "seed.models.properties.PropertyState"]], "propertystate.doesnotexist": [[34, "seed.models.properties.PropertyState.DoesNotExist"]], "propertystate.multipleobjectsreturned": [[34, "seed.models.properties.PropertyState.MultipleObjectsReturned"]], "propertyview (class in seed.models.properties)": [[34, "seed.models.properties.PropertyView"]], "propertyview.doesnotexist": [[34, "seed.models.properties.PropertyView.DoesNotExist"]], "propertyview.multipleobjectsreturned": [[34, "seed.models.properties.PropertyView.MultipleObjectsReturned"]], "quantity_unit_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.QUANTITY_UNIT_COLUMNS"]], "red_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.RED_CHOICE"]], "shared_field_types (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.SHARED_FIELD_TYPES"]], "shared_none (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.SHARED_NONE"]], "shared_public (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.SHARED_PUBLIC"]], "string (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.STRING"]], "statuslabel (class in seed.models.models)": [[34, "seed.models.models.StatusLabel"]], "statuslabel.doesnotexist": [[34, "seed.models.models.StatusLabel.DoesNotExist"]], "statuslabel.multipleobjectsreturned": [[34, "seed.models.models.StatusLabel.MultipleObjectsReturned"]], "taxlot (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLot"]], "taxlot.doesnotexist": [[34, "seed.models.tax_lots.TaxLot.DoesNotExist"]], "taxlot.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLot.MultipleObjectsReturned"]], "taxlotauditlog (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLotAuditLog"]], "taxlotauditlog.doesnotexist": [[34, "seed.models.tax_lots.TaxLotAuditLog.DoesNotExist"]], "taxlotauditlog.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLotAuditLog.MultipleObjectsReturned"]], "taxlotstate (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLotState"]], "taxlotstate.doesnotexist": [[34, "seed.models.tax_lots.TaxLotState.DoesNotExist"]], "taxlotstate.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLotState.MultipleObjectsReturned"]], "taxlotview (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLotView"]], "taxlotview.doesnotexist": [[34, "seed.models.tax_lots.TaxLotView.DoesNotExist"]], "taxlotview.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLotView.MultipleObjectsReturned"]], "unit_types (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.UNIT_TYPES"]], "unmappable_property_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.UNMAPPABLE_PROPERTY_FIELDS"]], "unmappable_taxlot_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.UNMAPPABLE_TAXLOT_FIELDS"]], "unit (class in seed.models.models)": [[34, "seed.models.models.Unit"]], "unit.doesnotexist": [[34, "seed.models.models.Unit.DoesNotExist"]], "unit.multipleobjectsreturned": [[34, "seed.models.models.Unit.MultipleObjectsReturned"]], "white_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.WHITE_CHOICE"]], "access_level_instance (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.access_level_instance"]], "access_level_instance (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.access_level_instance"]], "access_level_instance_id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.access_level_instance_id"]], "access_level_instance_id (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.access_level_instance_id"]], "account_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.account_name_column"]], "actual_emission_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.actual_emission_column"]], "actual_energy_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.actual_energy_column"]], "address_line_1 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.address_line_1"]], "address_line_1 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.address_line_1"]], "address_line_2 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.address_line_2"]], "address_line_2 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.address_line_2"]], "analysispropertyview (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.analysispropertyview"]], "analysispropertyview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.analysispropertyview_set"]], "analysispropertyview_set (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.analysispropertyview_set"]], "and_filter_groups (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.and_filter_groups"]], "audit_template_building_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.audit_template_building_id"]], "benchmark_id_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.benchmark_id_column"]], "block_number (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.block_number"]], "bounding_box (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.bounding_box"]], "bounding_box (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.bounding_box"]], "building_certification (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.building_certification"]], "building_count (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.building_count"]], "building_files (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.building_files"]], "cast() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.cast"]], "cast_column_value() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.cast_column_value"]], "centroid (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.centroid"]], "centroid (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.centroid"]], "city (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.city"]], "city (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.city"]], "clean() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.clean"]], "clean() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.clean"]], "color (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.color"]], "column_description (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.column_description"]], "column_list_profiles (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.column_list_profiles"]], "column_name (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.column_name"]], "column_set (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.column_set"]], "columnlistprofilecolumn_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.columnlistprofilecolumn_set"]], "compliance_label (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.compliance_label"]], "comstock_mapping (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.comstock_mapping"]], "conditioned_floor_area (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.conditioned_floor_area"]], "conditioned_floor_area_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.conditioned_floor_area_orig"]], "contact_email_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.contact_email_column"]], "contact_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.contact_name_column"]], "coparent() (seed.models.properties.propertystate class method)": [[34, "seed.models.properties.PropertyState.coparent"]], "coparent() (seed.models.tax_lots.taxlotstate class method)": [[34, "seed.models.tax_lots.TaxLotState.coparent"]], "copy_meters() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.copy_meters"]], "create_mappings() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.create_mappings"]], "create_mappings_from_file() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.create_mappings_from_file"]], "created (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.created"]], "created (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.created"]], "created (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.created"]], "created (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.created"]], "created (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.created"]], "created (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.created"]], "created (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.created"]], "created (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.created"]], "custom_id_1 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.custom_id_1"]], "custom_id_1 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.custom_id_1"]], "cycle (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.cycle"]], "cycle (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.cycle"]], "cycle_id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.cycle_id"]], "cycle_id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.cycle_id"]], "cycles (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.cycles"]], "data_admin_account_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_admin_account_name_column"]], "data_admin_email_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_admin_email_column"]], "data_admin_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_admin_name_column"]], "data_loggers (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.data_loggers"]], "data_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.data_state"]], "data_state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.data_state"]], "data_type (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_type"]], "dataview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.dataview_set"]], "dataviewparameter_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.dataviewparameter_set"]], "delete_all() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.delete_all"]], "derived_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derived_column"]], "derived_column_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derived_column_id"]], "derivedcolumn_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derivedcolumn_set"]], "derivedcolumnparameter_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derivedcolumnparameter_set"]], "description (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.description"]], "description (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.description"]], "display_name (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.display_name"]], "district (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.district"]], "egrid_subregion_code (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.egrid_subregion_code"]], "end (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.end"]], "energy_alerts (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.energy_alerts"]], "energy_score (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.energy_score"]], "event_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.event_set"]], "events (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.events"]], "exclude_filter_groups (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.exclude_filter_groups"]], "extra_data (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.extra_data"]], "extra_data (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.extra_data"]], "gapauditlog_view (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.gapauditlog_view"]], "generation_date (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.generation_date"]], "geocoding_confidence (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.geocoding_confidence"]], "geocoding_confidence (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.geocoding_confidence"]], "geocoding_order (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.geocoding_order"]], "get_color_display() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_color_display"]], "get_data_state_display() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_data_state_display"]], "get_data_state_display() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_data_state_display"]], "get_merge_protection_display() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_merge_protection_display"]], "get_merge_state_display() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_merge_state_display"]], "get_merge_state_display() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_merge_state_display"]], "get_next_by_created() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_next_by_created"]], "get_next_by_created() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_next_by_created"]], "get_next_by_created() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_next_by_created"]], "get_next_by_created() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_next_by_created"]], "get_next_by_created() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_next_by_created"]], "get_next_by_created() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_next_by_created"]], "get_next_by_created() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_next_by_created"]], "get_next_by_end() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_next_by_end"]], "get_next_by_modified() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_next_by_modified"]], "get_next_by_modified() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_next_by_modified"]], "get_next_by_start() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_next_by_start"]], "get_next_by_updated() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_next_by_updated"]], "get_next_by_updated() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_next_by_updated"]], "get_next_by_updated() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_next_by_updated"]], "get_next_by_updated() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_next_by_updated"]], "get_or_create_default() (seed.models.cycles.cycle class method)": [[34, "seed.models.cycles.Cycle.get_or_create_default"]], "get_previous_by_created() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_previous_by_created"]], "get_previous_by_created() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_previous_by_created"]], "get_previous_by_created() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_previous_by_created"]], "get_previous_by_created() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_previous_by_created"]], "get_previous_by_created() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_previous_by_created"]], "get_previous_by_created() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_previous_by_created"]], "get_previous_by_created() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_previous_by_created"]], "get_previous_by_end() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_previous_by_end"]], "get_previous_by_modified() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_previous_by_modified"]], "get_previous_by_modified() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_previous_by_modified"]], "get_previous_by_start() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_previous_by_start"]], "get_previous_by_updated() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_previous_by_updated"]], "get_previous_by_updated() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_previous_by_updated"]], "get_previous_by_updated() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_previous_by_updated"]], "get_previous_by_updated() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_previous_by_updated"]], "get_record_type_display() (seed.models.properties.propertyauditlog method)": [[34, "seed.models.properties.PropertyAuditLog.get_record_type_display"]], "get_record_type_display() (seed.models.tax_lots.taxlotauditlog method)": [[34, "seed.models.tax_lots.TaxLotAuditLog.get_record_type_display"]], "get_shared_field_type_display() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_shared_field_type_display"]], "get_source_type_display() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_source_type_display"]], "get_unit_type_display() (seed.models.models.unit method)": [[34, "seed.models.models.Unit.get_unit_type_display"]], "goal_area_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.goal_area_columns"]], "goal_baseline_cycles (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.goal_baseline_cycles"]], "goal_current_cycles (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.goal_current_cycles"]], "goal_eui_column1s (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.goal_eui_column1s"]], "goal_eui_column2s (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.goal_eui_column2s"]], "goal_eui_column3s (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.goal_eui_column3s"]], "goalnote_set (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.goalnote_set"]], "greenassessmentproperty_set (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.greenassessmentproperty_set"]], "gross_floor_area (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.gross_floor_area"]], "gross_floor_area_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.gross_floor_area_orig"]], "hash_object (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.hash_object"]], "hash_object (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.hash_object"]], "historical_note (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.historical_note"]], "history() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.history"]], "history() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.history"]], "home_energy_score_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.home_energy_score_id"]], "id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.id"]], "id (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.id"]], "id (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.id"]], "id (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.id"]], "id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.id"]], "id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.id"]], "id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.id"]], "id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.id"]], "id (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.id"]], "id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.id"]], "id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.id"]], "id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.id"]], "import_file (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.import_file"]], "import_file (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.import_file"]], "import_file (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.import_file"]], "import_file_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.import_file_id"]], "import_file_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.import_file_id"]], "import_file_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.import_file_id"]], "import_filename (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.import_filename"]], "import_filename (seed.models.properties.propertyview property)": [[34, "seed.models.properties.PropertyView.import_filename"]], "import_filename (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.import_filename"]], "import_filename (seed.models.tax_lots.taxlotview property)": [[34, "seed.models.tax_lots.TaxLotView.import_filename"]], "importfile_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.importfile_set"]], "indication_label (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.indication_label"]], "initialize_audit_logs() (seed.models.properties.propertyview method)": [[34, "seed.models.properties.PropertyView.initialize_audit_logs"]], "initialize_audit_logs() (seed.models.tax_lots.taxlotview method)": [[34, "seed.models.tax_lots.TaxLotView.initialize_audit_logs"]], "inventory_documents (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.inventory_documents"]], "is_extra_data (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.is_extra_data"]], "is_matching_criteria (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.is_matching_criteria"]], "jurisdiction_property_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.jurisdiction_property_id"]], "jurisdiction_tax_lot_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.jurisdiction_tax_lot_id"]], "labels (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.labels"]], "labels (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.labels"]], "latitude (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.latitude"]], "latitude (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.latitude"]], "long_lat (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.long_lat"]], "long_lat (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.long_lat"]], "longitude (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.longitude"]], "longitude (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.longitude"]], "lot_number (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.lot_number"]], "mapped_mappings (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.mapped_mappings"]], "measure_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.measure_set"]], "measures (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.measures"]], "merge_protection (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.merge_protection"]], "merge_relationships() (seed.models.properties.propertystate class method)": [[34, "seed.models.properties.PropertyState.merge_relationships"]], "merge_relationships() (seed.models.tax_lots.taxlotstate class method)": [[34, "seed.models.tax_lots.TaxLotState.merge_relationships"]], "merge_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.merge_state"]], "merge_state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.merge_state"]], "meters (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.meters"]], "modified (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.modified"]], "name (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.name"]], "name (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.name"]], "name (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.name"]], "name (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.name"]], "normalized_address (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.normalized_address"]], "normalized_address (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.normalized_address"]], "notes (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.notes"]], "notes (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.notes"]], "number_properties (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.number_properties"]], "objects (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.objects"]], "objects (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.objects"]], "objects (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.objects"]], "objects (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.objects"]], "objects (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.objects"]], "objects (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.objects"]], "objects (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.objects"]], "objects (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.objects"]], "objects (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.objects"]], "objects (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.objects"]], "objects (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.objects"]], "objects (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.objects"]], "occupied_floor_area (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.occupied_floor_area"]], "occupied_floor_area_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.occupied_floor_area_orig"]], "or_filter_groups (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.or_filter_groups"]], "organization (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.organization"]], "organization (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.organization"]], "organization (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.organization"]], "organization (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.organization"]], "organization (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.organization"]], "organization (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.organization"]], "organization (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.organization"]], "organization (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.organization"]], "organization_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.organization_id"]], "organization_id (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.organization_id"]], "organization_id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.organization_id"]], "organization_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.organization_id"]], "organization_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.organization_id"]], "organization_id (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.organization_id"]], "organization_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.organization_id"]], "organization_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.organization_id"]], "owner (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner"]], "owner_address (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_address"]], "owner_city_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_city_state"]], "owner_email (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_email"]], "owner_postal_code (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_postal_code"]], "owner_telephone (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_telephone"]], "parent1 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent1"]], "parent1 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent1"]], "parent1_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent1_id"]], "parent1_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent1_id"]], "parent2 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent2"]], "parent2 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent2"]], "parent2_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent2_id"]], "parent2_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent2_id"]], "parent_property (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.parent_property"]], "parent_property_id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.parent_property_id"]], "parent_state1 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state1"]], "parent_state1 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.parent_state1"]], "parent_state1 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state1"]], "parent_state1_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state1_id"]], "parent_state1_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state1_id"]], "parent_state2 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state2"]], "parent_state2 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.parent_state2"]], "parent_state2 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state2"]], "parent_state2_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state2_id"]], "parent_state2_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state2_id"]], "pm_parent_property_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.pm_parent_property_id"]], "pm_property_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.pm_property_id"]], "post_save_property() (in module seed.models.properties)": [[34, "seed.models.properties.post_save_property"]], "post_save_property_state() (in module seed.models.properties)": [[34, "seed.models.properties.post_save_property_state"]], "post_save_property_view() (in module seed.models.properties)": [[34, "seed.models.properties.post_save_property_view"]], "post_save_taxlot_state() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.post_save_taxlot_state"]], "post_save_taxlot_view() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.post_save_taxlot_view"]], "postal_code (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.postal_code"]], "postal_code (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.postal_code"]], "pre_delete_state() (in module seed.models.properties)": [[34, "seed.models.properties.pre_delete_state"]], "promote() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.promote"]], "promote() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.promote"]], "property (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.property"]], "property_footprint (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_footprint"]], "property_id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.property_id"]], "property_name (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_name"]], "property_notes (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_notes"]], "property_set (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.property_set"]], "property_states() (seed.models.tax_lots.taxlotview method)": [[34, "seed.models.tax_lots.TaxLotView.property_states"]], "property_timezone (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_timezone"]], "property_type (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_type"]], "property_views() (seed.models.tax_lots.taxlotview method)": [[34, "seed.models.tax_lots.TaxLotView.property_views"]], "propertyauditlog_parent1 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.propertyauditlog_parent1"]], "propertyauditlog_parent2 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.propertyauditlog_parent2"]], "propertyauditlog_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.propertyauditlog_state"]], "propertyauditlog_view (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.propertyauditlog_view"]], "propertymeasure_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.propertymeasure_set"]], "propertyview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.propertyview_set"]], "propertyview_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.propertyview_set"]], "propertyview_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.propertyview_set"]], "raw_access_level_instance (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.raw_access_level_instance"]], "raw_access_level_instance (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.raw_access_level_instance"]], "raw_access_level_instance_error (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.raw_access_level_instance_error"]], "raw_access_level_instance_error (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.raw_access_level_instance_error"]], "raw_access_level_instance_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.raw_access_level_instance_id"]], "raw_access_level_instance_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.raw_access_level_instance_id"]], "raw_mappings (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.raw_mappings"]], "recent_sale_date (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.recent_sale_date"]], "recognize_empty (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.recognize_empty"]], "record_type (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.record_type"]], "record_type (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.record_type"]], "release_date (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.release_date"]], "rename_column() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.rename_column"]], "retrieve_all() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_all"]], "retrieve_all_by_tuple() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_all_by_tuple"]], "retrieve_db_field_name_for_hash_comparison() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_field_name_for_hash_comparison"]], "retrieve_db_field_table_and_names_from_db_tables() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_field_table_and_names_from_db_tables"]], "retrieve_db_fields() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_fields"]], "retrieve_db_fields_from_db_tables() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_fields_from_db_tables"]], "retrieve_db_types() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_types"]], "retrieve_mapping_columns() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_mapping_columns"]], "retrieve_priorities() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_priorities"]], "rule_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.rule_set"]], "salesforce_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.salesforce_column"]], "save() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.save"]], "save() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.save"]], "save() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.save"]], "save_column_names() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.save_column_names"]], "scenarios (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.scenarios"]], "seed.models.auditlog": [[34, "module-seed.models.auditlog"]], "seed.models.columns": [[34, "module-seed.models.columns"]], "seed.models.cycles": [[34, "module-seed.models.cycles"]], "seed.models.models": [[34, "module-seed.models.models"]], "seed.models.properties": [[34, "module-seed.models.properties"]], "seed.models.tax_lots": [[34, "module-seed.models.tax_lots"]], "set_default_access_level_instance() (in module seed.models.properties)": [[34, "seed.models.properties.set_default_access_level_instance"]], "set_default_access_level_instance() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.set_default_access_level_instance"]], "shared_field_type (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.shared_field_type"]], "show_in_list (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.show_in_list"]], "simulation (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.simulation"]], "site_eui (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui"]], "site_eui_modeled (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_modeled"]], "site_eui_modeled_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_modeled_orig"]], "site_eui_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_orig"]], "site_eui_weather_normalized (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_weather_normalized"]], "site_eui_weather_normalized_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_weather_normalized_orig"]], "source_eui (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui"]], "source_eui_modeled (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_modeled"]], "source_eui_modeled_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_modeled_orig"]], "source_eui_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_orig"]], "source_eui_weather_normalized (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_weather_normalized"]], "source_eui_weather_normalized_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_weather_normalized_orig"]], "source_type (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_type"]], "space_alerts (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.space_alerts"]], "start (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.start"]], "state (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.state"]], "state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.state"]], "state (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.state"]], "state (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.state"]], "state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.state"]], "state (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.state"]], "state_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.state_id"]], "state_id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.state_id"]], "state_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.state_id"]], "state_id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.state_id"]], "super_organization (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.super_organization"]], "super_organization_id (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.super_organization_id"]], "sync_latitude_longitude_and_long_lat() (in module seed.models.properties)": [[34, "seed.models.properties.sync_latitude_longitude_and_long_lat"]], "sync_latitude_longitude_and_long_lat() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.sync_latitude_longitude_and_long_lat"]], "table_name (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.table_name"]], "target_emission_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.target_emission_column"]], "target_energy_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.target_energy_column"]], "tax_lot_states() (seed.models.properties.propertyview method)": [[34, "seed.models.properties.PropertyView.tax_lot_states"]], "tax_lot_views() (seed.models.properties.propertyview method)": [[34, "seed.models.properties.PropertyView.tax_lot_views"]], "taxlot (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlot"]], "taxlot_footprint (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlot_footprint"]], "taxlot_id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlot_id"]], "taxlotauditlog_parent1 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.taxlotauditlog_parent1"]], "taxlotauditlog_parent2 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.taxlotauditlog_parent2"]], "taxlotauditlog_parent_state1 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotauditlog_parent_state1"]], "taxlotauditlog_parent_state2 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotauditlog_parent_state2"]], "taxlotauditlog_state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotauditlog_state"]], "taxlotauditlog_view (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlotauditlog_view"]], "taxlotproperty_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.taxlotproperty_set"]], "taxlotproperty_set (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.taxlotproperty_set"]], "taxlotproperty_set (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlotproperty_set"]], "taxlotview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.taxlotview_set"]], "taxlotview_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.taxlotview_set"]], "taxlotview_set (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotview_set"]], "to_dict() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.to_dict"]], "to_dict() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.to_dict"]], "to_dict() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.to_dict"]], "total_ghg_emissions (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_ghg_emissions"]], "total_ghg_emissions_intensity (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_ghg_emissions_intensity"]], "total_marginal_ghg_emissions (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_marginal_ghg_emissions"]], "total_marginal_ghg_emissions_intensity (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_marginal_ghg_emissions_intensity"]], "ubid (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.ubid"]], "ubid (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.ubid"]], "ubidmodel_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.ubidmodel_set"]], "ubidmodel_set (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.ubidmodel_set"]], "unit (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.unit"]], "unit_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.unit_id"]], "unit_name (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.unit_name"]], "unit_type (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.unit_type"]], "units_pint (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.units_pint"]], "updated (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.updated"]], "updated (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.updated"]], "updated (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.updated"]], "updated (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.updated"]], "use_description (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.use_description"]], "user (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.user"]], "user_id (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.user_id"]], "validate_model() (in module seed.models.columns)": [[34, "seed.models.columns.validate_model"]], "view (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.view"]], "view (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.view"]], "view_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.view_id"]], "view_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.view_id"]], "views (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.views"]], "views (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.views"]], "violation_label (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.violation_label"]], "x_axis_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.x_axis_columns"]], "year_built (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.year_built"]], "year_ending (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.year_ending"]], "seed.public": [[35, "module-seed.public"]], "celerydatetimeserializer (class in seed.serializers.celery)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer"]], "labelserializer (class in seed.serializers.labels)": [[36, "seed.serializers.labels.LabelSerializer"]], "labelserializer.meta (class in seed.serializers.labels)": [[36, "seed.serializers.labels.LabelSerializer.Meta"]], "default() (seed.serializers.celery.celerydatetimeserializer method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.default"]], "extra_kwargs (seed.serializers.labels.labelserializer.meta attribute)": [[36, "seed.serializers.labels.LabelSerializer.Meta.extra_kwargs"]], "fields (seed.serializers.labels.labelserializer.meta attribute)": [[36, "seed.serializers.labels.LabelSerializer.Meta.fields"]], "get_is_applied() (seed.serializers.labels.labelserializer method)": [[36, "seed.serializers.labels.LabelSerializer.get_is_applied"]], "model (seed.serializers.labels.labelserializer.meta attribute)": [[36, "seed.serializers.labels.LabelSerializer.Meta.model"]], "seed.serializers": [[36, "module-seed.serializers"]], "seed.serializers.celery": [[36, "module-seed.serializers.celery"]], "seed.serializers.labels": [[36, "module-seed.serializers.labels"]], "seed_decoder() (seed.serializers.celery.celerydatetimeserializer static method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.seed_decoder"]], "seed_dumps() (seed.serializers.celery.celerydatetimeserializer static method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.seed_dumps"]], "seed_loads() (seed.serializers.celery.celerydatetimeserializer static method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.seed_loads"]], "to_representation() (seed.serializers.labels.labelserializer method)": [[36, "seed.serializers.labels.LabelSerializer.to_representation"]], "breadcrumbnode (class in seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.BreadcrumbNode"]], "urlbreadcrumbnode (class in seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.UrlBreadcrumbNode"]], "breadcrumb() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb"]], "breadcrumb_root() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb_root"]], "breadcrumb_url() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb_url"]], "breadcrumb_url_root() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb_url_root"]], "create_crumb() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.create_crumb"]], "create_crumb_first() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.create_crumb_first"]], "render() (seed.templatetags.breadcrumbs.breadcrumbnode method)": [[37, "seed.templatetags.breadcrumbs.BreadcrumbNode.render"]], "render() (seed.templatetags.breadcrumbs.urlbreadcrumbnode method)": [[37, "seed.templatetags.breadcrumbs.UrlBreadcrumbNode.render"]], "seed.templatetags.breadcrumbs": [[37, "module-seed.templatetags.breadcrumbs"]], "seed.test_helpers": [[38, "module-seed.test_helpers"]], "djangofunctionalfactory (class in seed.test_helpers.factory.helpers)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory"]], "invalid_test_cc_number() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.invalid_test_cc_number"]], "rand_bool() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_bool"]], "rand_city() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_city"]], "rand_city_suffix() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_city_suffix"]], "rand_currency() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_currency"]], "rand_date() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_date"]], "rand_domain() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_domain"]], "rand_email() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_email"]], "rand_float() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_float"]], "rand_int() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_int"]], "rand_name() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_name"]], "rand_phone() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_phone"]], "rand_plant_name() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_plant_name"]], "rand_str() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_str"]], "rand_street_address() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_street_address"]], "rand_street_suffix() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_street_suffix"]], "seed.test_helpers.factory.helpers": [[39, "module-seed.test_helpers.factory.helpers"]], "test_cc_number() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.test_cc_number"]], "valid_test_cc_number() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.valid_test_cc_number"]], "accesslevelbasetestcase (class in seed.tests.util)": [[41, "seed.tests.util.AccessLevelBaseTestCase"]], "adminviewstest (class in seed.tests.test_admin_views)": [[41, "seed.tests.test_admin_views.AdminViewsTest"]], "assertdictsubsetmixin (class in seed.tests.util)": [[41, "seed.tests.util.AssertDictSubsetMixin"]], "classdecoratortests (class in seed.tests.test_decorators)": [[41, "seed.tests.test_decorators.ClassDecoratorTests"]], "datamappingbasetestcase (class in seed.tests.util)": [[41, "seed.tests.util.DataMappingBaseTestCase"]], "datasetpermissionstests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.DatasetPermissionsTests"]], "deletemodelstestcase (class in seed.tests.util)": [[41, "seed.tests.util.DeleteModelsTestCase"]], "fakeclient (class in seed.tests.util)": [[41, "seed.tests.util.FakeClient"]], "fakerequest (class in seed.tests.util)": [[41, "seed.tests.util.FakeRequest"]], "get (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.GET"]], "getdatasetsviewstests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.GetDatasetsViewsTests"]], "importfileviewstests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.ImportFileViewsTests"]], "inventoryviewtests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.InventoryViewTests"]], "meta (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.META"]], "mainviewtests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.MainViewTests"]], "post (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.POST"]], "requireorganizationidtests (class in seed.tests.test_decorators)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests"]], "testdecorators (class in seed.tests.test_decorators)": [[41, "seed.tests.test_decorators.TestDecorators"]], "testerror": [[41, "seed.tests.test_decorators.TestError"]], "testmcmviews (class in seed.tests.test_views)": [[41, "seed.tests.test_views.TestMCMViews"]], "testtasks (class in seed.tests.test_tasks)": [[41, "seed.tests.test_tasks.TestTasks"]], "assertdictcontainssubset() (seed.tests.util.assertdictsubsetmixin method)": [[41, "seed.tests.util.AssertDictSubsetMixin.assertDictContainsSubset"]], "assert_expected_mappings() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.assert_expected_mappings"]], "body (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.body"]], "create_import_file() (seed.tests.util.datamappingbasetestcase method)": [[41, "seed.tests.util.DataMappingBaseTestCase.create_import_file"]], "expected_mappings (seed.tests.test_views.testmcmviews attribute)": [[41, "seed.tests.test_views.TestMCMViews.expected_mappings"]], "get() (seed.tests.util.fakeclient method)": [[41, "seed.tests.util.FakeClient.get"]], "locked (seed.tests.test_decorators.testdecorators attribute)": [[41, "seed.tests.test_decorators.TestDecorators.locked"]], "login_as_child_member() (seed.tests.util.accesslevelbasetestcase method)": [[41, "seed.tests.util.AccessLevelBaseTestCase.login_as_child_member"]], "login_as_root_member() (seed.tests.util.accesslevelbasetestcase method)": [[41, "seed.tests.util.AccessLevelBaseTestCase.login_as_root_member"]], "login_as_root_owner() (seed.tests.util.accesslevelbasetestcase method)": [[41, "seed.tests.util.AccessLevelBaseTestCase.login_as_root_owner"]], "path (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.path"]], "pk (seed.tests.test_decorators.testdecorators attribute)": [[41, "seed.tests.test_decorators.TestDecorators.pk"]], "post() (seed.tests.util.fakeclient method)": [[41, "seed.tests.util.FakeClient.post"]], "raw_columns_expected (seed.tests.test_views.testmcmviews attribute)": [[41, "seed.tests.test_views.TestMCMViews.raw_columns_expected"]], "seed.tests.test_admin_views": [[41, "module-seed.tests.test_admin_views"]], "seed.tests.test_decorators": [[41, "module-seed.tests.test_decorators"]], "seed.tests.test_tasks": [[41, "module-seed.tests.test_tasks"]], "seed.tests.test_views": [[41, "module-seed.tests.test_views"]], "seed.tests.util": [[41, "module-seed.tests.util"]], "setup() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.setUp"]], "setup() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.setUp"]], "setup() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.setUp"]], "setup() (seed.tests.test_tasks.testtasks method)": [[41, "seed.tests.test_tasks.TestTasks.setUp"]], "setup() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.setUp"]], "setup() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.setUp"]], "setup() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.setUp"]], "setup() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.setUp"]], "setup() (seed.tests.test_views.mainviewtests method)": [[41, "seed.tests.test_views.MainViewTests.setUp"]], "setup() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.setUp"]], "setup() (seed.tests.util.accesslevelbasetestcase method)": [[41, "seed.tests.util.AccessLevelBaseTestCase.setUp"]], "setup() (seed.tests.util.deletemodelstestcase method)": [[41, "seed.tests.util.DeleteModelsTestCase.setUp"]], "set_up() (seed.tests.util.datamappingbasetestcase method)": [[41, "seed.tests.util.DataMappingBaseTestCase.set_up"]], "teardown() (seed.tests.util.deletemodelstestcase method)": [[41, "seed.tests.util.DeleteModelsTestCase.tearDown"]], "test_add_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_org"]], "test_add_org_dupe() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_org_dupe"]], "test_add_owner_existing_org_to_non_root() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_owner_existing_org_to_non_root"]], "test_add_user_existing_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_user_existing_org"]], "test_add_user_new_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_user_new_org"]], "test_add_user_no_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_user_no_org"]], "test_ajax_request_class_dict() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_dict"]], "test_ajax_request_class_dict_status_error() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_dict_status_error"]], "test_ajax_request_class_dict_status_false() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_dict_status_false"]], "test_ajax_request_class_format_type() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_format_type"]], "test_create_dataset() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_create_dataset"]], "test_dataset_count() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_count"]], "test_dataset_create() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_create"]], "test_dataset_destroy() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_destroy"]], "test_dataset_list() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_list"]], "test_dataset_retrieve() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_retrieve"]], "test_dataset_update() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_update"]], "test_delete_dataset() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_delete_dataset"]], "test_delete_file() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.test_delete_file"]], "test_delete_organization() (seed.tests.test_tasks.testtasks method)": [[41, "seed.tests.test_tasks.TestTasks.test_delete_organization"]], "test_get_column_mapping_suggestions() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_column_mapping_suggestions"]], "test_get_column_mapping_suggestions_pm_file() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_column_mapping_suggestions_pm_file"]], "test_get_column_mapping_suggestions_with_columns() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_column_mapping_suggestions_with_columns"]], "test_get_cycles() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_cycles"]], "test_get_dataset() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_dataset"]], "test_get_datasets() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_datasets"]], "test_get_datasets_count() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_datasets_count"]], "test_get_datasets_count_invalid() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_datasets_count_invalid"]], "test_get_import_file() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.test_get_import_file"]], "test_get_matching_and_geocoding_results() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.test_get_matching_and_geocoding_results"]], "test_get_prog_key() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_get_prog_key"]], "test_get_properties() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties"]], "test_get_properties_cycle_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_cycle_id"]], "test_get_properties_empty_page() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_empty_page"]], "test_get_properties_page_not_an_integer() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_page_not_an_integer"]], "test_get_properties_pint_fields() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_pint_fields"]], "test_get_properties_profile_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_profile_id"]], "test_get_properties_property_extra_data() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_property_extra_data"]], "test_get_properties_select_all() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_select_all"]], "test_get_properties_taxlot_extra_data() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_taxlot_extra_data"]], "test_get_properties_with_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_with_taxlots"]], "test_get_properties_with_taxlots_with_footprints() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_with_taxlots_with_footprints"]], "test_get_properties_wrong_query_params() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_wrong_query_params"]], "test_get_property() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_property"]], "test_get_property_columns() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_property_columns"]], "test_get_property_multiple_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_property_multiple_taxlots"]], "test_get_raw_column_names() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_raw_column_names"]], "test_get_taxlot() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlot"]], "test_get_taxlot_columns() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlot_columns"]], "test_get_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots"]], "test_get_taxlots_empty_page() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_empty_page"]], "test_get_taxlots_extra_data() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_extra_data"]], "test_get_taxlots_multiple_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_multiple_taxlots"]], "test_get_taxlots_no_cycle_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_no_cycle_id"]], "test_get_taxlots_page_not_an_integer() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_page_not_an_integer"]], "test_get_taxlots_profile_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_profile_id"]], "test_home() (seed.tests.test_views.mainviewtests method)": [[41, "seed.tests.test_views.MainViewTests.test_home"]], "test_increment_cache() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_increment_cache"]], "test_locking() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_locking"]], "test_locking_w_exception() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_locking_w_exception"]], "test_postoffice() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_postoffice"]], "test_progress() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_progress"]], "test_progress() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_progress"]], "test_require_organization_id_class_no_org_id() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_require_organization_id_class_no_org_id"]], "test_require_organization_id_class_org_id() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_require_organization_id_class_org_id"]], "test_require_organization_id_class_org_id_not_int() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_require_organization_id_class_org_id_not_int"]], "test_require_organization_id_fail_no_key() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_fail_no_key"]], "test_require_organization_id_fail_not_numeric() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_fail_not_numeric"]], "test_require_organization_id_success_integer() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_success_integer"]], "test_require_organization_id_success_string() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_success_string"]], "test_save_column_mappings() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_save_column_mappings"]], "test_save_column_mappings_idempotent() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_save_column_mappings_idempotent"]], "test_signup_process() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_signup_process"]], "test_signup_process_force_lowercase_email() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_signup_process_force_lowercase_email"]], "test_update_dataset() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_update_dataset"]], "test_update_pint_fields_with_modified_display_settings() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_update_pint_fields_with_modified_display_settings"]], "unlocked (seed.tests.test_decorators.testdecorators attribute)": [[41, "seed.tests.test_decorators.TestDecorators.unlocked"]], "apibypasscsrfmiddleware (class in seed.utils.api)": [[44, "seed.utils.api.APIBypassCSRFMiddleware"]], "orgcreatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgCreateMixin"]], "orgcreateupdatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgCreateUpdateMixin"]], "orgmixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgMixin"]], "orgquerysetmixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgQuerySetMixin"]], "orgupdatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgUpdateMixin"]], "orgvalidatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgValidateMixin"]], "orgvalidator (class in seed.utils.api)": [[44, "seed.utils.api.OrgValidator"]], "profileidmixin (class in seed.utils.api)": [[44, "seed.utils.api.ProfileIdMixin"]], "api_endpoint() (in module seed.utils.api)": [[44, "seed.utils.api.api_endpoint"]], "api_endpoint_class() (in module seed.utils.api)": [[44, "seed.utils.api.api_endpoint_class"]], "clean_api_regex() (in module seed.utils.api)": [[44, "seed.utils.api.clean_api_regex"]], "convert_datestr() (in module seed.utils.time)": [[44, "seed.utils.time.convert_datestr"]], "convert_to_js_timestamp() (in module seed.utils.time)": [[44, "seed.utils.time.convert_to_js_timestamp"]], "create_organization() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.create_organization"]], "create_suborganization() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.create_suborganization"]], "default_pm_mappings() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.default_pm_mappings"]], "drf_api_endpoint() (in module seed.utils.api)": [[44, "seed.utils.api.drf_api_endpoint"]], "field (seed.utils.api.orgvalidator attribute)": [[44, "seed.utils.api.OrgValidator.field"]], "format_api_docstring() (in module seed.utils.api)": [[44, "seed.utils.api.format_api_docstring"]], "get_all_urls() (in module seed.utils.api)": [[44, "seed.utils.api.get_all_urls"]], "get_api_endpoints() (in module seed.utils.api)": [[44, "seed.utils.api.get_api_endpoints"]], "get_api_request_user() (in module seed.utils.api)": [[44, "seed.utils.api.get_api_request_user"]], "get_org_id_from_validator() (in module seed.utils.api)": [[44, "seed.utils.api.get_org_id_from_validator"]], "get_organization() (seed.utils.api.orgmixin method)": [[44, "seed.utils.api.OrgMixin.get_organization"]], "get_parent_org() (seed.utils.api.orgmixin method)": [[44, "seed.utils.api.OrgMixin.get_parent_org"]], "get_queryset() (seed.utils.api.orgquerysetmixin method)": [[44, "seed.utils.api.OrgQuerySetMixin.get_queryset"]], "get_show_columns() (seed.utils.api.profileidmixin method)": [[44, "seed.utils.api.ProfileIdMixin.get_show_columns"]], "get_source_type() (in module seed.utils.buildings)": [[44, "seed.utils.buildings.get_source_type"]], "key (seed.utils.api.orgvalidator attribute)": [[44, "seed.utils.api.OrgValidator.key"]], "parse_datetime() (in module seed.utils.time)": [[44, "seed.utils.time.parse_datetime"]], "perform_create() (seed.utils.api.orgcreatemixin method)": [[44, "seed.utils.api.OrgCreateMixin.perform_create"]], "perform_update() (seed.utils.api.orgupdatemixin method)": [[44, "seed.utils.api.OrgUpdateMixin.perform_update"]], "rgetattr() (in module seed.utils.api)": [[44, "seed.utils.api.rgetattr"]], "seed.utils.api": [[44, "module-seed.utils.api"]], "seed.utils.buildings": [[44, "module-seed.utils.buildings"]], "seed.utils.organizations": [[44, "module-seed.utils.organizations"]], "seed.utils.time": [[44, "module-seed.utils.time"]], "validate() (seed.utils.api.orgvalidatemixin method)": [[44, "seed.utils.api.OrgValidateMixin.validate"]], "validate_org() (seed.utils.api.orgvalidatemixin method)": [[44, "seed.utils.api.OrgValidateMixin.validate_org"]]}}) \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/setup_docker.html b/docs/code_documentation/3.0.0-beta.0/setup_docker.html new file mode 100644 index 00000000..2a3b1c8c --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/setup_docker.html @@ -0,0 +1,254 @@ + + + + + + + Installation using Docker — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Installation using Docker

+

Docker works natively on Linux, Mac OSX, and Windows 10. If you are using an older version of +Windows (and some older versions of Mac OSX), you will need to install Docker Toolbox.

+

Choose either Docker Native (Windows/OSX) or Docker Native (Ubuntu) to +install Docker.

+
+

Docker Native (Ubuntu)

+

Follow instructions here.

+ +
+
+

Docker Native (Windows/OSX)

+

Following instructions for Mac or +for Windows. Note that for OSX you must have docker desktop version 3.0 or later <https://github.com/concourse/concourse/issues/6038>.

+ +
+
+

Building and Running Containers for Non-Development

+
    +
  • Run Docker Compose

    +
    +
    docker compose build
    +
    +
    +

    Be Patient … If the containers build successfully, then start the containers

    +
    docker volume create --name=seed_pgdata
    +docker volume create --name=seed_media
    +docker compose up
    +
    +
    +

    Note that you may need to build the containers a couple times for everything to converge

    +
    +
  • +
  • Login to container

    +
    +

    The docker-compose file creates a default user and password. Below are the defaults but can +be overridden by setting environment variables.

    +
    username: user@seed-platform.org
    +password: super-secret-password
    +
    +
    +
    +
  • +
+
+

Note

+

Don’t forget that you need to reset your default username and password if you are going +to use these Docker images in production mode!

+
+
+
+

Using Docker for Development

+

The development environment is configured for live reloading (i.e., restart webserver when files change) +and debugging. It builds off the base docker-compose.yml, so it’s necessary +to specify the files being used in docker-compose commands as seen below.

+
+

Build

+
# create volumes for the database and media directory
+docker volume create --name=seed_pgdata
+docker volume create --name=seed_media
+
+# build the images
+docker compose -f docker-compose.yml -f docker-compose.dev.yml build
+
+
+
+
+

Running the Server

+

NOTE: the server config is sourced from config.settings.docker_dev, which will include +your local_untracked.py if it exists. If you have a local_untracked.py, make sure it doesn’t +overwrite the database or celery configuration!

+
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
+
+
+

If the server doesn’t start successfully, and docker compose logs doesn’t help, +the django development server probably failed to start due to an error in your config or code. +Unfortunately docker/django logging doesn’t appear to work when the container is first started. +Just try running the server yourself with docker exec, and see what the output is.

+

The development docker-compose file has some configurable parameters for specifying volumes to use:

+
    +
  • SEED_DB_VOLUME: the name of the docker volume to mount for postgres

  • +
  • SEED_MEDIA_VOLUME: the name of the docker volume to mount for the seed media folder

  • +
+

Docker will use environment variables from the shell or from a .env file to set these values.

+

This is useful if you want to switch between different databases for testing. +For example, if you want to create a separate volume for storing a production backup, you could do the following

+
docker volume create --name=seed_pgdata_prod
+SEED_DB_VOLUME=seed_pgdata_prod docker compose -f docker-compose.yml -f docker-compose.dev.yml up
+
+
+

NOTE: you’ll need to run docker compose down to remove the containers before you +can restart the containers connecting to different volumes.

+
+
+

Running Tests

+

While the containers are running (i.e., after running the docker compose up command), use docker exec to run tests in the web container:

+
docker exec -it seed_web ./manage.py test --settings config.settings.docker_dev
+
+
+

Add the setting --nocapture in order to see stdout while running tests. You will need to do this in order to make use of debugging as described below or the output to your debug commands will not display until after the break point has passed and the tests are finished.

+

Also worth noting: output from logging (_log.debug, etc) will not display in any situation unless a test fails.

+
+
+

Debugging

+

To use pdb on the server, the web container has remote-pdb installed. +In your code, insert the following

+
import remote_pdb; remote_pdb.set_trace()
+
+
+

Once the breakpoint is triggered, you should see the web container log something like “RemotePdb session open at 127.0.0.1:41653, waiting for connection …”. +To connect to the remote session, run netcat from inside the container (using the appropriate port).

+
docker exec -it seed_web nc 127.0.0.1:41653
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/setup_osx.html b/docs/code_documentation/3.0.0-beta.0/setup_osx.html new file mode 100644 index 00000000..7af372f9 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/setup_osx.html @@ -0,0 +1,467 @@ + + + + + + + Installation on OSX — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Installation on OSX

+

These instructions are for installing and running SEED on Mac OSX in +development mode.

+
+

Quick Installation Instructions

+

This section is intended for developers who may already have their machine +ready for general development. If this is not the case, skip to Prerequisites. Note that SEED uses python 3.

+
    +
  • install Postgres 11.1 and redis for cache and message broker

  • +
  • install PostGIS 2.5 and enable it on the database using CREATE EXTENSION postgis;

  • +
  • install TimescaleDB 1.5.0

  • +
  • use a virtualenv (if desired)

  • +
  • git clone git@github.com:seed-platform/seed.git

  • +
  • create a local_untracked.py in the config/settings folder and add CACHE and DB config (example local_untracked.py.dist)

  • +
  • to enable geocoding, get MapQuest API key and attach it to your organization

  • +
  • export DJANGO_SETTINGS_MODULE=config.settings.dev in all terminals used by SEED (celery terminal and runserver terminal)

  • +
  • +
    pip install -r requirements/local.txt
      +
    • for condas python, you way need to run this command to get pip install to succeed: conda install -c conda-forge python-crfsuite

    • +
    +
    +
    +
  • +
  • npm install

  • +
  • ./manage.py migrate

  • +
  • ./manage.py create_default_user

  • +
  • ./manage.py runserver

  • +
  • DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 4 –max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler

  • +
  • navigate to http://127.0.0.1:8000/app/#/profile/admin in your browser to add users to organizations

  • +
  • main app runs at 127.0.0.1:8000/app

  • +
+

The python manage.py create_default_user will setup a default superuser +which must be used to access the system the first time. The management command +can also create other superusers.

+
./manage.py create_default_user --username=demo@seed-platform.org --organization=lbl --password=demo123
+
+
+
+
+

Prerequisites

+

These instructions assume you have MacPorts or Homebrew. Your system +should have the following dependencies already installed:

+
    +
  • git (port install git or brew install git)

  • +
  • graphviz (brew install graphviz)

  • +
  • pyenv (Recommended)

    +
    +
    +

    Note

    +

    Although you could install Python packages globally, this is the +easiest way to install Python packages. Setting these up first will +help avoid polluting your base Python installation and make it much +easier to switch between different versions of the code.

    +
    +
    brew install pyenv
    +brew install pyenv-virtualenv
    +pyenv install <python3 version you want>
    +pyenv virtualenv <python3 version you want> seed
    +pyenv local seed
    +
    +
    +
    +
  • +
+
+
+

PostgreSQL 11.1

+

MacPorts:

+
sudo su - root
+port install postgresql94-server postgresql94 postgresql94-doc
+# init db
+mkdir -p /opt/local/var/db/postgresql94/defaultdb
+chown postgres:postgres /opt/local/var/db/postgresql94/defaultdb
+su postgres -c '/opt/local/lib/postgresql94/bin/initdb -D /opt/local/var/db/postgresql94/defaultdb'
+
+# At this point, you may want to add start/stop scripts or aliases to
+# ~/.bashrc or your virtualenv ``postactivate`` script
+# (in ``~/.virtualenvs/{env-name}/bin/postactivate``).
+
+alias pg_start='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \
+    -D /opt/local/var/db/postgresql94/defaultdb \
+    -l /opt/local/var/db/postgresql94/defaultdb/postgresql.log start"'
+alias pg_stop='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \
+    -D /opt/local/var/db/postgresql94/defaultdb stop"'
+
+pg_start
+
+sudo su - postgres
+PATH=$PATH:/opt/local/lib/postgresql94/bin/
+
+
+

Homebrew:

+
brew install postgres
+# follow the post install instructions to add to launchagents or call
+# manually with `postgres -D /usr/local/var/postgres`
+# Skip the remaining Postgres instructions!
+
+
+

Configure PostgreSQL. Replace ‘seeddb’, ‘seeduser’ with desired db/user. By +default use password seedpass when prompted. Use the code block below in development only since +the seeduser is a SUPERUSER.

+
createuser -P seeduser
+createdb `whoami`
+psql -c 'CREATE DATABASE "seeddb" WITH OWNER = "seeduser";'
+psql -c 'GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO seeduser;'
+psql -c 'ALTER ROLE seeduser SUPERUSER;'
+
+
+
+
+

PostGIS 2.5

+

MacPorts:

+
# Assuming you're still root from installing PostgreSQL,
+port install postgis2
+
+
+

Homebrew:

+
brew install postgis
+
+
+

Configure PostGIS:

+
psql -d seeddb -c "CREATE EXTENSION postgis;"
+
+# For testing, give seed user superuser access:
+# psql -c 'ALTER USER seeduser CREATEDB;'
+
+
+

If upgrading from an existing database or existing local_untracked.py file, make sure to add the +MapQuest API Key and set the database engine to ‘ENGINE’: ‘django.contrib.gis.db.backends.postgis’.

+

Now exit any root environments, becoming just yourself (even though it’s not +that easy being green), for the remainder of these instructions.

+
+
+

TimescaleDB 1.5.0

+

Note, as of version 1.5.0, dumping and restoring databases requires that both the source and target +database have the same version of TimescaleDB.

+

Downloading From Source:

+
# Note: Installing from source should only be done
+# if you have a Postgres installation not maintained by Homebrew.
+# This installation requires C compiler (e.g., gcc or clang) and CMake version 3.4 or greater.
+
+git clone https://github.com/timescale/timescaledb.git
+cd timescaledb
+git checkout 1.5.0
+
+# Bootstrap the build system
+./bootstrap
+
+# If OpenSSL can't be found by cmake - run the following instead
+# ./bootstrap -DOPENSSL_ROOT_DIR=<location of OpenSSL> # e.g., -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl
+
+# To build the extension
+cd build && make
+
+# To install
+make install
+
+# Find postgresql.conf
+# Then uncomment the shared_preload_libraries line changing it to the following
+# shared_preload_libraries = 'timescaledb'
+psql -d postgres -c "SHOW config_file;"
+
+# Restart PostgreSQL instance
+
+
+
+
+

Python Packages

+

Run these commands as your normal user id.

+

Change to a virtualenv (using virtualenvwrapper) or do the following as a +superuser. A virtualenv is usually better for development. Set the virtualenv +to seed.

+
workon seed
+
+
+

Make sure PostgreSQL command line scripts are in your PATH (if using MacPorts)

+
export PATH=$PATH:/opt/local/lib/postgresql94/bin
+
+
+

Some packages (uWSGI) may need to find your C compiler. Make sure you have +‘gcc’ on your system, and then also export this to the CC environment +variable:

+
export CC=gcc
+
+
+

Install requirements with pip

+
pip install -r requirements/local.txt
+
+
+
+
+

NodeJS/npm

+

Install npm. You can do this by installing from nodejs.org, MacPorts, or +Homebrew:

+

MacPorts:

+
sudo port install npm
+
+
+

Homebrew:

+
brew install npm
+
+
+
+
+

Configure Django and Databases

+

In the config/settings directory, there must be a file called +local_untracked.py that sets up databases and a number of other things. +To create and edit this file, start by copying over the template

+
cd config/settings
+cp local_untracked.py.dist local_untracked.py
+
+
+

Edit local_untracked.py. Open the file you created in your favorite editor. The PostgreSQL config section will look something like this:

+
# postgres DB config
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.contrib.gis.db.backends.postgis',
+        'NAME': 'seeddb',
+        'USER': 'seeduser',
+        'PASSWORD': 'seedpass',
+        'HOST': 'localhost',
+        'PORT': '5432',
+    }
+}
+
+
+

You may want to comment out the AWS settings.

+

For Redis, edit the CACHES and CELERY_BROKER_URL values to look like this:

+
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+
+
+
+

MapQuest API Key

+

Register for a MapQuest API key: +https://developer.mapquest.com/plan_purchase/steps/business_edition/business_edition_free/register

+

Visit the Manage Keys page: +https://developer.mapquest.com/user/me/apps +Either create a new key or use the key initially provided. +Copy the “Consumer Key” into the target organizations MapQuest API Key field under the organization’s settings page or directly within the DB.

+
+
+

Run Django Migrations

+

Change back to the root of the repository. Now run the migration script to set +up the database tables

+
export DJANGO_SETTINGS_MODULE=config.settings.dev
+./manage.py migrate
+
+
+
+
+

Django Admin User

+

You need a Django admin (super) user.

+
./manage.py create_default_user --username=admin@my.org --organization=seedorg --password=badpass
+
+
+

Of course, you need to save this user/password somewhere, since this is what +you will use to login to the SEED website.

+

If you want to do any API testing (and of course you do!), you will need to +add an API KEY for this user. You can do this in postgresql directly:

+
psql seeddb seeduser
+seeddb=> update landing_seeduser set api_key='DEADBEEF' where id=1;
+
+
+

The ‘secret’ key DEADBEEF is hard-coded into the test scripts.

+
+
+

Install Redis

+

You need to manually install Redis for Celery to work.

+

MacPorts:

+
sudo port install redis
+
+
+

Homebrew:

+
brew install redis
+# follow the post install instructions to add to launchagents or
+# call manually with `redis-server`
+
+
+
+
+

Install JavaScript Dependencies

+

The JS dependencies are installed using node.js package management (npm).

+
npm install
+
+
+
+
+

Start the Server

+

You should put the following statement in ~/.bashrc or add it to the +virtualenv post-activation script (e.g., in +~/.virtualenvs/seed/bin/postactivate).

+
export DJANGO_SETTINGS_MODULE=config.settings.dev
+
+
+

The combination of Redis, Celery, and Django have been encapsulated in a +single shell script, which examines existing processes and does not start +duplicate instances:

+
./bin/start-seed.sh
+
+
+

When this script is done, the Django stand-alone server will be running in +the foreground.

+
+
+

Login

+

Open your browser and navigate to http://127.0.0.1:8000

+

Login with the user/password you created before, e.g., admin@my.org and +badpass.

+
+

Note

+

these steps have been combined into a script called start-seed.sh. +The script will also not start Celery or Redis if they already seem +to be running.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0-beta.0/translation.html b/docs/code_documentation/3.0.0-beta.0/translation.html new file mode 100644 index 00000000..694037f2 --- /dev/null +++ b/docs/code_documentation/3.0.0-beta.0/translation.html @@ -0,0 +1,218 @@ + + + + + + + Translating SEED — SEED Platform 3.0.0-beta.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Translating SEED

+
    +
  1. Update translations on lokalise.

  2. +
  3. Copy lokalise.yml.example to lokalise.yml. Update API token.

  4. +
  5. Install lokalise locally

    +
    brew tap lokalise/cli-2
    +brew install lokalise2
    +
    +
    +
  6. +
+
    +
  1. Run scripts if you have Lokalise CLI installed. If not, see scripts for manual steps.

    +
    script/get_python_translations.sh
    +script/get_angular_translations.sh
    +
    +
    +
  2. +
  3. Uncomment the useMissingTranslationHandlerLog line seed.js to log untranslated strings to the console for review

  4. +
  5. Verify and commit changes

  6. +
+

Note: The lokalize website is the canonical source of data. If you +change the locale files locally, then you need to push them to +lokalize.

+

TL;DR

+

SEED is localized for more than just English, so a little more care is +needed as we add new UI. All translatable strings are held in either +per-language .json files (for Angular-controlled strings, which are +the majority), or .mo files (for strings supplied by Django).

+

At render time, SEED will sniff out the browser’s Accept: header. +Based on that, we choose the right file. The language files themselves +are key->value mappings from a translation “key” to a translated value. +Either Angular or Django will then swap that value into the DOM wherever +it sees the key. If no translation is available, the key remains in the +DOM. (There are some wrinkles with HTML styling and pluralization that +we’ll review below).

+

So, the basic flow on top of any new UI features is now:

+
    +
  1. Tag any user-visible strings in the UI as “translatable.” There are +currently 12 (!) ways in which to do this; see below.

  2. +
  3. Create the translation key at lokalise. We’re using lokalise +because it can smooth over differences in the file formats that +Angular and Django require, and is a nice tool for managing the +process of getting translations done by a native speaker: we can put +up screenshots to clarify how the translated phrase is used, track +translation progress, etc.

  4. +
  5. Get a translation done. As a placeholder, lokalise can provide an +auto-filled translation from Google Translate or a few other +services, but it’s fairly straightforward to order a professional +translation through lokalise.

  6. +
  7. Pull new translation files into the right places in the source tree +and commit them. There are scripts under /scripts to make this +mostly automatic.

  8. +
  9. Visually check that the containing UI looks OK with the translated +string(s). Some languages (e.g., French, German) can be wordy relative +to English and cause UI elements like buttons to expand oddly. Adjust +the layout or adjust the translation as needed.

  10. +
+
+

General philosophies / style

+
+

Don’t go crazy with indirection and interpolation

+

It’s probably better to err on the side of too many keys than to get +clever with interpolation or Angular expressions to avoid +near-duplicates of keys. The aim should be that there is at least one +place where a competent translator can see the whole string at once.

+

Compare:

+
<h2>{$:: inventory_type == 'taxlots' ?
+      translations['INCLUDE_SHARED_TAXLOTS'] :
+      translations['INCLUDE_SHARED']
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/.buildinfo b/docs/code_documentation/3.0.0/.buildinfo new file mode 100644 index 00000000..5ed669aa --- /dev/null +++ b/docs/code_documentation/3.0.0/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: ebb2f8a3783b61fb564a1c9fb923b4b5 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/code_documentation/3.0.0/.doctrees/api.doctree b/docs/code_documentation/3.0.0/.doctrees/api.doctree new file mode 100644 index 00000000..572883d8 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/api.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/aws.doctree b/docs/code_documentation/3.0.0/.doctrees/aws.doctree new file mode 100644 index 00000000..df526559 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/aws.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/data_model.doctree b/docs/code_documentation/3.0.0/.doctrees/data_model.doctree new file mode 100644 index 00000000..130d53ca Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/data_model.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/data_quality.doctree b/docs/code_documentation/3.0.0/.doctrees/data_quality.doctree new file mode 100644 index 00000000..19e84b77 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/data_quality.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/deployment.doctree b/docs/code_documentation/3.0.0/.doctrees/deployment.doctree new file mode 100644 index 00000000..1022e318 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/deployment.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/developer_resources.doctree b/docs/code_documentation/3.0.0/.doctrees/developer_resources.doctree new file mode 100644 index 00000000..cf98e977 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/developer_resources.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/docker.doctree b/docs/code_documentation/3.0.0/.doctrees/docker.doctree new file mode 100644 index 00000000..0bdbc528 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/docker.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/environment.pickle b/docs/code_documentation/3.0.0/.doctrees/environment.pickle new file mode 100644 index 00000000..3c11923d Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/environment.pickle differ diff --git a/docs/code_documentation/3.0.0/.doctrees/faq.doctree b/docs/code_documentation/3.0.0/.doctrees/faq.doctree new file mode 100644 index 00000000..7f064dd8 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/faq.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/getting_started.doctree b/docs/code_documentation/3.0.0/.doctrees/getting_started.doctree new file mode 100644 index 00000000..1da9e919 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/getting_started.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/help.doctree b/docs/code_documentation/3.0.0/.doctrees/help.doctree new file mode 100644 index 00000000..ad88a505 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/help.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/index.doctree b/docs/code_documentation/3.0.0/.doctrees/index.doctree new file mode 100644 index 00000000..f2608346 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/index.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/kubernetes_deployment.doctree b/docs/code_documentation/3.0.0/.doctrees/kubernetes_deployment.doctree new file mode 100644 index 00000000..df2c5c02 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/kubernetes_deployment.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/license.doctree b/docs/code_documentation/3.0.0/.doctrees/license.doctree new file mode 100644 index 00000000..4d3a65b9 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/license.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/linux.doctree b/docs/code_documentation/3.0.0/.doctrees/linux.doctree new file mode 100644 index 00000000..b7ae5c4f Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/linux.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/mapping.doctree b/docs/code_documentation/3.0.0/.doctrees/mapping.doctree new file mode 100644 index 00000000..b224d875 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/mapping.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/matching.doctree b/docs/code_documentation/3.0.0/.doctrees/matching.doctree new file mode 100644 index 00000000..7d078ee3 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/matching.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/migrations.doctree b/docs/code_documentation/3.0.0/.doctrees/migrations.doctree new file mode 100644 index 00000000..410a2555 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/migrations.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules.doctree b/docs/code_documentation/3.0.0/.doctrees/modules.doctree new file mode 100644 index 00000000..d41b263e Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/config.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/config.doctree new file mode 100644 index 00000000..8993b747 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/config.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.cleansing.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.cleansing.doctree new file mode 100644 index 00000000..6d146c2c Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.cleansing.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.data.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.data.doctree new file mode 100644 index 00000000..a39e4aab Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.data.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.data_importer.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.data_importer.doctree new file mode 100644 index 00000000..14c92983 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.data_importer.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.doctree new file mode 100644 index 00000000..6fd2ce84 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.features.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.features.doctree new file mode 100644 index 00000000..48e0fb6c Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.features.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.landing.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.landing.doctree new file mode 100644 index 00000000..6296c553 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.landing.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.landing.management.commands.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.landing.management.commands.doctree new file mode 100644 index 00000000..fceaf89c Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.landing.management.commands.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.landing.management.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.landing.management.doctree new file mode 100644 index 00000000..9036aa6a Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.landing.management.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.lib.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.lib.doctree new file mode 100644 index 00000000..d8f0ab5d Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.lib.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.lib.mappings.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.lib.mappings.doctree new file mode 100644 index 00000000..23770ef3 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.lib.mappings.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.lib.merging.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.lib.merging.doctree new file mode 100644 index 00000000..b0aa834b Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.lib.merging.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.management.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.management.doctree new file mode 100644 index 00000000..b0cd06a6 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.management.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.managers.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.managers.doctree new file mode 100644 index 00000000..02c82493 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.managers.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.managers.tests.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.managers.tests.doctree new file mode 100644 index 00000000..387f3d6d Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.managers.tests.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.mappings.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.mappings.doctree new file mode 100644 index 00000000..fc03c342 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.mappings.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.models.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.models.doctree new file mode 100644 index 00000000..ad759e78 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.models.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.public.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.public.doctree new file mode 100644 index 00000000..4b72a5dc Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.public.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.serializers.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.serializers.doctree new file mode 100644 index 00000000..820cb828 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.serializers.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.templatetags.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.templatetags.doctree new file mode 100644 index 00000000..b131b844 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.templatetags.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.test_helpers.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.test_helpers.doctree new file mode 100644 index 00000000..dbf7d6ad Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.test_helpers.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.test_helpers.factory.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.test_helpers.factory.doctree new file mode 100644 index 00000000..be581475 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.test_helpers.factory.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.test_helpers.factory.lib.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.test_helpers.factory.lib.doctree new file mode 100644 index 00000000..53e13ff9 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.test_helpers.factory.lib.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.tests.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.tests.doctree new file mode 100644 index 00000000..fc322fad Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.tests.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.tests.functional.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.tests.functional.doctree new file mode 100644 index 00000000..8728c0e9 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.tests.functional.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.urls.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.urls.doctree new file mode 100644 index 00000000..d75717df Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.urls.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.utils.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.utils.doctree new file mode 100644 index 00000000..5dae040e Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.utils.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/modules/seed.views.doctree b/docs/code_documentation/3.0.0/.doctrees/modules/seed.views.doctree new file mode 100644 index 00000000..a565b63d Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/modules/seed.views.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/postgres_upgrade.doctree b/docs/code_documentation/3.0.0/.doctrees/postgres_upgrade.doctree new file mode 100644 index 00000000..5f3f4dbc Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/postgres_upgrade.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/setup_docker.doctree b/docs/code_documentation/3.0.0/.doctrees/setup_docker.doctree new file mode 100644 index 00000000..4935b5d9 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/setup_docker.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/setup_osx.doctree b/docs/code_documentation/3.0.0/.doctrees/setup_osx.doctree new file mode 100644 index 00000000..54f00403 Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/setup_osx.doctree differ diff --git a/docs/code_documentation/3.0.0/.doctrees/translation.doctree b/docs/code_documentation/3.0.0/.doctrees/translation.doctree new file mode 100644 index 00000000..8b7c03ad Binary files /dev/null and b/docs/code_documentation/3.0.0/.doctrees/translation.doctree differ diff --git a/docs/code_documentation/3.0.0/_images/case-a.webp b/docs/code_documentation/3.0.0/_images/case-a.webp new file mode 100644 index 00000000..aa4e81d6 Binary files /dev/null and b/docs/code_documentation/3.0.0/_images/case-a.webp differ diff --git a/docs/code_documentation/3.0.0/_images/case-b.webp b/docs/code_documentation/3.0.0/_images/case-b.webp new file mode 100644 index 00000000..93b6ee0b Binary files /dev/null and b/docs/code_documentation/3.0.0/_images/case-b.webp differ diff --git a/docs/code_documentation/3.0.0/_images/case-c.webp b/docs/code_documentation/3.0.0/_images/case-c.webp new file mode 100644 index 00000000..180a613c Binary files /dev/null and b/docs/code_documentation/3.0.0/_images/case-c.webp differ diff --git a/docs/code_documentation/3.0.0/_images/case-d.webp b/docs/code_documentation/3.0.0/_images/case-d.webp new file mode 100644 index 00000000..72213abd Binary files /dev/null and b/docs/code_documentation/3.0.0/_images/case-d.webp differ diff --git a/docs/code_documentation/3.0.0/_images/data-model.webp b/docs/code_documentation/3.0.0/_images/data-model.webp new file mode 100644 index 00000000..3471d8cf Binary files /dev/null and b/docs/code_documentation/3.0.0/_images/data-model.webp differ diff --git a/docs/code_documentation/3.0.0/_sources/api.rst.txt b/docs/code_documentation/3.0.0/_sources/api.rst.txt new file mode 100644 index 00000000..5cfde4e2 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/api.rst.txt @@ -0,0 +1,68 @@ +API +=== + +Authentication +-------------- +Authentication is handled via an encoded authorization token set in a HTTP header. +To request an API token, go to ``/app/#/profile/developer`` and click 'Get a New API Key'. + +Authenticate every API request with your username (email, all lowercase) and the API key via `Basic Auth`_. +The header is sent in the form of ``Authorization: Basic ``, where credentials is the base64 encoding of the email and key joined by a single colon ``:``. + +.. _Basic Auth: https://en.wikipedia.org/wiki/Basic_access_authentication + +Using Python, use the requests library:: + + import requests + + result = requests.get('https://seed-platform.org/api/version/', auth=(user_email, api_key)) + print result.json() + +Using curl, pass the username and API key as follows:: + + curl -u user_email:api_key http://seed-platform.org/api/version/ + +If authentication fails, the response's status code will be 302, redirecting the user to ``/app/login``. + +Payloads +-------- + +Many requests require a JSON-encoded payload and parameters in the query string of the url. A frequent +requirement is including the organization_id of the org you belong to. For example:: + + curl -u user_email:api_key https://seed-platform.org/api/v2/organizations/12/ + +Or in a JSON payload:: + + curl -u user_email:api_key \ + -d '{"organization_id":6, "role": "viewer"}' \ + https://seed-platform.org/api/v2/users/12/update_role/ + +Using Python:: + + params = {'organization_id': 6, 'role': 'viewer'} + result = requests.post('https://seed-platform.org/api/v2/users/12/update_role/', + data=json.dumps(params), + auth=(user_email, api_key)) + print result.json() + +Responses +--------- + +Responses from all requests will be JSON-encoded objects, as specified in each endpoint's documentation. +In the case of an error, most endpoints will return this instead of the expected payload (or an HTTP status code):: + + { + "status": "error", + "message": "explanation of the error here" + } + +API Endpoints +------------- + +A list of interactive endpoints are available by accessing the API menu item on the left navigation +pane within you account on your SEED instance. + +To view a list of non-interactive endpoints without an account, view swagger_ on the development server. + +.. _swagger: https://seed-platform.org/api/swagger/ diff --git a/docs/code_documentation/3.0.0/_sources/aws.rst.txt b/docs/code_documentation/3.0.0/_sources/aws.rst.txt new file mode 100644 index 00000000..eccace1f --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/aws.rst.txt @@ -0,0 +1,183 @@ +========= +AWS Setup +========= + +Amazon Web Services (`AWS`_) provides the preferred hosting for the SEED Platform. + +**seed** is a `Django Project`_ and Django's documentation is an excellent place for general +understanding of this project's layout. + +.. _Django Project: https://www.djangoproject.com/ + +.. _AWS: http://aws.amazon.com/ + +Prerequisites +^^^^^^^^^^^^^ + +Ubuntu server 18.04 LTS + +.. note:: These instructions have not been updated for Ubuntu 18.04. It is recommended to use Docker-based deployments. + +.. code-block:: console + + sudo apt-get update + sudo apt-get upgrade + sudo apt-get install -y libpq-dev python-dev python-pip libatlas-base-dev \ + gfortran build-essential g++ npm libxml2-dev libxslt1-dev git mercurial \ + libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python + + +PostgreSQL and Redis are not included in the above commands. For a quick installation on AWS it +is okay to install PostgreSQL and Redis locally on the AWS instance. If a more permanent and +scalable solution, it is recommended to use AWS's hosted Redis (ElastiCache) and PostgreSQL service. + +.. note:: postgresql ``>=9.4`` is required to support `JSON Type`_ + +.. code-block:: console + + # To install PostgreSQL and Redis locally + sudo apt-get install redis-server + sudo apt-get install postgresql postgresql-contrib + +.. _`JSON Type`: https://www.postgresql.org/docs/9.4/datatype-json.html + +Amazon Web Services (AWS) Dependencies +++++++++++++++++++++++++++++++++++++++ + +The following AWS services can be used for **SEED** but are not required: + +* RDS (PostgreSQL >=9.4) +* ElastiCache (redis) +* SES + + +Python Dependencies +^^^^^^^^^^^^^^^^^^^ + +Clone the **SEED** repository from **github** + +.. code-block:: console + + $ git clone git@github.com:SEED-platform/seed.git + +enter the repo and install the python dependencies from `requirements`_ + +.. _requirements: https://github.com/SEED-platform/seed/blob/main/requirements/aws.txt + +.. code-block:: console + + $ cd seed + $ sudo pip install -r requirements/aws.txt + + +JavaScript Dependencies +^^^^^^^^^^^^^^^^^^^^^^^ + +``npm`` is required to install the JS dependencies. + +.. code-block:: console + + $ sudo apt-get install build-essential + $ sudo apt-get install curl + + +.. code-block:: console + + $ npm install + + +Database Configuration +^^^^^^^^^^^^^^^^^^^^^^ + +Copy the ``local_untracked.py.dist`` file in the ``config/settings`` directory to +``config/settings/local_untracked.py``, and add a ``DATABASES`` configuration with your database username, +password, host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database +instance you have manually installed within your infrastructure. + +.. code-block:: python + + # Database + DATABASES = { + 'default': { + 'ENGINE':'django.db.backends.postgresql_psycopg2', + 'NAME': 'seed', + 'USER': '', + 'PASSWORD': '', + 'HOST': '', + 'PORT': '', + } + } + + +.. note:: + + In the above database configuration, ``seed`` is the database name, this + is arbitrary and any valid name can be used as long as the database exists. + +create the database within the postgres ``psql`` shell: + +.. code-block:: psql + + CREATE DATABASE seed; + +or from the command line: + +.. code-block:: console + + createdb seed + + +create the database tables and migrations: + +.. code-block:: console + + python manage.py syncdb + python manage.py migrate + + +create a superuser to access the system + +.. code-block:: console + + $ python manage.py create_default_user --username=demo@example.com --organization=example --password=demo123 + + +.. note:: + + Every user must be tied to an organization, visit ``/app/#/profile/admin`` + as the superuser to create parent organizations and add users to them. + +Cache and Message Broker +^^^^^^^^^^^^^^^^^^^^^^^^ + +The SEED project relies on `redis`_ for both cache and message brokering, and +is available as an AWS `ElastiCache`_ service. +``local_untracked.py`` should be updated with the ``CACHES`` and ``CELERY_BROKER_URL`` +settings. + +.. _ElastiCache: https://aws.amazon.com/elasticache/ + +.. _redis: http://redis.io/ + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://seed-core-cache.ntmprk.0001.usw2.cache.amazonaws.com:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + +Running Celery the Background Task Worker +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +`Celery`_ is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, ``celery`` +can be started: + +.. code-block:: console + + celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler + +.. _Celery: http://www.celeryproject.org/ diff --git a/docs/code_documentation/3.0.0/_sources/data_model.rst.txt b/docs/code_documentation/3.0.0/_sources/data_model.rst.txt new file mode 100644 index 00000000..15650406 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/data_model.rst.txt @@ -0,0 +1,415 @@ +Data Model +========== + +.. image:: images/case-a.webp + +.. image:: images/case-b.webp + +.. image:: images/case-c.webp + +.. image:: images/case-d.webp + +.. image:: images/data-model.webp + + +.. todo:: Documentation below is out of state and needs updated. + +Our primary data model is based on a tree structure with BuildingSnapshot +instances as nodes of the tree and the tip of the tree referenced by a +CanonicalBuilding. + +Take the following example: a user has loaded a CSV file containing information +about one building and created the first BuildingSnapshot (BS0). At this point +in time, BS0 is linked to the first CanonicalBuilding (CB0), and CB0 is also +linked to BS0. + +.. code-block:: shell + + BS0 <-- CB0 + BS0 --> CB0 + +These relations are represented in the database as foreign keys from the +BuildingSnapshot table to the CanonicalBuilding table, and from the +CanonicalBuilding table to the BuildingSnapshot table. + +The tree structure comes to fruition when a building, BS0 in our case, is +matched with a new building, say BS1, enters the system and is auto-matched. + +Here BS1 entered the system and was matched with BS0. When a match occurs, +a new BuildingSnapshot is created, BS2, with the fields from the existing +BuildingSnapshot, BS0, and the new BuildingSnapshot, BS1, merged +together. If both the existing and new BuildingSnapshot have data for a +given field, the new record's fields are preferred and merged into the child, B3. + +The fields from new snapshot are preferred because that is the newer of the +two records from the perspective of the system. By preferring the most recent fields +this allows for evolving building snapshots over time. For example, if an existing +canonical record has a Site EUI value of 75 and some changes happen to a building +that cause this to change to 80 the user can submit a new record with that change. + +All BuildingSnapshot instances point to a CanonicalBuilding. + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 <-- CB0 + + BS0 --> CB0 + BS1 --> CB0 + BS2 --> CB0 + + +parents and children +^^^^^^^^^^^^^^^^^^^^ + +BuildingSnapshots also have linkage to other BuildingSnapshots in order to +keep track of their *parents* and *children*. This is represented in the +Django model as a many-to-many relation from BuildingSnapshot to BuildingSnapshot. +It is represented in the PostgreSQL database as an additional seed_buildingsnapshot_children +table. + + +In our case here, BS0 and BS1 would both have *children* BS2, and BS2 would +have *parents* BS0 and BS1. + +.. note:: + + throughout most of the application, the ``search_buildings`` endpoint + is used to search or list active building. This is to say, buildings that + are pointed to by an active CanonicalBuilding. + The ``search_mapping_results`` endpoint allows the search of buildings + regardless of whether the BuildingSnapshot is pointed to by an active + CanonicalBuilding or not and this search is needed during the mapping + preview and matching sections of the application. + + + +For illustration purposes let's suppose BS2 and a new building BS3 match to form a child BS4. + ++--------+-------+ +| parent | child | ++========+=======+ +| BS0 | BS2 | ++--------+-------+ +| BS1 | BS2 | ++--------+-------+ +| BS2 | BS4 | ++--------+-------+ +| BS3 | BS4 | ++--------+-------+ + + +And the corresponding tree would look like: + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 BS3 + \ / + BS4 <-- CB0 + + BS0 --> CB0 + BS1 --> CB0 + BS2 --> CB0 + BS3 --> CB0 + BS4 --> CB0 + +matching +-------- + +During the auto-matching process, if a *raw* BuildingSnapshot matches an +existing BuildingSnapshot instance, then it will point to the existing +BuildingSnapshot instance's CanonicalBuilding. In the case where there is no +existing BuildingSnapshot to match, a new CanonicalBuilding will be created, as +happened to B0 and C0 above. + ++-------+--------+--------+-------------+ +| field | BS0 | BS1 | BS2 (child) | ++=======+========+========+=============+ +| id1 | **11** | 11 | 11 | ++-------+--------+--------+-------------+ +| id2 | | **12** | 12 | ++-------+--------+--------+-------------+ +| id3 | **13** | | 13 | ++-------+--------+--------+-------------+ +| id4 | 14 | **15** | 15 | ++-------+--------+--------+-------------+ + + +manual-matching vs auto-matching +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Since BuildingSnapshots can be manually matched, there is the possibility for +two BuildingSnapshots each with an active CanonicalBuilding to match and the +system has to choose to move only one CanonicalBuilding to the tip of the tree +for the primary BuildingSnapshot and *deactivate* the secondary +BuildingSnapshot's CanonicalBuilding. + +Take for example: + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 BS3 + \ / + BS4 <-- CB0 (active: True) BS5 <-- CB1 (active: True) + +If a user decides to manually match BS4 and BS5, the system will take the +primary BuildingSnapshot's CanonicalBuilding and have it point to their +child and deactivate CB1. The deactivation is handled by setting a field +on the CanonicalBuilding instance, *active*, from ``True`` to ``False``. + +Here is what the tree would look like after the manual match of **BS4** and +**BS5**: + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 BS3 + \ / + BS4 BS5 <-- CB1 (active: False) + \ / + BS6 <-- CB0 (active: True) + +Even though BS5 is pointed to by a CanonicalBuilding, CB1, BS5 will not be +returned by the normal ``search_buildings`` endpoint because the +CanonicalBuilding pointing to it has its field ``active`` set to ``False``. + +.. note:: + anytime a match is **unmatched** the system will create a new + CanonicalBuilding or set an existing CanonicalBuilding's active field to + ``True`` for any leaf BuildingSnapshot trees. + +what really happens to the BuildingSnapshot table on import (and when) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The above is conceptually what happens but sometimes the devil is in the details. +Here is what happens to the BuildingSnapshot table in the database when records +are imported. + +Every time a record is added at least two BuildingSnapshot records are created. + +Consider the following simple record: + ++-------------+-------------+---------------------+-----------+--------------+ +| Property Id | Year Ending | Property Floor Area | Address 1 | Release Date | ++=============+=============+=====================+===========+==============+ +| 499045 | 2000 | 1234 | 1 fake st | 12/12/2000 | ++-------------+-------------+---------------------+-----------+--------------+ + +The first thing the user is upload the file. When the user sees the +"Successful Upload!" dialog one record has been added to the +BuildingSnapshot table. + +This new record has an id (73700 in this case) and a created and +modified timestamp. Then there are a lot of empty fields and a +source_type of 0. Then there is the extra_data column which contains +the contents of the record in key-value form: + +:Address 1: "1 fake st" +:Property Id: "499045" +:Year Ending: "2000" +:Release Date: "12/12/2000" +:Property Floor Area: "1234" + +And a corresponding extra_data_sources that looks like + +:Address 1: 73700 +:Property Id: 73700 +:Year Ending: 73700 +:Release Date: 73700 +:Property Floor Area: 73700 + + +All of the fields that look like _source_id are also populated +with 73700 E.G. owner_postal_code_source_id. + +The other fields of interest are the organization field which +is populated with the user's default organization and the import_file_id +field which is populated with a reference to a data_importer_importfile record. + +At this point the record has been created before the user hits the +"Continue to data mapping" button. + +The second record (id = 73701) is created by the time the user gets to the screen +with the "Save Mappings" button. This second record has the following fields populated: + +- id +- created +- modified +- pm_property_id +- year_ending +- gross_floor_area +- address_line_1 +- release_date +- source_type (this is 2 instead of 0 as with the other record) +- import_file_id +- organization_id. + +That is all. All other fields are empty. In this case that is all that happens. + +Now consider the same user uploading a new file from the next year that looks like + ++-------------+-------------+---------------------+-----------+--------------+ +| Property Id | Year Ending | Property Floor Area | Address 1 | Release Date | ++=============+=============+=====================+===========+==============+ +| 499045 | 2000 | 1234 | 1 fake st | 12/12/2001 | ++-------------+-------------+---------------------+-----------+--------------+ + +As before one new record is created on upload. This has id 73702 and follows the same +pattern as 73700. And similarly 73703 is created like 73701 before the "Save Mappings" +button appears. + +However this time the system was able to make a match with an existing record. +After the user clicks the "Confirm mappings & start matching" button a new record +is created with ID 73704. + +73704 is identical to 73703 (in terms of contents of the BuildingSnapshot table only) +with the following exceptions: + +- created and modified timestamps are different +- match type is populated and has a value of 1 +- confidence is populated and has a value of .9 +- source_type is 4 instead of 2 +- canonical_building_id is populated with a value +- import_file_id is NULL +- last_modified_by_id is populated with value 2 (This is a key into the landing_seeduser table) +- address_line_1_source_id is 73701 +- gross_floor_area_source_id is populated with value 73701 +- pm_property_id_source_id is populated with 73701 +- release_date_source_id is populated with 73701 +- year_ending_source_id is populated with 73701 + +what really happens to the CanonicalBuilding table on import (and when) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In addition to the BuildingSnapshot table the CanonicalBuilding table is also updated +during the import process. To summarize the above 5 records were created in the +BuildingSnapshot table: + +1. 73700 is created from the raw 2000 data +2. 73701 is the mapped 2000 data, +3. 73702 is created from the raw 2001 data +4. 73703 is the mapped 2001 data +5. 73704 is the result of merging the 2000 and 2001 data. + +In this process CanonicalBuilding is updated twice. First when the 2000 record is imported the +CanonicalBuilding gets populated with one new row at the end of the matching step. +I.E. when the user sees the "Load More Data" screen. At this point there is a new row that looks like + ++--------+--------+-----------------------+ +| id | active | canonical_building_id | ++========+========+=======================+ +| 20505 | TRUE | 73701 | ++--------+--------+-----------------------+ + +At this point there is one new canonical building and that is the BuildingSnapshot with +id 73701. Next the user uploads the 2001 data. When the "Matching Results" screen +appears the CanonicalBuilding table has been updated. Now it looks like + ++--------+--------+-----------------------+ +| id | active | canonical_building_id | ++========+========+=======================+ +| 20505 | TRUE | 73704 | ++--------+--------+-----------------------+ + +There is still only one canonical building but now it is the BuildingSnapshot record +that is the result of merging the 2000 and 2001 data: id = 73704. + +organization +^^^^^^^^^^^^ + +BuildingSnapshots belong to an Organization field that is a foreign key into the organization +model (orgs_organization in Postgres). + +Many endpoints filter the buildings based on the organizations the requesting user +belongs to. E.G. get_buildings changes which fields are returned based on the +requesting user's membership in the BuildingSnapshot's organization. + +\*_source_id fields +^^^^^^^^^^^^^^^^^^^ + +Any field in the BuildingSnapshot table that is populated with data from a +submitted record will have a corresponding _source_id field. E.G +pm_property_id has pm_property_id_source_id, +address_line_1 has address_line_1_source_id, +etc... + +These are foreign keys into the BuildingSnapshot that is the source of that +value. To extend the above table + ++-------+--------+--------+-------------+------------------------+ +| field | BS0 | BS1 | BS2 (child) | BS2 (child) _source_id | ++=======+========+========+=============+========================+ +| id1 | **11** | | 11 | BS0 | ++-------+--------+--------+-------------+------------------------+ +| id2 | | **12** | 12 | BS1 | ++-------+--------+--------+-------------+------------------------+ + +**NOTE:** The BuildingSnapshot records made from the raw input file have all the +_source_id fields populated with that record's ID. The non-canonical BuildingSnapshot +records created from the mapped data have none set. The canonical BuildingSnapshot +records that are the result of merging two records have only the _source_id fields +set where the record itself has data. E.G. in the above address_line_1 is set to +"1 fake st." so there is a value in the canonical BuildingSnapshot's address_line_1_source_id +field. However there is no block number so block_number_source_id is empty. This +is unlike the two raw BuildingSnapshot records who also have no block_number but +nevertheless have a block_number_source_id populated. + +extra_data +^^^^^^^^^^ + +The BuildingSnapshot model has many "named" fields. Fields like "address_line_1", +"year_built", and "pm_property_id". However the users are allowed to submit files +with arbitrary fields. Some of those arbitrary fields can be mapped to "named" +fields. E.G. "Street Address" can usually be mapped to "Address Line 1". +For all the fields that cannot be mapped like that there is the extra_data field. + +extra_data is Django json field that serves as key-value storage for other +user-submitted fields. As with the other "named" fields there is a corresponding +extra_data_sources field that serves the same role as the other _source_id fields. +E.G. If a BuildingSnapshot has an extra_data field that looks like + +:an_unknown_field: 1 +:something_else: 2 + +It should have an extra_data_sources field that looks like + +:an_unknown_field: some_BuildingSnapshot_id +:something_else: another_BuildingSnapshot_id + +saving and possible data loss +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When saving a Property file some fields that are truncated if too long. +The following are truncated to 255 characters + +- jurisdiction_tax_lot_id +- pm_property_id +- custom_id_1 +- ubid +- lot_number +- block_number +- district +- owner +- owner_email +- owner_telephone +- owner_address +- owner_city_state +- owner_postal_code + +And the following are truncated to 255: + +- property_name +- address_line_1 +- address_line_2 +- city +- postal_code +- state_province +- building_certification + +No truncation happens to any of the fields stored in extra_data. diff --git a/docs/code_documentation/3.0.0/_sources/data_quality.rst.txt b/docs/code_documentation/3.0.0/_sources/data_quality.rst.txt new file mode 100644 index 00000000..49e06799 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/data_quality.rst.txt @@ -0,0 +1,9 @@ +Data Quality +============ + +Data quality checks are run after the data are paired, during import of Properties/TaxLots, or on-demand by selecting rows in the inventory +page and clicking the action button. This checks whether any default or user-defined Rules are broken or satisfied by Property/TaxLot records. + +Notably, in most cases when data quality checks are run, Labels can be applied for any broken Rules that have a Label. +To elaborate, Rules can have an attached Label. When a data quality check is run, records that break one of these "Labeled Rules" +are then given that Label. The case where this Label attachment does not happen is during import due to performance reasons. diff --git a/docs/code_documentation/3.0.0/_sources/deployment.rst.txt b/docs/code_documentation/3.0.0/_sources/deployment.rst.txt new file mode 100644 index 00000000..e2e3d347 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/deployment.rst.txt @@ -0,0 +1,57 @@ +Deployment Guide +================ + +SEED is intended to be installed on Linux instances in the cloud (e.g., AWS), and on local hardware. SEED Platform does not officially support Windows for production deployment. If this is desired, see the Django `notes`_. + +.. _notes: https://docs.djangoproject.com/en/1.7/howto/windows/ + +.. toctree:: + :maxdepth: 2 + + aws + linux + docker + kubernetes_deployment + +Migrations +---------- + +Migrations are handles through Django; however, various versions have customs actions for the migrations. See the :doc:`migrations page ` for more information. + + +Monitoring +---------- + +Sentry +^^^^^^ + +Sentry can monitor your webservers for any issues. To enable sentry add the following to +your local_untracked.py files after setting up your Sentry account on sentry.io. + +The RAVEN_CONFIG is used for the backend and the SENTRY_JS_DSN is used for the frontend. At the moment, +it is recommended to setup two sentry projects, one for backend and one for frontend. + +.. code-block:: python + + import sentry_sdk + from sentry_sdk.integrations.django import DjangoIntegration + from sentry_sdk.integrations.celery import CeleryIntegration + + sentry_sdk.init( + dsn="https://@.ingest.sentry.io/", + integrations=[ + DjangoIntegration(), + CeleryIntegration(), + ], + + # Set traces_sample_rate to 1.0 to capture 100% + # of transactions for performance monitoring. + # We recommend adjusting this value in production. + traces_sample_rate=1.0, + + # If you wish to associate users to errors (assuming you are using + # django.contrib.auth) you may enable sending PII data. + send_default_pii=True + ) + + SENTRY_JS_DSN = 'https://@sentry.io/' diff --git a/docs/code_documentation/3.0.0/_sources/developer_resources.rst.txt b/docs/code_documentation/3.0.0/_sources/developer_resources.rst.txt new file mode 100644 index 00000000..62b565ad --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/developer_resources.rst.txt @@ -0,0 +1,450 @@ +Developer Resources +=================== + +.. toctree:: + migrations + translation + +General Notes +------------- + +Pre-commit +^^^^^^^^^^ +We use precommit commits for formatting. Set it up locally with + +.. code-block:: bash + + pre-commit install + +Ruff Settings +^^^^^^^^^^^^^^ + +Ruff is used to statically verify code syntax. To run ruff locally call: + +.. code-block:: bash + + tox -e precommit -- ruff + tox -e precommit -- ruff-format + +Python Type Hints +^^^^^^^^^^^^^^^^^ + +Python type hints are beginning to be added to the SEED codebase. The benefits are +eliminating some accidental typing mistakes to prevent bugs as well as a better IDE +experience. + +Usage +***** + +SEED does not require exhaustive type annotations, but it is recommended you add them if you +create any new functions or refactor any existing code where it might be beneficial (e.g. types +that appear ambiguous or that the IDE can't determine) and not require a ton of additional effort. + +When applicable, we recommend you use `built-in collection types `_ +such as :code:`list`, :code:`dict` or :code:`tuple` instead of the capitalized types +from the :code:`typing` module. You can also use ``TypedDict`` and ``NotRequired`` from the ``typing_extensions`` +package to specify the types of required/optional keys of dictionaries. + +Common gotchas: + +- If trying to annotate a class method with the class itself, import :code:`from __future__ import annotations` +- If you're getting warnings about runtime errors due to a type name, make sure your IDE is set up to point to an environment with python 3.9 +- If you're wasting time trying to please the type checker, feel free to throw :code:`# type: ignore` on the problematic line (or at the top of the file to ignore all issues for that file) + +Type Checking +************* + +CI currently runs static type checking on the codebase using `mypy `_. For +your own IDE, we recommend the following extensions: + +- VSCode: `Pylance `_ (uses Microsoft's Pyright type checking) + +To run the same typechecking applied in CI (i.e., using mypy) you can run the following + +.. code-block:: bash + + tox -e mypy + + +Django Notes +------------ + +Adding New Fields to Database +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Adding new fields to SEED can be complicated since SEED has a mix of typed fields (database fields) and extra data +fields. Follow the steps below to add new fields to the SEED database: + +#. Add the field to the PropertyState or the TaxLotState model. Adding fields to the Property or TaxLot models is more complicated and not documented yet. +#. Add field to list in the following locations: + +- models/columns.py: Column.DATABASE_COLUMNS +- TaxLotState.coparent or PropertyState.coparent: SQL query and keep_fields + +#. Run `./manage.py makemigrations` +#. Add in a Python script in the new migration to add in the new column into every organizations list of columns. Note that the new_db_fields will be the same as the data in the Column.DATABASE_COLUMNS that were added. + + .. code-block:: python + + def forwards(apps, schema_editor): + Column = apps.get_model("seed", "Column") + Organization = apps.get_model("orgs", "Organization") + + new_db_fields = [ + { + 'column_name': 'geocoding_confidence', + 'table_name': 'PropertyState', + 'display_name': 'Geocoding Confidence', + 'column_description': 'Geocoding Confidence', + 'data_type': 'number', + }, { + 'column_name': 'geocoding_confidence', + 'table_name': 'TaxLotState', + 'display_name': 'Geocoding Confidence', + 'column_description': 'Geocoding Confidence', + 'data_type': 'number', + } + ] + + # Go through all the organizations + for org in Organization.objects.all(): + for new_db_field in new_db_fields: + columns = Column.objects.filter( + organization_id=org.id, + table_name=new_db_field['table_name'], + column_name=new_db_field['column_name'], + is_extra_data=False, + ) + + if not columns.count(): + new_db_field['organization_id'] = org.id + Column.objects.create(**new_db_field) + elif columns.count() == 1: + # If the column exists, then update the display_name and data_type if empty + c = columns.first() + if c.display_name is None or c.display_name == '': + c.display_name = new_db_field['display_name'] + if c.data_type is None or c.data_type == '' or c.data_type == 'None': + c.data_type = new_db_field['data_type'] + for col in columns: + # If the column exists, then update the column_description if empty + if c.column_description is None or c.column_description == '': + c.column_description = new_db_field['column_description'] + c.save() + else: + print(" More than one column returned") + + + class Migration(migrations.Migration): + dependencies = [ + ('seed', '0090_auto_20180425_1154'), + ] + + operations = [ + ... existing db migrations ..., + migrations.RunPython(forwards), + ] + + +#. Run migrations `./manage.py migrate` +#. Run unit tests, fix failures. Below is a list of files that need to be fixed (this is not an exhaustive list) + +- test_mapping_data.py:test_keys +- test_columns.py:test_column_retrieve_schema +- test_columns.py:test_column_retrieve_db_fields + +#. (Optional) Update example files to include new fields +#. Test import workflow with mapping to new fields + + +NGINX Notes +----------- + +Toggle *maintenance mode* to display a maintenance page and prevent access to all site resources including API endpoints: + +.. code-block:: bash + + docker exec seed_web ./docker/maintenance.sh on + docker exec seed_web ./docker/maintenance.sh off + + +AngularJS Integration Notes +--------------------------- + +Template Tags +^^^^^^^^^^^^^ + +Angular and Django both use `{{` and `}}` as variable delimiters, and thus the AngularJS variable delimiters are +renamed `{$` and `$}`. + +.. code-block:: JavaScript + + window.BE.apps.seed = angular.module('BE.seed', ['$interpolateProvider', ($interpolateProvider) => { + $interpolateProvider.startSymbol('{$'); + $interpolateProvider.endSymbol('$}'); + }]); + +Django CSRF Token and AJAX Requests +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For ease of making angular `$http` requests, we automatically add the CSRF token to all `$http` requests as +recommended by http://django-angular.readthedocs.io/en/latest/integration.html#xmlhttprequest + +.. code-block:: JavaScript + + window.BE.apps.seed.run(($http, $cookies) => { + $http.defaults.headers.common['X-CSRFToken'] = $cookies['csrftoken']; + }); + + +Routes and Partials or Views +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Routes in `static/seed/js/seed.js` (the normal angularjs `app.js`) + + +.. code-block:: JavaScript + + SEED_app.config(['stateHelperProvider', '$urlRouterProvider', '$locationProvider', (stateHelperProvider, $urlRouterProvider, $locationProvider) => { + stateHelperProvider + .state({ + name: 'home', + url: '/', + templateUrl: static_url + 'seed/partials/home.html' + }) + .state({ + name: 'profile', + url: '/profile', + templateUrl: static_url + 'seed/partials/profile.html', + controller: 'profile_controller', + resolve: { + auth_payload: ['auth_service', '$q', 'user_service', function (auth_service, $q, user_service) { + var organization_id = user_service.get_organization().id; + return auth_service.is_authorized(organization_id, ['requires_superuser']); + }], + user_profile_payload: ['user_service', function (user_service) { + return user_service.get_user_profile(); + }] + } + }); + }]); + +HTML partials in `static/seed/partials/` + +Logging +------- + +Information about error logging can be found here - https://docs.djangoproject.com/en/1.7/topics/logging/ + +Below is a standard set of error messages from Django. + +A logger is configured to have a log level. This log level describes the severity of +the messages that the logger will handle. Python defines the following log levels: + +.. code-block:: bash + + DEBUG: Low level system information for debugging purposes + INFO: General system information + WARNING: Information describing a minor problem that has occurred. + ERROR: Information describing a major problem that has occurred. + CRITICAL: Information describing a critical problem that has occurred. + +Each message that is written to the logger is a Log Record. The log record is stored +in the web server & Celery + + +BEDES Compliance and Managing Columns +------------------------------------- + +Columns that do not represent hardcoded fields in the application are represented using +a Django database model defined in the seed.models module. The goal of adding new columns +to the database is to create seed.models.Column records in the database for each column to +import. Currently, the list of Columns is dynamically populated by importing data. + +There are default mappings for ESPM are located here: + + https://github.com/SEED-platform/seed/blob/develop/seed/lib/mappings/data/pm-mapping.json + + +Resetting the Database +---------------------- + +This is a brief description of how to drop and re-create the database +for the seed application. + +The first two commands below are commands distributed with the +Postgres database, and are not part of the SEED application. The third +command below will create the required database tables for SEED and +setup initial data that the application expects (e.g. initial columns for +BEDES). The last command below (spanning multiple lines) will create a +new superuser and organization that you can use to login to the +application, and from there create any other users or organizations +that you require. + +Below are the commands for resetting the database and creating a new +user: + +.. code-block:: bash + + createuser -U seed seeduser + + psql -d postgres -U seeduser -c 'DROP DATABASE seed;' + psql -d postgres -U seeduser -c 'CREATE DATABASE seed;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;' + + ./manage.py migrate + ./manage.py create_default_user \ + --username=demo@seed-platform.org \ + --password=password \ + --organization=testorg + +Restoring a Database Dump +------------------------- + +.. code-block:: bash + + psql -d postgres -U seeduser -c 'DROP DATABASE seed;' + psql -d postgres -U seeduser -c 'CREATE DATABASE seed;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;' + psql -d seed -U seeduser -c 'SELECT timescaledb_pre_restore();' + + # restore a previous database dump (must be pg_restore 12+) + pg_restore -d seed -U seeduser /backups/prod-backups/prod_20191203_000002.dump + # if any errors appear during the pg_restore process check that the `installed_version` of the timescaledb extension where the database was dumped matches the extension version where it's being restored + # `SELECT default_version, installed_version FROM pg_available_extensions WHERE name = 'timescaledb';` + + psql -d seed -U seeduser -c 'SELECT timescaledb_post_restore();' + + ./manage.py migrate + + # if needed add a user to the database + ./manage.py create_default_user \ + --username=demo@seed-platform.org \ + --password=password \ + --organization=testorg + +If restoring a production backup to a different deployment update the site settings for password reset emails, and disable celerybeat Salesforce updates/emails: + +.. code-block:: bash + + ./manage.py shell + + from django.contrib.sites.models import Site + site = Site.objects.first() + site.domain = 'dev1.seed-platform.org' + site.name = 'SEED Dev1' + site.save() + + from seed.models import Organization + Organization.objects.filter(salesforce_enabled=True).update(salesforce_enabled=False) + + from django_celery_beat.models import PeriodicTask, PeriodicTasks + PeriodicTask.objects.filter(enabled=True, name__startswith='salesforce_sync_org-').update(enabled=False) + PeriodicTasks.update_changed() + + +Migrating the Database +---------------------- + +Migrations are handles through Django; however, various versions have customs actions for the migrations. See the :doc:`migrations page ` for more information based on the version of SEED. + + +Testing +------- + +JS tests can be run with Jasmine at the url `/angular_js_tests/`. + +Python unit tests are run with + +.. code-block:: bash + + python manage.py test --settings=config.settings.test + +Note on geocode-related testing: + Most of these tests use VCR.py and cassettes to capture and reuse recordings of HTTP requests and responses. Given that, unless you want to make changes and/or refresh the cassettes/recordings, there isn't anything needed to run the geocode tests. + + In the case that the geocoding logic/code is changed or you'd like to the verify the MapQuest API is still working as expected, you'll need to run the tests with a small change. Namely, you'll want to provide the tests with an API key via an environment variable called "TESTING_MAPQUEST_API_KEY" or within your local_untracked.py file with that same variable name. + + In order to refresh the actual cassettes, you'll just need to delete or move the old ones which can be found at ".seed/tests/data/vcr_cassettes". The API key should be hidden within the cassettes, so these new cassettes can and should be pushed to GitHub. + +Run coverage using + +.. code-block:: bash + + coverage run manage.py test --settings=config.settings.test + coverage report --fail-under=83 + +Python compliance uses Ruff + +.. code-block:: bash + + tox -e precommit -- ruff + tox -e precommit -- ruff-format + +JavaScript compliance uses ESLint, SCSS compliance uses StyleLint, and HTML compliance uses Prettier + +.. code-block:: bash + + npm run lint + npm run lint:fix + +Building Documentation +---------------------- + +Older versions of the source code documentation are (still) on readthedocs; however, newer versions are built and pushed to the seed-website repository manually. To build the documentation follow the script below: + +.. code-block:: bash + + cd docs + rm -rf htmlout + sphinx-build -b html source htmlout + +For releasing, copy the ``htmlout`` directory into the seed-platform's website repository under ``docs/code_documentation/``. Make sure to add the new documentation to the table in the ``docs/developer_resources.md``. + +Contribution Instructions / Best Practices +------------------------------------------ + +If this is the first time contributing and you are outside of the DOE National Lab system, then you will need to review and fill out the contribution agreement which is found in `SEED's Contribution Agreement in the GitHub repository`_ + +The desired workflow for development and submitting changes is the following: + +#. Fork the repository on GitHub if you do not have access to the repository, otherwise, work within the https://github.com/seed-platform/seed repository. +#. Ensure there is a ticket/issue created for the work you are doing. Verify that the ticket is assigned to you and that it is part of the latest project board on the GitHub site (https://github.com/orgs/SEED-platform/projects). +#. Move the ticket/issue to 'In Progress' in the GitHub project tracker when you begin work +#. Create a branch off of develop (unless it is a hotfix, then branch of the appropriate tag). The recommended naming convention is -short-descriptive-name. +#. Make changes and write a test for the code added. +#. Make sure tests pass locally. Most branches created and pushed to GitHub will be tested automatically. +#. Upon completion of the work, create a pull request (PR) against the develop branch (or hotfix branch if applicable). In the PR description fill out the requested information and include the issue number (e.g., #1234). +#. Assign one label to the PR (not the ticket/issue) in order to auto-populate change logs (e.g., Bug, Feature, Maintenance, Performance, DoNotPublish) This is required and CI will fail if not present. + * **Bug** (these will appear as "Bug Fixes" in the change log) + * **Feature** (features will appear as “New Features” item in the change log) + * **Enhancement** (these will appear as “Improvements" in the change log) + * **Maintenance** (these will appear under “Maintenance" in the change log) + * **Performance** (these will appear under “Maintenance" in the change log) + * **Documentation** (these will appear under “Maintenance" in the change log) + * **Do not publish** (these will no appear in the change log) +#. Ensure all tests pass. +#. Assign a reviewer to the PR. +#. If the reviewer requests changes, then addresses changes and re-assign the reviewer as needed. +#. Once approved, merge the PR! +#. Move the related ticket(s)/issue(s) to the 'Ready to Deploy' column in the GitHub project tracker. + +Release Instructions +-------------------- + +To make a release do the following: + +#. Create a branch from develop to prepare the updates (e.g., 2.21.0-release-prep). +#. Update the root ``package.json`` file with the release version number, and then run ``npm install``. Always use MAJOR.MINOR.RELEASE. +#. Update the ``docs/sources/migrations.rst`` file with any required actions. +#. Commit the changes and push the release prep branch to GitHub, then go to the Releases page to draft a new release which will generate the changelog. +#. Copy the GitHub changelog results into ``CHANGELOG.md``. Cleanup the formatting and items as needed (make sure the spelling is correct, starts with a capital letter, if any PRs were missing the ``Do not publish`` label, etc.) and push the changelog update. +#. Make sure that any new UI needing localization has been tagged for translation, and that any new translation keys exist in the lokalise.com project. (see :doc:`translation documentation `). +#. Create PR for release preparation and merge after tests/reviews pass. +#. Create a new Release using the develop branch and new release number as the tag (https://github.com/SEED-platform/seed/releases). Include list of changes since previous release (e.g., the additions to ``CHANGELOG.md``). +#. Locally, merge the ``develop`` branch into the ``main`` branch and push. +#. Verify that the Docker versions are built and pushed to Docker Hub (https://hub.docker.com/r/seedplatform/seed/tags/). +#. Publish the new documentation in the seed-platform website repository (see instructions above under Building Documentation). + +.. _`SEED's Contribution Agreement in the GitHub repository`: https://github.com/SEED-platform/seed/blob/develop/.github/CONTRIBUTING.md diff --git a/docs/code_documentation/3.0.0/_sources/docker.rst.txt b/docs/code_documentation/3.0.0/_sources/docker.rst.txt new file mode 100644 index 00000000..a0208c34 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/docker.rst.txt @@ -0,0 +1,128 @@ +======================== +Docker Deployment on AWS +======================== + +Amazon Web Services (`AWS`_) provides the preferred hosting for the SEED Platform. + +**seed** is a `Django Project`_ and Django's documentation is an excellent place for general +understanding of this project's layout. + +.. _Django Project: https://www.djangoproject.com/ + +.. _AWS: http://aws.amazon.com/ + +Installation +^^^^^^^^^^^^ + +Ubuntu server 18.04 or newer with a m5ad.xlarge (if using in Production instance) + +* After launching the instance, run the following commands to install docker. + +.. code-block:: console + + # Install any upgrades + sudo apt-get update + sudo apt-get upgrade -y + + # Remove any old docker engines + sudo apt-get remove docker docker-engine docker.io containerd runc + + # Install docker community edition + sudo apt-get update + sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + sudo add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) \ + stable" + + sudo apt-get update + sudo apt-get install -y docker-ce docker-ce-cli containerd.io + # Add your user to the docker group + sudo groupadd docker + sudo usermod -aG docker $USER + newgrp docker + +.. note:: It is okay if the first command fails + +* Verify that the DNS is working correctly. Run the following and verify the response lists IPs (v6 most likely) + +.. code-block:: console + + # verify that the dns resolves + docker run --rm seedplatform/seed getent hosts seed-platform.org + # or + docker run --rm tutum/dnsutils nslookup email.us-west-2.amazonaws.com + +* Install Docker compose + +.. code-block:: console + + sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose + +* Checkout SEED (or install from the releases). + +.. code-block:: console + + git clone + +* Add in the Server setting into profile.d. For example add the content below (appropriately filled out) into /etc/profile.d/seed.sh + +.. code-block:: console + + export POSTGRES_USER=seed + export POSTGRES_DB=seed + export POSTGRES_PASSWORD=GDEus3fasd1askj89QkAldjfX + export POSTGRES_PORT=5432 + export SECRET_KEY="96=7jg%_&1-z9c9qwwu2@w$hb3r322yf3lz@*ekw-1@ly-%+^" + + # The admin user is only valid only until the database is restored + export SEED_ADMIN_USER=user@seed-platform.org + export SEED_ADMIN_PASSWORD="7FeBWal38*&k3jlfa92lakj8ih4" + export SEED_ADMIN_ORG=default + + # For SES + export AWS_ACCESS_KEY_ID= + export AWS_SECRET_ACCESS_KEY= + export AWS_SES_REGION_NAME=us-west-2 + export AWS_SES_REGION_ENDPOINT=email.us-west-2.amazonaws.com + export SERVER_EMAIL=user@seed-platform.org + + +* Before launching the first time, make sure the persistent volumes and the backup directory exist. + +.. code-block:: console + + docker volume create --name=seed_pgdata + docker volume create --name=seed_media + + mkdir -p $HOME/seed-backups + +.. note:: Make sure to have the seed-backups in your path, otherwise the db-postgres container will not launch. + +* Launch the project + +.. code-block:: console + + cd + ./deploy.sh + + +Deploying with Docker +^^^^^^^^^^^^^^^^^^^^^ + +The preferred way to deploy with Docker is using docker swarm and docker stack. +Look at the `deploy.sh script`_ for implementation details. + +The short version is to simply run the command below. Note that the passing of the docker-compose.yml filename is not required if using docker-compose.local.yml. + +```bash +./deploy.sh docker-compose.local.yml +``` + +If deploying using a custom docker-compose yml file, then simple replace the name in the command above. + + +.. _`deploy.sh script`: https://github.com/SEED-platform/seed/blob/develop/deploy.sh +.. _`JSON Type`: https://www.postgresql.org/docs/9.4/datatype-json.html diff --git a/docs/code_documentation/3.0.0/_sources/faq.rst.txt b/docs/code_documentation/3.0.0/_sources/faq.rst.txt new file mode 100644 index 00000000..8c3231be --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/faq.rst.txt @@ -0,0 +1,68 @@ +Frequently Asked Questions +########################## + +Here are some frequently asked questions and/or issues. + +.. contents:: + :local: + :depth: 2 + + + +Questions +========= +.. _whatisseed: + +What is the SEED Platform? +-------------------------- + +The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity. + +The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL. + +The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions. + +Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy. + + +Issues +====== + +.. _domain: + +Why is the domain set to example.com? +------------------------------------- + +If you see example.com in the emails that are sent from your hosted version of SEED then you will +need to update your django sites object in the database. + +.. code-block:: bash + + $ ./manage.py shell + + from django.contrib.sites.models import Site + one = Site.objects.all()[0] + one.domain = 'newdomain.org' + one.name = 'SEED' + one.save() + + +.. _staticfiles: + +Why aren't the static assets being served correctly? +---------------------------------------------------- + +Make sure that your local_untracked.py file does not have STATICFILES_STORAGE set to anything. If so, +then comment out that section and redeploy/recollect/compress your static assets. diff --git a/docs/code_documentation/3.0.0/_sources/getting_started.rst.txt b/docs/code_documentation/3.0.0/_sources/getting_started.rst.txt new file mode 100644 index 00000000..d0ae9497 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/getting_started.rst.txt @@ -0,0 +1,11 @@ +Getting Started +=============== + +Development Setup +----------------- + +.. toctree:: + :maxdepth: 2 + + setup_osx + setup_docker diff --git a/docs/code_documentation/3.0.0/_sources/help.rst.txt b/docs/code_documentation/3.0.0/_sources/help.rst.txt new file mode 100644 index 00000000..add7485b --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/help.rst.txt @@ -0,0 +1,28 @@ +Help +==== + +For SEED Platform Users +^^^^^^^^^^^^^^^^^^^^^^^ + +Please visit our website for information, tutorials, and documentation to help you learn how to use SEED. + +https://seed-platform.org + +The SEED Users Forum is where you can review user announcements, workflow questions, and join to connect with other users. + +https://lists.buildingenergytools.org/g/SEEDusers/topics + +For general inquiries or help on a specific problem, please fill out a request on the building data tools website help desk and select SEED as the relevant tool: + +https://buildingdata.energy.gov/#/help-desk + +For SEED Platform Developers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The open-source code is available on the GitHub organization SEED-Platform and contains various repositories for the different components of the platform such as the main SEED application, a Python SEED client to communicate to SEED's API and various example datasets. + +https://github.com/SEED-platform + +The SEED Developers Forum contains various topics and joining enables you to connect with other developers. It is recommended to join this forum to submit developer questions, features requests, and report issues as needed. Also, submitting issues on GitHub is encouraged. + +https://lists.buildingenergytools.org/g/SEEDdevelopers/topics diff --git a/docs/code_documentation/3.0.0/_sources/index.rst.txt b/docs/code_documentation/3.0.0/_sources/index.rst.txt new file mode 100644 index 00000000..68ea4f7e --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/index.rst.txt @@ -0,0 +1,51 @@ +.. SEED Platform documentation master file, created by + sphinx-quickstart on Tue Mar 1 14:43:22 2016. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Standard Energy Efficiency Data (SEED) Platform +=============================================== + +The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity. + +The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL. + +The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions. + +Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy. + + +.. toctree:: + :maxdepth: 2 + + getting_started + deployment + api + data_model + data_quality + mapping + matching + modules + developer_resources + license + help + faq + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/code_documentation/3.0.0/_sources/kubernetes_deployment.rst.txt b/docs/code_documentation/3.0.0/_sources/kubernetes_deployment.rst.txt new file mode 100644 index 00000000..3f70fdc1 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/kubernetes_deployment.rst.txt @@ -0,0 +1,251 @@ +Kubernetes Deployment Guide with Helm +===================================== + +Kubernetes is a robust container orchestration system for easy application deployment and management. Helm takes that a step further with by packaging up required helm "charts" into one deployment command. + +Setup +----- + +Cluster +^^^^^^^ +In order to deploy the SEED platform on a Kubernetes you will need "cluster" which will be configured by your cloud service of choice. Each installation will be slightly different depending on the service. +Below are links to quick-start guides for provisioning a cluster and connecting. These instructions are specifically for AWS, but after the Kubernetes cluster is launched, the helm commands can be used in +the same way. + +* Amazon Web Services (`AWS`_) +* Google Cloud Platform (`GCP`_) +* Azure (`AKS`_) + +AWS CLI Configuration +~~~~~~~~~~~~~~~~~~~~~ +Download and configure the AWS CLI with instructions: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html + +.. code-block:: console + + aws configure + AWS Access Key ID [None]: (from account) + AWS Secret Access Key [None]: (from account) + Default region name [None]: us-east-1 + Default output format [None]: json + +Kubectl +^^^^^^^ +Download and install Kubectl: + +- `Windows `_ +- Mac (with Homebrew) :code:`brew install kubectl` + ``` + brew install kubectl + ``` + +Kubectl is the main function in which you will be interfacing with your deployed application on your cluster. This CLI is what connects you to your cluster that you have just provisioned. +If your cloud service did not have you configure kubectl in your cluster setup, you can download it `here `_. Once kubectl is installed and configured to your cluster +you can run some simple commands to ensure its working properly: + +.. code-block:: console + + #View the cluster + kubectl cluster-info + + #View pods, services and replicasets (will be empty until deploying an app) + kubectl get all + +All of the common kubectl commands can be found in these `docs `_ + +.. note:: For those unfamiliar with CLIs, there are a number of GUI applications that are able to deploy on your stack with ease. One of which is Kubernetes native application called `Dashboard UI`_ or a third-party application called Octant :code:`brew install octant`. + +Helm +^^^^ +Helm organizes all of your Kubernetes deployment, service, and volume yml files into "charts" that can be deployed, managed, and published with simple commands. +To install Helm: + +* `Windows eksctl `_ +* Mac (with Homebrew) :code:`brew install helm` + +EKS Control (AWS Specific) +^^^^^^^^^^^^^^^^^^^^^^^^^^ +EKSCtl is a command line tool to manage Elastic Kubernetes clusters on AWS. If not using AWS, then disregard this section. + +* `Windows eksctl config `_ +* Mac (with Homebrew) :code:`brew install eksctl` + +To launch a cluster on using EKSCts, run the following command in the terminal (assuming adequate permissions for the user). Also make sure to replace items in the `<>` brackets. + +.. code-block:: yaml + + eksctl create cluster \ + --name \ + --version 1.21 \ + --region us-east-1 \ + --node-type m5.large \ + --nodes 1 \ + --nodes-min 1 \ + --nodes-max 1 \ + --managed \ + --tags environment= + +Charts +^^^^^^ +SEED stores its charts in the `charts directory`_ of the Github Repo. There are two main charts that are deployed when starting SEED on Kubernetes. + +* persistentvolumes - these are the volumes to store SEED media data and SEED Postgres data +* seed - this stores all of the other deployment and service files for the application + +Unlike persistentvolumes, the seed charts must be modified with user environment variables that will be forwarded to the docker container for deployment. +Before deployment, the user **MUST** set these variables to their desired values. + +web-deployment.yaml +******************* +This chart contains the deployment specification for the SEED web container. Replace all the values in <>. + +.. code-block:: yaml + + # Environment variables for the web container + - env: + # AWS Email service variables to send emails to new users - can be removed if not using this functionality. + - name: AWS_ACCESS_KEY_ID + value: + - name: AWS_SECRET_ACCESS_KEY + value: + - name: AWS_SES_REGION_NAME + value: us-west-2 + - name: AWS_SES_REGION_ENDPOINT + value: email.us-west-2.amazonaws.com + - name: SERVER_EMAIL + value: info@seed-platform.org + # Django Variables + - name: DJANGO_SETTINGS_MODULE + value: config.settings.docker + - name: SECRET_KEY + value: + - name: SEED_ADMIN_ORG + value: default + - name: SEED_ADMIN_PASSWORD + value: + - name: SEED_ADMIN_USER + value: + # Postgres variables + - name: POSTGRES_DB + value: seed + - name: POSTGRES_PASSWORD + value: # must match db-postgres-deployment.yaml and web-celery-deployment.yaml + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_USER + value: seeduser + # Bsyncr analysis variables + - name: BSYNCR_SERVER_PORT + value: "5000" + - name: BSYNCR_SERVER_HOST + value: bsyncr + # Sentry monitoring - remove if not applicable + - name: SENTRY_JS_DSN + value: + - name: SENTRY_RAVEN_DSN + value: + # Google self registration security - remove if not applicable + - name: GOOGLE_RECAPTCHA_SITE_KEY + value: + - name: GOOGLE_RECAPTCHA_SECRET_KEY + value: + image: seedplatform/seed: + #versions can be found here https://github.com/SEED-platform/seed/releases/tag/v2.9.3 + +web-celery-deployment.yaml +************************** +This chart contains the deployment specification for the Celery container to connect to Postgres. Replace the Postgres password to match web-deployment. + +.. code-block:: yaml + + - name: POSTGRES_PASSWORD + value: # must match db-postgres-deployment.yaml and web-celery-deployment.yaml + +bsyncr-deployment.yaml +********************** +This chart contains the deployment specification for the bsyncr analysis server. Request a NOAA token from `this website `_. + +.. code-block:: yaml + + - name: NOAA_TOKEN + value: + +Deployment +---------- +Once you are connected to your cluster and have your settings configured with the environment variables of you choice in the charts, you are ready to deploy the app. +First, make sure that the correct context is selected which is needed if there is more than one cluster: + +.. code-block:: bash + + kubectl config get-contexts + kubectl config use-context + +Deploy the site using the helm commands in the root of the charts directory. + +* :code:`helm install --generate-name persistentvolumes` +* :code:`helm install --generate-name seed` + +You will be able to see SEED coming online with statuses like container creating, and running with: + +* :code:`kubectl get all` + +Once all of the pods are running you will be able to hit the external ingress through the URL listed in the web service information. It should look something like + +.. code-block:: bash + + service/web LoadBalancer 10.100.154.227 80:32291/TCP + +Managing Existing Clusters +-------------------------- + +Upgrade/Redeploy the Helm Stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To upgrade or dedeploy a helm chart, first find the helm release that you want to upgrade, then run the upgrade with the selected chart. + +.. code-block:: bash + + helm list + helm upgrade ./seed + +Managing the Kubernetes Cluster (AWS Specific) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Enable kubectl to talk to one of the created clusters by running the following command in the terminal after configuring the AWS credentials and cli. + +.. code-block:: bash + + aws eks --region update-kubeconfig --name + +Logging In +^^^^^^^^^^ +After a successful deployment in order to login you will need to create yourself as a user in the web container. To do this, we will exec into the container and run some Django commands. +* View all deployments and services, :code:`kubectl get all` +* :code:`kubectl get pods` +* :code:`kubectl exec -it -- bash` + +Now that we are in the container, we can make a user. +.. code-block:: bash + + ./manage.py create_default_user --username=admin@my.org --organization=seedorg --password=badpass + +You can now use these credentials to log in to the SEED website. + +Update web and web-celery +^^^^^^^^^^^^^^^^^^^^^^^^^ +The command below will restart the pods and re-pull the docker images. + +.. code-block:: bash + + kubectl rollout restart deployment web && kubectl rollout restart deployment web-celery + + +Other Resources +--------------- +Common kubectl actions can be found `on the kubernetes website `_ + + +.. _AWS: https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html +.. _GCP: https://cloud.google.com/kubernetes-engine/docs/quickstart +.. _AKS: https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough#connect-to-the-cluster + +.. _Dashboard UI: https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/ + +.. _charts directory: https://github.com/SEED-platform/seed/tree/develop/charts diff --git a/docs/code_documentation/3.0.0/_sources/license.rst.txt b/docs/code_documentation/3.0.0/_sources/license.rst.txt new file mode 100644 index 00000000..f29b1ce4 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/license.rst.txt @@ -0,0 +1,5 @@ +============== +License +============== + +.. include:: ../../LICENSE.md diff --git a/docs/code_documentation/3.0.0/_sources/linux.rst.txt b/docs/code_documentation/3.0.0/_sources/linux.rst.txt new file mode 100644 index 00000000..d5b97dc1 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/linux.rst.txt @@ -0,0 +1,331 @@ +General Linux Setup +=================== + +While Amazon Web Services (`AWS`_) provides the preferred hosting for SEED, +running on a bare-bones Linux server follows a similar setup, replacing the +AWS services with their Linux package counterparts, namely: PostgreSQL and +Redis. + +**SEED** is a `Django project`_ and Django's documentation +is an excellent place to general understanding of this project's layout. + +.. _Django project: https://www.djangoproject.com/ + +.. _AWS: http://aws.amazon.com/ + +Prerequisites +^^^^^^^^^^^^^^ + +Ubuntu server/desktop 16.04 or newer (18.04 recommended) + +Install the following base packages to run SEED: + +.. code-block:: console + + sudo add-apt-repository ppa:timescale/timescaledb-ppa + sudo apt update + sudo apt upgrade + sudo apt install libpq-dev python3-dev python3-pip libatlas-base-dev \ + gfortran build-essential nodejs npm libxml2-dev libxslt1-dev git \ + libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python mercurial + sudo apt install gdal-bin postgis + sudo apt install redis-server + sudo apt install timescaledb-postgresql-10 postgresql-contrib + +.. note:: postgresql ``>=9.3`` is required to support `JSON Type`_ + +.. _JSON Type: http://www.postgresql.org/docs/9.3/static/datatype-json.html + +Configure PostgreSQL +^^^^^^^^^^^^^^^^^^^^ + +Replace 'seeddb', 'seeduser' with desired db/user. By +default use password `seedpass` when prompted + +.. code-block:: console + + $ sudo timescaledb-tune + $ sudo service postgresql restart + $ sudo su - postgres + $ createuser -P "seeduser" + $ createdb "seeddb" --owner="seeduser" + $ psql + postgres=# GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO "seeduser"; + postgres=# ALTER USER "seeduser" CREATEDB CREATEROLE SUPERUSER; + postgres=# \q + $ exit + + +Python Dependencies +^^^^^^^^^^^^^^^^^^^ + +clone the **seed** repository from **github** + +.. code-block:: console + + $ git clone git@github.com:SEED-platform/seed.git + +enter the repo and install the python dependencies from `requirements`_ + +.. _requirements: https://github.com/SEED-platform/seed/blob/main/requirements/local.txt + +.. code-block:: console + + $ cd seed + $ pip3 install -r requirements/local.txt + + +JavaScript Dependencies +^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: console + + $ npm install + + +Django Database Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Copy the ``local_untracked.py.dist`` file in the ``config/settings`` directory to +``config/settings/local_untracked.py``, and add a ``DATABASES`` configuration with your database username, password, +host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database instance +you have manually installed within your infrastructure. + +.. code-block:: python + + # Database + DATABASES = { + 'default': { + 'ENGINE': 'django.contrib.gis.db.backends.postgis', + 'NAME': 'seeddb', + 'USER': 'seeduser', + 'PASSWORD': '', + 'HOST': 'localhost', + 'PORT': '5432', + } + } + + +.. note:: + + Other databases could be used such as MySQL, but are not supported + due to the postgres-specific `JSON Type`_ + +In in the above database configuration, ``seed`` is the database name, this is arbitrary and any valid name can be +used as long as the database exists. Enter the database name, user, password you set above. + +The database settings can be tested using the Django management command, ``python3 manage.py dbshell`` to connect to the +configured database. + +create the database tables and migrations: + +.. code-block:: console + + $ python3 manage.py migrate + +Cache and Message Broker +^^^^^^^^^^^^^^^^^^^^^^^^ + +The SEED project relies on `redis`_ for both cache and message brokering, and +is available as an AWS `ElastiCache`_ service or with the ``redis-server`` +Linux package. (``sudo apt install redis-server``) + +``local_untracked.py`` should be updated with the ``CACHES`` and ``CELERY_BROKER_URL`` +settings. + +.. _ElastiCache: https://aws.amazon.com/elasticache/ + +.. _redis: http://redis.io/ + + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + + +Creating the initial user +^^^^^^^^^^^^^^^^^^^^^^^^^ + +create a superuser to access the system + +.. code-block:: console + + $ python3 manage.py create_default_user --username=admin@my.org --organization=lbnl --password=badpass + + +.. note:: + + Of course, you need to save this user/password somewhere, since this is what + you will use to login to the SEED website. + + Every user must be tied to an organization, visit ``/app/#/profile/admin`` + as the superuser to create parent organizations and add users to them. + + + +Running celery the background task worker +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +`Celery`_ is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, ``celery`` +can be started: + +.. code-block:: console + + DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler + +.. _Celery: http://www.celeryproject.org/ + + +Running the development web server +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The Django dev server (not for production use) can be a quick and easy way to +get an instance up and running. The dev server runs by default on port 8000 +and can be run on any port. See Django's `runserver documentation`_ for more +options. + +.. _runserver documentation: https://docs.djangoproject.com/en/1.6/ref/django-admin/#django-admin-runserver + +.. code-block:: console + + $ python3 manage.py runserver --settings=config.settings.dev + + +Running a production web server +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Our recommended web server is uwsgi sitting behind nginx. The python package ``uwsgi`` is needed for this, and +should install to ``/usr/local/bin/uwsgi`` We recommend using ``dj-static`` to load static files. + +.. note:: + + The use of the ``dev`` settings file is production ready, and should be + used for non-AWS installs with ``DEBUG`` set to ``False`` for production use. + + +.. code-block:: console + + $ pip3 install uwsgi dj-static + + +Generate static files: + +.. code-block:: console + + $ python3 manage.py collectstatic --settings=config.settings.prod -i package.json -i package-lock.json -i node_modules/openlayers-ext/index.html + +Update ``config/settings/local_untracked.py``: + +.. code-block:: python + + DEBUG = False + # static files + STATIC_ROOT = 'collected_static' + STATIC_URL = '/static/' + +Start the web server (this also starts celery): + +.. code-block:: console + + $ ./bin/start-seed + +.. warning:: + + Note that uwsgi has port set to ``80``. In a production setting, a dedicated web server such as nginx would be + receiving requests on port 80 and passing requests to uwsgi running on a different port, e.g 8000. + + + + +Environment Variables +^^^^^^^^^^^^^^^^^^^^^ + +The following environment variables can be set within the ``~/.bashrc`` file to +override default Django settings. + +.. code-block:: bash + + export SENTRY_DSN=https://xyz@app.getsentry.com/123 + export DEBUG=False + export ONLY_HTTPS=True + + +Mail Services +^^^^^^^^^^^^^ + +AWS SES Service +--------------- + +In the AWS setup, we can use SES to provide an email service for Django. The service is +configured in the config/settings/local_untracked.py: + +.. code-block:: python + + EMAIL_BACKEND = 'django_ses.SESBackend' + + +In general, the following steps are needed to configure SES: + +1. Access Amazon SES Console - `Quickstart `_ +2. Login to Amazon SES Console. Verify which region we are using (e.g., us-east-1) +3. Decide on email address that will be sending the emails and add them to the `SES Verified Emails `_. +4. Test that SES works as expected (while in the SES sandbox). Note that you will need to add the sender and recipient emails to the verified emails while in the sandbox. +5. Update the local_untracked.py file or set the environment variables for the docker file. +6. Once ready, move the SES instance out of the sandbox. Following instructions `here `_ +7. (Optional) Set up Amazon Simple Notification Service (Amazon SNS) to notify you of bounced emails and other issues. +8. (Optional) Use the AWS Management Console to set up Easy DKIM, which is a way to authenticate your emails. Amazon SES console will have the values for SPF and DKIM that you need to put into your DNS. + +SMTP service +------------ + +Many options for setting up your own `SMTP`_ service/server or using other SMTP +third party services are available and compatible including `gmail`_. SMTP is not configured for working within Docker at the moment. + +.. _SMTP: https://docs.djangoproject.com/en/2.0/ref/settings/#email-backend +.. _gmail: http://stackoverflow.com/questions/19264907/python-django-gmail-smtp-setup + +.. code-block:: python + + EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' + +local_untracked.py +^^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + # PostgreSQL DB config + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'seed', + 'USER': 'your-username', + 'PASSWORD': 'your-password', + 'HOST': 'your-host', + 'PORT': 'your-port', + } + } + + # config for local storage backend + DOMAIN_URLCONFS = {'default': 'config.urls'} + + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + + # SMTP config + EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' + + # static files + STATIC_ROOT = 'collected_static' + STATIC_URL = '/static/' diff --git a/docs/code_documentation/3.0.0/_sources/mapping.rst.txt b/docs/code_documentation/3.0.0/_sources/mapping.rst.txt new file mode 100644 index 00000000..077593ec --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/mapping.rst.txt @@ -0,0 +1,42 @@ +========= +Mapping +========= + +This document describes the set of calls that occur from the web client or API +down to the back-end for the process of mapping data into SEED. + +An overview of the process is: + +1. Import - A file is uploaded to the server +2. Save - The file is batched saved into the database as JSON data +3. Mapping - Mapping occurs on that file +4. Matching / Merging +5. Pairing + +Import +------ + +From the web UI, the import process invokes `seed.views.main.save_raw_data` to save the data. When the data is +done uploading, we need to know whether it is a Portfolio Manager file, so we can add metadata to the record in the +database. The end of the upload happens in `seed.data_importer.views.DataImportBackend.upload_complete`. At this +point, the request object has additional attributes for Portfolio Manager files. These are saved in the model +`seed.data_importer.models.ImportFile`. + +Mapping +------- + +Once files are uploaded, file header columns need to be mapped to SEED columns. Mappings can be specified/decided manually for any particular file import, +or mapping profiles can be created and subsequently applied to any file imports. + +When a column mapping profile is applied to an import file, file header columns defined in the profile must match exactly (spaces, lowercase, uppercase, etc.) +in order for the corresponding SEED column information to be used/mapped. + +Matching +-------- + +.. todo:: document + +Pairing +------- + +.. todo:: document diff --git a/docs/code_documentation/3.0.0/_sources/matching.rst.txt b/docs/code_documentation/3.0.0/_sources/matching.rst.txt new file mode 100644 index 00000000..2d28d935 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/matching.rst.txt @@ -0,0 +1,123 @@ +Matching +======== + +What is it? +----------- +Within SEED, matching refers to a possible relationship between at least 2 properties or at least 2 tax lots. +Two properties **match** if they have the same values for some specified field(s). +These specified fields are referred to as **matching criteria**, and each SEED organization has its +own set of matching criteria which is customizable by users. + +Why does it exist? +------------------ +At a high level, matching is used to identify if two or more property records are actually different +representations of the same property (or tax lots representing one tax lot). For example, within the same cycle, +two matching records, so one persists while the other is used and subsequently discarded to update the persisting record +(say if the building owner's phone number changed). Or across different cycles, it's possible that the +two records capture the same property at different times/cycles - this relationship is referred to as a **link**. + +How and when is it used? +------------------------ + +In-Cycle Merging +"""""""""""""""" +(This is different from manual merging.) + +For records within the same cycle, there really shouldn't be more than one +representation of the same property (or tax lot). As much as possible, the program +is set up to prevent this from happening by automatically **merging** matched +records together whenever they might occur in the same cycle. + +Specifically, a merge of matches might need to occur after any of the following events: + +1. The record has been manually edited. +2. The record was just created as a result of a manual merge (via the 'Actions' on the Properties or Tax Lots page). +3. The record has just been imported. + +The actual execution of merges includes a few additional, unrelated steps but, +in the scope of merging, the following occurs. + +The record in the scenarios listed above is the "target" record. Any and all +matches found, excluding the "target", are merged together first. If there are +overlapping values, priority is given to more recently updated records. + +Once these matches (excluding the target) are merged together, the final step is +to merge the "target" record. In all but one case, choosing between overlapping +values gives priority to the "target". That one case is when a record has just been +imported. Here, overlapping values follow merge protection rules set by +the user for an organization in this final step. + +Linking (Across Cycles) +""""""""""""""""""""""" +For records in different cycles, matches between these are considered links. +Links are used to connect snapshots of the same record year-over-year (at different time periods). +This allows for the analysis of how the record has changed over time. + +In the case of properties, these links are used to associate meters to properties. +This means that adding meters to a property in one cycle will make those meters +accessible to that same property's instance in all other cycles. + +This association can be viewed in aggregate; all of the records within some selected cycles are +grouped and displayed with their links. Alternatively, this association can be viewed for particular linked +group; the linked records of this group are displayed by themselves. + +Putting them Together, Match-Merge-Linking +"""""""""""""""""""""""""""""""""""""""""" +As mentioned earlier, there is a rule or assumption that at most one representation of +the same record can exist in any given cycle. + +This avoids unresolvable situations that would prevent year-over-year analysis. +In the most simple case, a record in `Cycle A` matches two records in `Cycle B`. +SEED wouldn't know which of the two records in `Cycle B` should be +the "snapshot" for this time period. + +For this reason, in-cycle match merging always occurs before cross-cycle match linking. +So when searches for links do happen, ambiguous cases have already been resolved. + +For an individual record, these are the following cases in which a +match-merge-link is automatically run: +1. Explicit triggering (from the Property/TaxLot Detail page) +2. After editing (in the Property/TaxLot Detail page) +3. After manual merging (in the Properties/Tax Lots list page). Explicitly +specified merges happen as chosen by the user. Then, if the resulting record has +matches, merges and/or linking happens. +4. When importing a record. If the incoming record has matches, +merges and/or linking happens. + +For a whole organization, a match-merge-link round for all records in that +organization is run in the following cases: +1. During the original deployment of this feature - This happens in order to +initially normalize the existing data and establish all initial links. +2. Whenever a user changes matching criteria - This happens in order to +re-normalize existing data and reestablish links. As of this writing, before +committing matching criteria changes, a user can view a preview of how their +records will be affected as these are difficult to reverse. + +Note on In-Cycle Not-merged Matches +""""""""""""""""""""""""""""""""""" +Even though the application tries it's best to have only one representative record per property +(or tax lot) per Cycle, it's possible for there to exist matches that were not merged. +This can happen if a user manually unmerges a record after a (manual or automatic) merge occurs. +If this happens, and there exists two records that match each other but are not merged, +both records are **completely unlinked**. Without user intervention such as editing +one of the matching criteria values, these will be merged and linked as described +above next time the system finds them during a match search. + +Match Searching in Depth +------------------------ +Though they accomplish the same goal, the process for merging is very different between the last case, importing, +and the first 2 cases, manual edit or manual merge. + +In the case of manual merging or editing, this process accounts for the fact that these are records that already exist. +Specifically, they may have associations such as labels, notes, pairings, and for properties, meters. +So during a subsequent match search leading to a merge of two or more records, all of these "old" associations are +carried over to the final record once merges are complete. + +In the case of importing, considerations must be taken for the fact that, in most cases, multiple records +are being imported together. Also, since this is the entry point for records, it's possible that a user might +accidentally try to import the same record snapshot twice - where all the record values are the same as another +existing record (as opposed to just having the same values for matching criteria fields). So on import, the process is as follows: + +1. Amongst only the incoming records, duplicates (of other incoming or existing) are flagged and ignored. +2. Amongst only the incoming records, matching records are merged together. +3. Amongst all records in the same Cycle, incoming records that match an existing record gets merged with priority to that existing record. If the incoming record has multiple existing matches, the existing matches are merged together in latest updated order first while also combining any other associations (labels, notes, etc.) just as in the manual merge or edit cases. Since the incoming record is new, it doesn't have any of the other associations. diff --git a/docs/code_documentation/3.0.0/_sources/migrations.rst.txt b/docs/code_documentation/3.0.0/_sources/migrations.rst.txt new file mode 100644 index 00000000..b2df5feb --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/migrations.rst.txt @@ -0,0 +1,295 @@ +Migrations +========== + +Django handles the migration of the database very well; however, there are various changes to SEED that may require some custom (manual) migrations. The migration documentation includes the required changes based on deployment and development for each release. + +Version Develop +--------------- + +In order to support Redis passwords, the configuration of the Redis/Celery settings changed a bit. +You will need to add the following to your local_untracked.py configuration file. If you are using +Docker then you will not need to do this. + +.. code-block:: python + + CELERY_RESULT_BACKEND = CELERY_BROKER_URL + +If you are using a password, then in your local_untracked.py configuration, add the password to +the CELERY_BROKER_URL. Your final configuration should look like the following in your +local_untracked.py file + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://:password@127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + + CELERY_RESULT_BACKEND = CELERY_BROKER_URL + CELERY_TASK_DEFAULT_QUEUE = 'seed-local' + CELERY_TASK_QUEUES = ( + Queue( + CELERY_TASK_DEFAULT_QUEUE, + Exchange(CELERY_TASK_DEFAULT_QUEUE), + routing_key=CELERY_TASK_DEFAULT_QUEUE + ), + ) + +Version 3.0.0 +------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 3.0.0-beta.0 +-------------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.22.0 +-------------- +- Run ``./manage.py migrate``. +- There is a Redis dependency update in this release that requires users and deployments to modify their settings' ``CACHES`` config. + #. Update your dependencies with pip install -r requirements/base.txt + #. Update the CACHES BACKEND property to ``django_redis.cache.RedisCache`` + #. Update the CACHES LOCATION property to match the redis-py native URL notation for connection strings, including the redis protocol and database number. e.g. ``redis://localhost:6379/1`` + + Since the CELERY_BROKER_URL setting must also be in the same format, it may be helpful to configure that setting first and then reference it in the caches LOCATION parameter. +- See the `PR for an example migration `_. + +Version 2.21.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.20.1 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.20.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. +- There is a single long running migration related to importing census tract disadvantaged community data. This migration should take around 7 minutes to complete. + +Version 2.19.0 +-------------- +- Run `./manage.py migrate`. +- There is a new migration in this release that requires column names to be unique across `organization`, `table_name`, and `is_extra_data`. This migration will fail if there are duplicate column names. If you have duplicate column names, you will need to manually fix them in your database before running the migration. The following steps will help you identify and fix the duplicate column names: + - Check the organization age to gauge the impact of the change. If it is a deprecated org, impact of the change will be low. Often this issue arose in older organizations when units were not part of the columns. The old mapping columns were not upserts with the units, so typically the columns impacted are the ones with units. + - Query the `seed_column` table for the organization and column name displayed on the screen (e.g., `organization_id = 300 and column_name = 'Source EUI (kBtu/ft2)'`). If there is no `table_name` set, it is likely an import file column name and can easily be cleaned up without causing issues. In such cases, there will be two rows, and you want to keep the one with the `units_pint` column set. + - More complex columns may require deleting or updating the `column_id` in the `seed_columnmapping_*` tables. If there is a foreign key constraint with `seed_columnmapping_*`, take note of the ID you want to remove and the ID you want it to be replaced with (preferably keep the one with units_pint). + - If the constraint is on `seed_columnmapping_column_raw`: + - The field should be an import file column (i.e., no `table_name` item). Query for the old column in `seed_columnmapping_column_raw` (e.g., `column_name = `). + - Replace the old ID with the new one. If it errors because it already exists, then the row can be deleted. + - Return to the `seed_column` table and remove the old ID. + - If the constraint is on `seed_columnmapping_column_mapped`: + - The mapped column should have a `table_name` in the field. If not, it is likely an older organization. + - If there is no `table_name`, remove the row from the `seed_columnmapping_column_mapped` table. + - Return to the `seed_column` table and remove the old ID. + +Version 2.18.1 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.18.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.17.4 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.17.3 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.17.2 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.17.1 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.17.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.16.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.15.2 +-------------- +- There are no migrations needed for this version. + +Version 2.15.1 +-------------- +- There are no migrations needed for this version. + +Version 2.15.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.14.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.13.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.12.0 - 2.12.4 +----------------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.11.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.10.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.7.3 to 2.9.0 +---------------------- +- The migrations should work without additional support. Simply run ``./manage.py migrate``. + +Version 2.7.2 +------------- +- The migrations should work without additional support. Simply run ``./manage.py migrate``. There are no manual migrations needed. +- Note the **Important Note** in Version 2.7.1 migration below which may require the need to run a "fake" migration + +Version 2.7.1 +------------- + +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +**Important Note:** + +If upgrading from `< 2.7.0` to `>= 2.7.1` you may encounter a failed migration with ``0118_match_merge_link_all_orgs``. This is expected if the database is several versions behind, and it effectively reorders migration 118 to run after all other migrations have completed to prepare your database to recognize properties and taxlots across multiple cycles. Run the following code manually to fully migrate: + +#. ``./manage.py migrate --fake seed 0118_match_merge_link_all_orgs`` + +#. ``./manage.py migrate`` + +#. ``./manage.py shell`` + + .. code-block:: python + + from seed.lib.superperms.orgs.models import Organization + from seed.utils.match import whole_org_match_merge_link + + for org in Organization.objects.all(): + whole_org_match_merge_link(org.id, 'PropertyState') + whole_org_match_merge_link(org.id, 'TaxLotState') + +Version 2.7.0 +------------- + +- This migration will run a match/merge/pair/link method upon migration. Make sure to run the migration manually and not inside of the docker container using the ./deploy.sh script. +- Make sure to backup the database before performing the migration. +- Run ``./manage.py migrate``. + +Version 2.6.1 +------------- + +- The migrations should work without additional support. Simply run ``./manage.py migrate``. There are no manual migrations needed for the 2.6.1 release. + + +Version 2.6.0 +------------- + +Version 2.6.0 includes support for meters and time series data storage. In order to use this release +you must first install `TimescaleDB`_. + +Docker-based Deployment +^^^^^^^^^^^^^^^^^^^^^^^ +Docker-based deployments shouldn't require running any additional commands for installation. The +timescaledb installation will happen automatically when updating the postgres container. Also, +the installation of the extension occurs in a Django migration. + +Ubuntu +^^^^^^ + +.. code-block:: console + + sudo add-apt-repository ppa:timescale/timescaledb-ppa + sudo apt update + sudo apt install timescaledb-postgresql-10 + sudo timescaledb-tune + sudo service postgresql restart + +Max OSX +^^^^^^^ + +.. code-block:: console + + brew tap timescale/tap + brew install timescaledb + /usr/local/bin/timescaledb_move.sh + timescaledb-tune + brew services restart postgresql + +Version 2.5.2 +------------- + +- There are no manual migrations that are needed. The ``./manage.py migrate`` command may take awhile to run since the migration requires the recalculation of all the normalized addresses to parse bldg correct and to cast the result as a string and not a bytestring. + +Version 2.5.1 +------------- + +- The migrations should work by simply running ``./manage.py migrate``. There are no manual migrations needed for the 2.5.1 release. + +Version 2.5.0 +------------- + +Docker-based Deployment +^^^^^^^^^^^^^^^^^^^^^^^ + +- Add the MapQuest API key to your organization. +- On deployment, the error below is indicative that you need to install the extensions in the postgres database. Run `docker exec update-postgis.sh`. + + django.db.utils.OperationalError: could not open extension control file "/usr/share/postgresql/11/extension/postgis.control": No such file or directory + +- If you are using a copied version of the docker-compose.yml file, then you need to change `127.0.0.1:5000/postgres` to `127.0.0.1:5000/postgres-seed` + +Development +^^^^^^^^^^^ + +- **Delete** your bower directory `rm -rf seed/static/vendors`. +- **Delete** your css directory `rm -rf seed/static/seed/css`. +- **Remove** these lines from `local_untracked.py` if you have them. + +.. code-block:: python + + DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' + STATICFILES_STORAGE = DEFAULT_FILE_STORAGE + +- Run `pip3 install -r requirements/local.txt`. +- Run `npm install` from root checkout of SEED. + +- If testing geocoding, then sign up for as a `MapQuest Developer`_ and create a new `MapQuest Key`_. +- Add the key to the organization that you are using in development. + +- **Update** your DATABASES engine to be `django.contrib.gis.db.backends.postgis` + +.. code-block:: python + + DATABASES = { + 'default': { + 'ENGINE': 'django.contrib.gis.db.backends.postgis', + 'NAME': 'seeddb', + 'USER': 'seeduser', + 'PASSWORD': 'seedpass', + 'HOST': 'localhost', + 'PORT': '5432', + } + } + +- Run ``./manage.py migrate`` + +.. _`MapQuest Developer`: https://developer.mapquest.com/plan_purchase/steps/business_edition/business_edition_free/register + +.. _`MapQuest Key`: https://developer.mapquest.com/user/me/apps + +.. _`TimescaleDB`: https://docs.timescale.com/v1.2/getting-started diff --git a/docs/code_documentation/3.0.0/_sources/modules.rst.txt b/docs/code_documentation/3.0.0/_sources/modules.rst.txt new file mode 100644 index 00000000..4c920b9e --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules.rst.txt @@ -0,0 +1,26 @@ +========= +Modules +========= + +.. toctree:: + :maxdepth: 3 + + modules/config + modules/seed.cleansing + modules/seed.data + modules/seed.data_importer + modules/seed.features + modules/seed.landing + modules/seed.lib + modules/seed.lib.mappings + modules/seed.lib.merging + modules/seed.mappings + modules/seed.managers + modules/seed.models + modules/seed.public + modules/seed + modules/seed.serializers + modules/seed.tests + modules/seed.urls + modules/seed.utils + modules/seed.views diff --git a/docs/code_documentation/3.0.0/_sources/modules/config.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/config.rst.txt new file mode 100644 index 00000000..09215b7d --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/config.rst.txt @@ -0,0 +1,45 @@ +Configuration +============= + +Submodules +---------- + +Template Context +---------------- + +.. automodule:: config.template_context + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: config.tests + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: config.utils + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: config.views + :members: + :undoc-members: + :show-inheritance: + +WSGI +---- + +.. automodule:: config.wsgi + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.cleansing.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.cleansing.rst.txt new file mode 100644 index 00000000..e185fd8e --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.cleansing.rst.txt @@ -0,0 +1,35 @@ +Data Quality Package +==================== + +Inheritance +----------- + +.. inheritance-diagram:: seed.data_quality.models + :parts: 2 + +Submodules +---------- + +Models +------ + +.. automodule:: seed.models.data_quality + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: seed.tests.data_quality + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.views.data_quality + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.data.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.data.rst.txt new file mode 100644 index 00000000..cf066173 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.data.rst.txt @@ -0,0 +1,22 @@ +Data Package +============ + +Submodules +---------- + +BEDES +----- + +.. automodule:: seed.data.bedes + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.data + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.data_importer.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.data_importer.rst.txt new file mode 100644 index 00000000..a446d80d --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.data_importer.rst.txt @@ -0,0 +1,55 @@ +Data Importer Package +===================== + +Submodules +---------- + +Managers +-------- + +.. automodule:: seed.data_importer.managers + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. .. automodule:: seed.data_importer.models +.. :members: +.. :undoc-members: +.. :show-inheritance: + +URLs +---- + +.. automodule:: seed.data_importer.urls + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: seed.data_importer.utils + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.data_importer.views + :members: + :undoc-members: + :show-inheritance: + :noindex: + + +Module contents +--------------- + +.. automodule:: seed.data_importer + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.features.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.features.rst.txt new file mode 100644 index 00000000..ce361d2e --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.features.rst.txt @@ -0,0 +1,22 @@ +Features Package +================ + +Submodules +---------- + +.. Steps +.. -------------------------- + +.. .. automodule:: seed.features.steps +.. :members: +.. :undoc-members: +.. :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.features + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.landing.management.commands.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.landing.management.commands.rst.txt new file mode 100644 index 00000000..57da9c38 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.landing.management.commands.rst.txt @@ -0,0 +1,22 @@ +Landing Management Package +========================== + +Submodules +---------- + +Update EULA +----------- + +.. automodule:: seed.landing.management.commands.update_eula + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.landing.management.commands + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.landing.management.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.landing.management.rst.txt new file mode 100644 index 00000000..c17e2852 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.landing.management.rst.txt @@ -0,0 +1,17 @@ +seed.landing.management package +=============================== + +Subpackages +----------- + +.. toctree:: + + seed.landing.management.commands + +Module contents +--------------- + +.. automodule:: seed.landing.management + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.landing.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.landing.rst.txt new file mode 100644 index 00000000..8103b029 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.landing.rst.txt @@ -0,0 +1,61 @@ +Landing Package +=============== + +Subpackages +----------- + +.. toctree:: + + seed.landing.management + +Submodules +---------- + +Forms +----- + +.. automodule:: seed.landing.forms + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. automodule:: seed.landing.models + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: seed.landing.tests + :members: + :undoc-members: + :show-inheritance: + +URLs +---- + +.. automodule:: seed.landing.urls + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.landing.views + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.landing + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.lib.mappings.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.lib.mappings.rst.txt new file mode 100644 index 00000000..f7bbb15c --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.lib.mappings.rst.txt @@ -0,0 +1,62 @@ +seed.lib.mappings package +========================= + +Submodules +---------- + +seed.lib.mappings.mapper module +------------------------------- + +.. automodule:: seed.lib.mappings.mapper + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.mapping_columns module +---------------------------------------- + +.. automodule:: seed.lib.mappings.mapping_columns + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.mapping_data module +------------------------------------- + +.. automodule:: seed.lib.mappings.mapping_data + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.test_mapper module +------------------------------------ + +.. automodule:: seed.lib.mappings.test_mapper + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.test_mapping_columns module +--------------------------------------------- + +.. automodule:: seed.lib.mappings.test_mapping_columns + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.test_mapping_data module +------------------------------------------ + +.. automodule:: seed.lib.mappings.test_mapping_data + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.lib.mappings + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.lib.merging.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.lib.merging.rst.txt new file mode 100644 index 00000000..98b5be8a --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.lib.merging.rst.txt @@ -0,0 +1,22 @@ +seed.lib.merging package +======================== + +Submodules +---------- + +seed.lib.merging.merging module +------------------------------- + +.. automodule:: seed.lib.merging.merging + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.lib.merging + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.lib.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.lib.rst.txt new file mode 100644 index 00000000..8de8e0e6 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.lib.rst.txt @@ -0,0 +1,23 @@ +Library Packages +================ + +Submodules +---------- + +Module contents +--------------- + +.. automodule:: seed.lib + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: seed.lib.mappings + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: seed.lib.merging + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.management.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.management.rst.txt new file mode 100644 index 00000000..9b600793 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.management.rst.txt @@ -0,0 +1,17 @@ +Management Package +================== + +Subpackages +----------- + +.. toctree:: + + seed.management.commands + +Module contents +--------------- + +.. automodule:: seed.management + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.managers.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.managers.rst.txt new file mode 100644 index 00000000..d77c318c --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.managers.rst.txt @@ -0,0 +1,29 @@ +Managers Package +================ + +Subpackages +----------- + +.. toctree:: + + seed.managers.tests + +Submodules +---------- + +JSON +---- + +.. automodule:: seed.managers.json + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.managers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.managers.tests.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.managers.tests.rst.txt new file mode 100644 index 00000000..2ef2cc25 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.managers.tests.rst.txt @@ -0,0 +1,22 @@ +Manager Tests Package +===================== + +Submodules +---------- + +Test JSON Manager +----------------- + +.. automodule:: seed.managers.tests.test_json_manager + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.managers.tests + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.mappings.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.mappings.rst.txt new file mode 100644 index 00000000..e749754f --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.mappings.rst.txt @@ -0,0 +1,38 @@ +Mapping Package +=============== + +Submodules +---------- + +seed.mappings.mapper module +--------------------------- + +.. automodule:: seed.mappings.mapper + :members: + :undoc-members: + :show-inheritance: + +.. seed.mappings.reconcile_mappings module +.. --------------------------------------- + +.. .. automodule:: seed.mappings.reconcile_mappings +.. :members: +.. :undoc-members: +.. :show-inheritance: + +seed.mappings.seed_mappings module +---------------------------------- + +.. automodule:: seed.mappings.seed_mappings + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.mappings + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.models.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.models.rst.txt new file mode 100644 index 00000000..fb0187a3 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.models.rst.txt @@ -0,0 +1,71 @@ +Models +=================== + +Submodules +---------- + +AuditLog +--------------------------- + +.. automodule:: seed.models.auditlog + :members: + :undoc-members: + :show-inheritance: + +Columns +-------------------------- + +.. automodule:: seed.models.columns + :members: + :undoc-members: + :show-inheritance: + +Cycles +------------------------- + +.. automodule:: seed.models.cycles + :members: + :undoc-members: + :show-inheritance: + +Joins +------------------------ + +.. automodule:: seed.models.joins + :members: + :undoc-members: + :show-inheritance: + +Generic Models +------------------------- + +.. automodule:: seed.models.models + :members: + :undoc-members: + :show-inheritance: + + +Properties +----------------------------- + +.. automodule:: seed.models.properties + :members: + :undoc-members: + :show-inheritance: + +TaxLots +--------------------------- + +.. automodule:: seed.models.tax_lots + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.models + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.public.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.public.rst.txt new file mode 100644 index 00000000..8a292bdc --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.public.rst.txt @@ -0,0 +1,22 @@ +Public Package +============== + +Submodules +---------- + +Models +------ + +.. automodule:: seed.public.models + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.public + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.rst.txt new file mode 100644 index 00000000..771c0324 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.rst.txt @@ -0,0 +1,106 @@ +SEED Package +============ + +Subpackages +----------- + +.. toctree:: + + seed.features + seed.management + seed.mappings + seed.templatetags + seed.test_helpers + seed.tests + + +Inheritance +----------- + +.. inheritance-diagram:: seed.models + :parts: 2 + + +Submodules +---------- + +Decorators +---------- + +.. automodule:: seed.decorators + :members: + :undoc-members: + :show-inheritance: + +Factory +------- + +.. automodule:: seed.factory + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. automodule:: seed.models + :members: + :undoc-members: + :show-inheritance: + +.. Reconcile +.. --------- + +.. .. automodule:: seed.reconcile +.. :members: +.. :undoc-members: +.. :show-inheritance: + +Search +------ + +.. automodule:: seed.search + :members: + :undoc-members: + :show-inheritance: + +Tasks +----- + +.. automodule:: seed.tasks + :members: + :undoc-members: + :show-inheritance: + +Token Generator +--------------- + +.. automodule:: seed.token_generators + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: seed.utils + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.views + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.serializers.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.serializers.rst.txt new file mode 100644 index 00000000..5f3a7dcf --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.serializers.rst.txt @@ -0,0 +1,30 @@ +Serializers Package +=================== + +Submodules +---------- + +Serializers +----------- + +.. automodule:: seed.serializers.celery + :members: + :undoc-members: + :show-inheritance: + +Labels +------ + +.. automodule:: seed.serializers.labels + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.serializers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.templatetags.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.templatetags.rst.txt new file mode 100644 index 00000000..5f799d24 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.templatetags.rst.txt @@ -0,0 +1,13 @@ +Templatetags Package +========================= + +Submodules +---------- + +Breadcrumbs +----------- + +.. automodule:: seed.templatetags.breadcrumbs + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.test_helpers.factory.lib.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.test_helpers.factory.lib.rst.txt new file mode 100644 index 00000000..7cbfda51 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.test_helpers.factory.lib.rst.txt @@ -0,0 +1,13 @@ +Test Helper Factory Lib Package +=============================== + +Submodules +---------- + +Chomsky +------- + +.. automodule:: seed.test_helpers.factory.lib.chomsky + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.test_helpers.factory.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.test_helpers.factory.rst.txt new file mode 100644 index 00000000..3b3a5393 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.test_helpers.factory.rst.txt @@ -0,0 +1,20 @@ +Test Helper Factor Package +========================== + +Subpackages +----------- + +.. toctree:: + + seed.test_helpers.factory.lib + +Submodules +---------- + +Helpers +------- + +.. automodule:: seed.test_helpers.factory.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.test_helpers.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.test_helpers.rst.txt new file mode 100644 index 00000000..d0ebe883 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.test_helpers.rst.txt @@ -0,0 +1,17 @@ +Test Helpers Package +==================== + +Subpackages +----------- + +.. toctree:: + + seed.test_helpers.factory + +Module contents +--------------- + +.. automodule:: seed.test_helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.tests.functional.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.tests.functional.rst.txt new file mode 100644 index 00000000..774c5447 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.tests.functional.rst.txt @@ -0,0 +1,21 @@ +Tests (Functional) Package +========================== + +Submodules +---------- + +Base +---- +.. automodule:: seed.functional.tests.base + :members: + +Page +---- +.. automodule:: seed.functional.tests.page + :members: + +Pages +----- +.. automodule:: seed.functional.tests.pages + :members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.tests.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.tests.rst.txt new file mode 100644 index 00000000..dcbf1b28 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.tests.rst.txt @@ -0,0 +1,80 @@ +Tests Package +============= + +Submodules +---------- + +.. toctree:: + :maxdepth: 2 + + seed.test_helpers + seed.tests.functional + +Admin Views +----------- + +.. automodule:: seed.tests.test_admin_views + :members: + :undoc-members: + :show-inheritance: + +Decorators +---------- + +.. automodule:: seed.tests.test_decorators + :members: + :undoc-members: + :show-inheritance: + +Exporters +--------- + +.. automodule:: seed.tests.test_exporters + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. automodule:: seed.tests.test_models + :members: + :undoc-members: + :show-inheritance: + +Tasks +----- + +.. automodule:: seed.tests.test_tasks + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.tests.test_views + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: seed.tests.tests + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: seed.tests.functional + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: seed.tests.util + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.urls.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.urls.rst.txt new file mode 100644 index 00000000..ab11d6be --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.urls.rst.txt @@ -0,0 +1,29 @@ +URLs Package +============ + +Submodules +---------- + +Accounts +-------- + +.. automodule:: seed.urls.accounts + :members: + :undoc-members: + :show-inheritance: + +APIs +---- + +.. automodule:: seed.urls.api + :members: + :undoc-members: + :show-inheritance: + +Main +---- + +.. automodule:: seed.urls.main + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.utils.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.utils.rst.txt new file mode 100644 index 00000000..27fd9b6c --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.utils.rst.txt @@ -0,0 +1,37 @@ +Utilities Package +================= + +Submodules +---------- + +APIs +---- + +.. automodule:: seed.utils.api + :members: + :undoc-members: + :show-inheritance: + +Buildings +--------- + +.. automodule:: seed.utils.buildings + :members: + :undoc-members: + :show-inheritance: + +Organizations +------------- + +.. automodule:: seed.utils.organizations + :members: + :undoc-members: + :show-inheritance: + +Time +---- + +.. automodule:: seed.utils.time + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/modules/seed.views.rst.txt b/docs/code_documentation/3.0.0/_sources/modules/seed.views.rst.txt new file mode 100644 index 00000000..195e1ed6 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/modules/seed.views.rst.txt @@ -0,0 +1,49 @@ +Views Package +============= + +Submodules +---------- + +Accounts +-------------------------- + +.. automodule:: seed.views.accounts + :members: + :undoc-members: + :show-inheritance: + :noindex: + +APIs +---- + +.. automodule:: seed.views.api + :members: + :undoc-members: + :show-inheritance: + :noindex: + +Main +---- + +.. automodule:: seed.views.main + :members: + :undoc-members: + :show-inheritance: + :noindex: + +Meters +------ + +.. automodule:: seed.views.meters + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.views + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.0.0/_sources/postgres_upgrade.rst.txt b/docs/code_documentation/3.0.0/_sources/postgres_upgrade.rst.txt new file mode 100644 index 00000000..85ae58f5 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/postgres_upgrade.rst.txt @@ -0,0 +1,51 @@ +Upgrade a SEED database from Postgres 12 to Postgres 16 +======================================================= + +Assumptions +----------- + +- This process assumes that you're currently using Postgres 12.7 with TimescaleDB 2.3.0 from ``timescale/timescaledb-postgis:2.3.0-pg12`` or ``timescale/timescaledb-postgis:latest-pg12`` +- This also assumes that you have a directory in the host filesystem, e.g. ``~/share``, that is bind mounted to ``/share`` in your existing database container + +1. Create a dump of the current database + +.. code-block:: bash + + docker exec seed_postgres pg_dump -d seed -U seeduser -Fc -f /share/seed-pg12.dump + +2. Create a temporary Postgres 13 container using the Docker image ``timescale/timescaledb-ha:pg13.14-ts2.14.2-oss`` + +.. code-block:: bash + + docker run --rm --name=seed-pg13 -e POSTGRES_DB=seed -e POSTGRES_USER=seeduser -e POSTGRES_PASSWORD=password -v ~/share:/share timescale/timescaledb-ha:pg13.14-ts2.14.2-oss + +Once the container has finished initializing, open a separate shell + +.. code-block:: bash + + docker exec -it seed-pg13 bash + psql -d seed -U seeduser -c "CREATE EXTENSION postgis;" + psql -d seed -U seeduser -c "DROP EXTENSION timescaledb;" + psql -d seed -U seeduser -c "CREATE EXTENSION timescaledb WITH VERSION '2.3.0';" + psql -d seed -U seeduser -c "SELECT timescaledb_pre_restore();" + pg_restore -d seed -U seeduser /share/seed-pg12.dump + psql -d seed -U seeduser -c "SELECT timescaledb_post_restore();" + psql -d seed -U seeduser -c "ALTER EXTENSION timescaledb UPDATE;" + pg_dump -d seed -U seeduser -Fc -f /share/seed-pg13.dump + +3. Start the new, permanent Postgres 16 container using the Docker image ``timescale/timescaledb-ha:pg16.2-ts2.14.2-oss`` + +.. code-block:: bash + + docker run -d --name=seed-pg16 -e POSTGRES_DB=seed -e POSTGRES_USER=seeduser -e POSTGRES_PASSWORD=password -v ~/share:/share timescale/timescaledb-ha:pg16.2-ts2.14.2-oss + +Once the container has finished initializing, open a separate shell + +.. code-block:: bash + + docker exec -it seed-pg16 bash + psql -d seed -U seeduser -c "CREATE EXTENSION postgis;" + psql -d seed -U seeduser -c "SELECT timescaledb_pre_restore();" + pg_restore -d seed -U seeduser /share/seed-pg13.dump + psql -d seed -U seeduser -c "SELECT timescaledb_post_restore();" + pg_dump -d seed -U seeduser -Fc -f /share/seed-pg16.dump diff --git a/docs/code_documentation/3.0.0/_sources/setup_docker.rst.txt b/docs/code_documentation/3.0.0/_sources/setup_docker.rst.txt new file mode 100644 index 00000000..3f020794 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/setup_docker.rst.txt @@ -0,0 +1,149 @@ +Installation using Docker +========================= + +Docker works natively on Linux, Mac OSX, and Windows 10. If you are using an older version of +Windows (and some older versions of Mac OSX), you will need to install Docker Toolbox. + +Choose either `Docker Native (Windows/OSX)`_ or `Docker Native (Ubuntu)`_ to +install Docker. + +Docker Native (Ubuntu) +---------------------- + +Follow instructions `here `_. + +* `Install Docker Compose `_ + + +Docker Native (Windows/OSX) +--------------------------- + +Following instructions `for Mac `_ or +`for Windows `_. Note that for OSX you must have docker desktop version `3.0 or later `. + +* `Install Docker Compose `_ + + +Building and Running Containers for Non-Development +------------------------------------------------------- + +* Run Docker Compose + + .. code-block:: bash + + docker compose build + + `Be Patient`_ ... If the containers build successfully, then start the containers + + .. code-block:: bash + + docker volume create --name=seed_pgdata + docker volume create --name=seed_media + docker compose up + + **Note that you may need to build the containers a couple times for everything to converge** + +* Login to container + + The docker-compose file creates a default user and password. Below are the defaults but can + be overridden by setting environment variables. + + .. code-block:: bash + + username: user@seed-platform.org + password: super-secret-password + + +.. note:: + + Don't forget that you need to reset your default username and password if you are going + to use these Docker images in production mode! + +Using Docker for Development +---------------------------- + +The development environment is configured for live reloading (i.e., restart webserver when files change) +and debugging. It builds off the base docker-compose.yml, so it's necessary +to specify the files being used in docker-compose commands as seen below. + +Build +^^^^^ + +.. code-block:: bash + + # create volumes for the database and media directory + docker volume create --name=seed_pgdata + docker volume create --name=seed_media + + # build the images + docker compose -f docker-compose.yml -f docker-compose.dev.yml build + +Running the Server +^^^^^^^^^^^^^^^^^^ + +NOTE: the server config is sourced from config.settings.docker_dev, which will include +your local_untracked.py if it exists. If you have a local_untracked.py, make sure it doesn't +overwrite the database or celery configuration! + +.. code-block:: bash + + docker compose -f docker-compose.yml -f docker-compose.dev.yml up + +If the server doesn't start successfully, and :code:`docker compose logs` doesn't help, +the django development server probably failed to start due to an error in your config or code. +Unfortunately docker/django logging doesn't appear to work when the container is first started. +Just try running the server yourself with docker exec, and see what the output is. + +The development docker-compose file has some configurable parameters for specifying volumes to use: + +- SEED_DB_VOLUME: the name of the docker volume to mount for postgres +- SEED_MEDIA_VOLUME: the name of the docker volume to mount for the seed media folder + +Docker will use environment variables from the shell or from a .env file to set these values. + +This is useful if you want to switch between different databases for testing. +For example, if you want to create a separate volume for storing a production backup, you could do the following + +.. code-block:: bash + + docker volume create --name=seed_pgdata_prod + SEED_DB_VOLUME=seed_pgdata_prod docker compose -f docker-compose.yml -f docker-compose.dev.yml up + +NOTE: you'll need to run :code:`docker compose down` to remove the containers before you +can restart the containers connecting to different volumes. + +Running Tests +^^^^^^^^^^^^^ + +While the containers are running (i.e., after running the docker compose up command), use docker exec to run tests in the web container: + +.. code-block:: bash + + docker exec -it seed_web ./manage.py test --settings config.settings.docker_dev + +Add the setting :code:`--nocapture` in order to see :code:`stdout` while running tests. You will need to do this in order to make use of debugging as described below or the output to your debug commands will not display until after the break point has passed and the tests are finished. + +Also worth noting: output from logging (_log.debug, etc) will not display in any situation unless a test fails. + +Debugging +^^^^^^^^^ + +To use pdb on the server, the web container has `remote-pdb `_ installed. +In your code, insert the following + +.. code-block:: bash + + import remote_pdb; remote_pdb.set_trace() + +Once the breakpoint is triggered, you should see the web container log something like "RemotePdb session open at 127.0.0.1:41653, waiting for connection ...". +To connect to the remote session, run netcat from inside the container (using the appropriate port). + +.. code-block:: bash + + docker exec -it seed_web nc 127.0.0.1:41653 + +.. _MacPorts: https://www.macports.org/ +.. _Homebrew: http://brew.sh/ +.. _npm: https://www.npmjs.com/ +.. _nodejs.org: http://nodejs.org/ +.. _Be Patient: https://www.youtube.com/watch?v=f4hkPn0Un_Q diff --git a/docs/code_documentation/3.0.0/_sources/setup_osx.rst.txt b/docs/code_documentation/3.0.0/_sources/setup_osx.rst.txt new file mode 100644 index 00000000..9bc64be9 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/setup_osx.rst.txt @@ -0,0 +1,383 @@ +Installation on OSX +=================== + +.. _virtualenv: https://virtualenv.pypa.io/en/latest/ +.. _pyenv: https://github.com/pyenv/pyenv +.. _virtualenvwrapper: https://virtualenvwrapper.readthedocs.io/en/latest/ +.. _MacPorts: https://www.macports.org/ +.. _Homebrew: http://brew.sh/ +.. _npm: https://www.npmjs.com/ +.. _nodejs.org: http://nodejs.org/ + +These instructions are for installing and running SEED on Mac OSX in +development mode. + +Quick Installation Instructions +------------------------------- + +This section is intended for developers who may already have their machine +ready for general development. If this is not the case, skip to Prerequisites. Note that SEED uses python 3. + +* install Postgres 11.1 and redis for cache and message broker +* install PostGIS 2.5 and enable it on the database using `CREATE EXTENSION postgis;` +* install TimescaleDB 1.5.0 +* use a virtualenv (if desired) +* `git clone git@github.com:seed-platform/seed.git` +* create a `local_untracked.py` in the `config/settings` folder and add CACHE and DB config (example `local_untracked.py.dist`) +* to enable geocoding, get MapQuest API key and attach it to your organization +* `export DJANGO_SETTINGS_MODULE=config.settings.dev` in all terminals used by SEED (celery terminal and runserver terminal) +* `pip install -r requirements/local.txt` + * for condas python, you way need to run this command to get pip install to succeed: `conda install -c conda-forge python-crfsuite` +* npm install +* `./manage.py migrate` +* `./manage.py create_default_user` +* `./manage.py runserver` +* `DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 4 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler` +* navigate to `http://127.0.0.1:8000/app/#/profile/admin` in your browser to add users to organizations +* main app runs at `127.0.0.1:8000/app` + +The `python manage.py create_default_user` will setup a default `superuser` +which must be used to access the system the first time. The management command +can also create other superusers. + +.. code-block:: console + + ./manage.py create_default_user --username=demo@seed-platform.org --organization=lbl --password=demo123 + + +Prerequisites +------------- + +These instructions assume you have MacPorts_ or Homebrew_. Your system +should have the following dependencies already installed: + +* git (`port install git` or `brew install git`) +* graphviz (`brew install graphviz`) +* pyenv_ (Recommended) + + .. note:: + + Although you *could* install Python packages globally, this is the + easiest way to install Python packages. Setting these up first will + help avoid polluting your base Python installation and make it much + easier to switch between different versions of the code. + + .. code-block:: bash + + brew install pyenv + brew install pyenv-virtualenv + pyenv install + pyenv virtualenv seed + pyenv local seed + + +PostgreSQL 11.1 +--------------- + +MacPorts:: + + sudo su - root + port install postgresql94-server postgresql94 postgresql94-doc + # init db + mkdir -p /opt/local/var/db/postgresql94/defaultdb + chown postgres:postgres /opt/local/var/db/postgresql94/defaultdb + su postgres -c '/opt/local/lib/postgresql94/bin/initdb -D /opt/local/var/db/postgresql94/defaultdb' + + # At this point, you may want to add start/stop scripts or aliases to + # ~/.bashrc or your virtualenv ``postactivate`` script + # (in ``~/.virtualenvs/{env-name}/bin/postactivate``). + + alias pg_start='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \ + -D /opt/local/var/db/postgresql94/defaultdb \ + -l /opt/local/var/db/postgresql94/defaultdb/postgresql.log start"' + alias pg_stop='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \ + -D /opt/local/var/db/postgresql94/defaultdb stop"' + + pg_start + + sudo su - postgres + PATH=$PATH:/opt/local/lib/postgresql94/bin/ + +Homebrew:: + + brew install postgres + # follow the post install instructions to add to launchagents or call + # manually with `postgres -D /usr/local/var/postgres` + # Skip the remaining Postgres instructions! + + + +Configure PostgreSQL. Replace 'seeddb', 'seeduser' with desired db/user. By +default use password `seedpass` when prompted. Use the code block below in development only since +the seeduser is a SUPERUSER. + +.. code-block:: bash + + createuser -P seeduser + createdb `whoami` + psql -c 'CREATE DATABASE "seeddb" WITH OWNER = "seeduser";' + psql -c 'GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO seeduser;' + psql -c 'ALTER ROLE seeduser SUPERUSER;' + + + +PostGIS 2.5 +----------- + +MacPorts:: + + # Assuming you're still root from installing PostgreSQL, + port install postgis2 + + + +Homebrew:: + + brew install postgis + + + +Configure PostGIS:: + + psql -d seeddb -c "CREATE EXTENSION postgis;" + + # For testing, give seed user superuser access: + # psql -c 'ALTER USER seeduser CREATEDB;' + + +If upgrading from an existing database or existing local_untracked.py file, make sure to add the +MapQuest API Key and set the database engine to 'ENGINE': 'django.contrib.gis.db.backends.postgis'. + +Now exit any root environments, becoming just yourself (even though it's not +that easy being green), for the remainder of these instructions. + + +TimescaleDB 1.5.0 +----------------- + +Note, as of version 1.5.0, dumping and restoring databases requires that both the source and target +database have the same version of TimescaleDB. + +Downloading From Source:: + + # Note: Installing from source should only be done + # if you have a Postgres installation not maintained by Homebrew. + # This installation requires C compiler (e.g., gcc or clang) and CMake version 3.4 or greater. + + git clone https://github.com/timescale/timescaledb.git + cd timescaledb + git checkout 1.5.0 + + # Bootstrap the build system + ./bootstrap + + # If OpenSSL can't be found by cmake - run the following instead + # ./bootstrap -DOPENSSL_ROOT_DIR= # e.g., -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl + + # To build the extension + cd build && make + + # To install + make install + + # Find postgresql.conf + # Then uncomment the shared_preload_libraries line changing it to the following + # shared_preload_libraries = 'timescaledb' + psql -d postgres -c "SHOW config_file;" + + # Restart PostgreSQL instance + + + +Python Packages +--------------- + +Run these commands as your normal user id. + +Change to a virtualenv (using virtualenvwrapper) or do the following as a +superuser. A virtualenv is usually better for development. Set the virtualenv +to seed. + +.. code-block:: bash + + workon seed + +Make sure PostgreSQL command line scripts are in your PATH (if using MacPorts) + +.. code-block:: bash + + export PATH=$PATH:/opt/local/lib/postgresql94/bin + +Some packages (uWSGI) may need to find your C compiler. Make sure you have +'gcc' on your system, and then also export this to the `CC` environment +variable: + +.. code-block:: bash + + export CC=gcc + +Install requirements with `pip` + +.. code-block:: bash + + pip install -r requirements/local.txt + +NodeJS/npm +---------- + +Install npm_. You can do this by installing from nodejs.org_, MacPorts, or +Homebrew: + +MacPorts:: + + sudo port install npm + +Homebrew:: + + brew install npm + +Configure Django and Databases +------------------------------ + +In the `config/settings` directory, there must be a file called +`local_untracked.py` that sets up databases and a number of other things. +To create and edit this file, start by copying over the template + +.. code-block:: bash + + cd config/settings + cp local_untracked.py.dist local_untracked.py + +Edit `local_untracked.py`. Open the file you created in your favorite editor. The PostgreSQL config section will look something like this: + +.. code-block:: python + + # postgres DB config + DATABASES = { + 'default': { + 'ENGINE': 'django.contrib.gis.db.backends.postgis', + 'NAME': 'seeddb', + 'USER': 'seeduser', + 'PASSWORD': 'seedpass', + 'HOST': 'localhost', + 'PORT': '5432', + } + } + +You may want to comment out the AWS settings. + +For Redis, edit the `CACHES` and `CELERY_BROKER_URL` values to look like this: + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + +MapQuest API Key +---------------- + +Register for a MapQuest API key: +``_ + +Visit the Manage Keys page: +``_ +Either create a new key or use the key initially provided. +Copy the "Consumer Key" into the target organizations MapQuest API Key field under the organization's settings page or directly within the DB. + +Run Django Migrations +--------------------- + +Change back to the root of the repository. Now run the migration script to set +up the database tables + +.. code-block:: bash + + export DJANGO_SETTINGS_MODULE=config.settings.dev + ./manage.py migrate + +Django Admin User +----------------- + +You need a Django admin (super) user. + +.. code-block:: bash + + ./manage.py create_default_user --username=admin@my.org --organization=seedorg --password=badpass + +Of course, you need to save this user/password somewhere, since this is what +you will use to login to the SEED website. + +If you want to do any API testing (and of course you do!), you will need to +add an API KEY for this user. You can do this in postgresql directly: + +.. code-block:: bash + + psql seeddb seeduser + seeddb=> update landing_seeduser set api_key='DEADBEEF' where id=1; + +The 'secret' key DEADBEEF is hard-coded into the test scripts. + +Install Redis +------------- + +You need to manually install Redis for Celery to work. + +MacPorts:: + + sudo port install redis + +Homebrew:: + + brew install redis + # follow the post install instructions to add to launchagents or + # call manually with `redis-server` + +Install JavaScript Dependencies +------------------------------- + +The JS dependencies are installed using node.js package management (npm). + +.. code-block:: bash + + npm install + +Start the Server +---------------- + +You should put the following statement in ~/.bashrc or add it to the +virtualenv post-activation script (e.g., in +`~/.virtualenvs/seed/bin/postactivate`). + +.. code-block:: bash + + export DJANGO_SETTINGS_MODULE=config.settings.dev + +The combination of Redis, Celery, and Django have been encapsulated in a +single shell script, which examines existing processes and does not start +duplicate instances: + +.. code-block:: bash + + ./bin/start-seed.sh + +When this script is done, the Django stand-alone server will be running in +the foreground. + +Login +----- + +Open your browser and navigate to http://127.0.0.1:8000 + +Login with the user/password you created before, e.g., `admin@my.org` and +`badpass`. + +.. note:: + + these steps have been combined into a script called `start-seed.sh`. + The script will also not start Celery or Redis if they already seem + to be running. diff --git a/docs/code_documentation/3.0.0/_sources/translation.rst.txt b/docs/code_documentation/3.0.0/_sources/translation.rst.txt new file mode 100644 index 00000000..b40ae388 --- /dev/null +++ b/docs/code_documentation/3.0.0/_sources/translation.rst.txt @@ -0,0 +1,88 @@ +Translating SEED +================ + +1. Update translations on `lokalise`_. + +2. Copy lokalise.yml.example to lokalise.yml. Update API token. + +3. Install lokalise locally + + .. code:: bash + + brew tap lokalise/cli-2 + brew install lokalise2 + +3. Run scripts if you have Lokalise CLI installed. If not, see scripts for manual steps. + + .. code:: bash + + script/get_python_translations.sh + script/get_angular_translations.sh + +4. Uncomment the ``useMissingTranslationHandlerLog`` line seed.js to log untranslated strings to the console for review + +5. Verify and commit changes + +**Note: The lokalize website is the canonical source of data. If you +change the locale files locally, then you need to push them to +lokalize.** + +TL;DR + +SEED is localized for more than just English, so a little more care is +needed as we add new UI. All translatable strings are held in either +per-language ``.json`` files (for Angular-controlled strings, which are +the majority), or ``.mo`` files (for strings supplied by Django). + +At render time, SEED will sniff out the browser's ``Accept:`` header. +Based on that, we choose the right file. The language files themselves +are key->value mappings from a translation "key" to a translated value. +Either Angular or Django will then swap that value into the DOM wherever +it sees the key. If no translation is available, the key remains in the +DOM. (There are some wrinkles with HTML styling and pluralization that +we'll review below). + +So, the basic flow on top of any new UI features is now: + +1. Tag any user-visible strings in the UI as "translatable." There are + currently 12 (!) ways in which to do this; see below. +2. Create the translation key at `lokalise`_. We're using lokalise + because it can smooth over differences in the file formats that + Angular and Django require, and is a nice tool for managing the + process of getting translations done by a native speaker: we can put + up screenshots to clarify how the translated phrase is used, track + translation progress, etc. +3. Get a translation done. As a placeholder, lokalise can provide an + auto-filled translation from Google Translate or a few other + services, but it's fairly straightforward to order a professional + translation through lokalise. +4. Pull new translation files into the right places in the source tree + and commit them. There are scripts under ``/scripts`` to make this + mostly automatic. +5. Visually check that the containing UI looks OK with the translated + string(s). Some languages (e.g., French, German) can be wordy relative + to English and cause UI elements like buttons to expand oddly. Adjust + the layout or adjust the translation as needed. + +.. _general-philosophies--style: + +General philosophies / style +---------------------------- + +Don't go crazy with indirection and interpolation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +It's probably better to err on the side of too many keys than to get +clever with interpolation or Angular expressions to avoid +near-duplicates of keys. The aim should be that there is at least one +place where a competent translator can see the whole string at once. + +Compare: + +:: + +

{$:: inventory_type == 'taxlots' ? + translations['INCLUDE_SHARED_TAXLOTS'] : + translations['INCLUDE_SHARED'] + +.. _lokalise: https://lokalise.com/project/3537487659ca9b1dce98a7.36378626/?view=multi diff --git a/docs/code_documentation/3.0.0/_static/_sphinx_javascript_frameworks_compat.js b/docs/code_documentation/3.0.0/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/docs/code_documentation/3.0.0/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/docs/code_documentation/3.0.0/_static/basic.css b/docs/code_documentation/3.0.0/_static/basic.css new file mode 100644 index 00000000..30fee9d0 --- /dev/null +++ b/docs/code_documentation/3.0.0/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/_static/css/badge_only.css b/docs/code_documentation/3.0.0/_static/css/badge_only.css new file mode 100644 index 00000000..c718cee4 --- /dev/null +++ b/docs/code_documentation/3.0.0/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/Roboto-Slab-Bold.woff b/docs/code_documentation/3.0.0/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/Roboto-Slab-Bold.woff2 b/docs/code_documentation/3.0.0/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/Roboto-Slab-Regular.woff b/docs/code_documentation/3.0.0/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/Roboto-Slab-Regular.woff2 b/docs/code_documentation/3.0.0/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/fontawesome-webfont.eot b/docs/code_documentation/3.0.0/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/fontawesome-webfont.svg b/docs/code_documentation/3.0.0/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/docs/code_documentation/3.0.0/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/fontawesome-webfont.ttf b/docs/code_documentation/3.0.0/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/fontawesome-webfont.woff b/docs/code_documentation/3.0.0/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/fontawesome-webfont.woff2 b/docs/code_documentation/3.0.0/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/lato-bold-italic.woff b/docs/code_documentation/3.0.0/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/css/fonts/lato-bold-italic.woff differ diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/lato-bold-italic.woff2 b/docs/code_documentation/3.0.0/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/lato-bold.woff b/docs/code_documentation/3.0.0/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/css/fonts/lato-bold.woff differ diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/lato-bold.woff2 b/docs/code_documentation/3.0.0/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/css/fonts/lato-bold.woff2 differ diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/lato-normal-italic.woff b/docs/code_documentation/3.0.0/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/css/fonts/lato-normal-italic.woff differ diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/lato-normal-italic.woff2 b/docs/code_documentation/3.0.0/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/lato-normal.woff b/docs/code_documentation/3.0.0/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/css/fonts/lato-normal.woff differ diff --git a/docs/code_documentation/3.0.0/_static/css/fonts/lato-normal.woff2 b/docs/code_documentation/3.0.0/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/css/fonts/lato-normal.woff2 differ diff --git a/docs/code_documentation/3.0.0/_static/css/theme.css b/docs/code_documentation/3.0.0/_static/css/theme.css new file mode 100644 index 00000000..19a446a0 --- /dev/null +++ b/docs/code_documentation/3.0.0/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/_static/doctools.js b/docs/code_documentation/3.0.0/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/docs/code_documentation/3.0.0/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs/code_documentation/3.0.0/_static/documentation_options.js b/docs/code_documentation/3.0.0/_static/documentation_options.js new file mode 100644 index 00000000..e1ef608c --- /dev/null +++ b/docs/code_documentation/3.0.0/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '3.0.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/_static/file.png b/docs/code_documentation/3.0.0/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/file.png differ diff --git a/docs/code_documentation/3.0.0/_static/graphviz.css b/docs/code_documentation/3.0.0/_static/graphviz.css new file mode 100644 index 00000000..8d81c02e --- /dev/null +++ b/docs/code_documentation/3.0.0/_static/graphviz.css @@ -0,0 +1,19 @@ +/* + * graphviz.css + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- graphviz extension. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +img.graphviz { + border: 0; + max-width: 100%; +} + +object.graphviz { + max-width: 100%; +} diff --git a/docs/code_documentation/3.0.0/_static/jquery.js b/docs/code_documentation/3.0.0/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/docs/code_documentation/3.0.0/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/_static/js/html5shiv.min.js b/docs/code_documentation/3.0.0/_static/js/html5shiv.min.js new file mode 100644 index 00000000..cd1c674f --- /dev/null +++ b/docs/code_documentation/3.0.0/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/_static/js/theme.js b/docs/code_documentation/3.0.0/_static/js/theme.js new file mode 100644 index 00000000..1fddb6ee --- /dev/null +++ b/docs/code_documentation/3.0.0/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/docs/code_documentation/3.0.0/_static/minus.png b/docs/code_documentation/3.0.0/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/minus.png differ diff --git a/docs/code_documentation/3.0.0/_static/plus.png b/docs/code_documentation/3.0.0/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/docs/code_documentation/3.0.0/_static/plus.png differ diff --git a/docs/code_documentation/3.0.0/_static/pygments.css b/docs/code_documentation/3.0.0/_static/pygments.css new file mode 100644 index 00000000..0d49244e --- /dev/null +++ b/docs/code_documentation/3.0.0/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/_static/searchtools.js b/docs/code_documentation/3.0.0/_static/searchtools.js new file mode 100644 index 00000000..7918c3fa --- /dev/null +++ b/docs/code_documentation/3.0.0/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/docs/code_documentation/3.0.0/_static/sphinx_highlight.js b/docs/code_documentation/3.0.0/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/docs/code_documentation/3.0.0/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/docs/code_documentation/3.0.0/api.html b/docs/code_documentation/3.0.0/api.html new file mode 100644 index 00000000..194d3f28 --- /dev/null +++ b/docs/code_documentation/3.0.0/api.html @@ -0,0 +1,185 @@ + + + + + + + API — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

API

+
+

Authentication

+

Authentication is handled via an encoded authorization token set in a HTTP header. +To request an API token, go to /app/#/profile/developer and click ‘Get a New API Key’.

+

Authenticate every API request with your username (email, all lowercase) and the API key via Basic Auth. +The header is sent in the form of Authorization: Basic <credentials>, where credentials is the base64 encoding of the email and key joined by a single colon :.

+

Using Python, use the requests library:

+
import requests
+
+result = requests.get('https://seed-platform.org/api/version/', auth=(user_email, api_key))
+print result.json()
+
+
+

Using curl, pass the username and API key as follows:

+
curl -u user_email:api_key http://seed-platform.org/api/version/
+
+
+

If authentication fails, the response’s status code will be 302, redirecting the user to /app/login.

+
+
+

Payloads

+

Many requests require a JSON-encoded payload and parameters in the query string of the url. A frequent +requirement is including the organization_id of the org you belong to. For example:

+
curl -u user_email:api_key https://seed-platform.org/api/v2/organizations/12/
+
+
+

Or in a JSON payload:

+
curl -u user_email:api_key \
+  -d '{"organization_id":6, "role": "viewer"}' \
+  https://seed-platform.org/api/v2/users/12/update_role/
+
+
+

Using Python:

+
params = {'organization_id': 6, 'role': 'viewer'}
+result = requests.post('https://seed-platform.org/api/v2/users/12/update_role/',
+                       data=json.dumps(params),
+                       auth=(user_email, api_key))
+print result.json()
+
+
+
+
+

Responses

+

Responses from all requests will be JSON-encoded objects, as specified in each endpoint’s documentation. +In the case of an error, most endpoints will return this instead of the expected payload (or an HTTP status code):

+
{
+    "status": "error",
+    "message": "explanation of the error here"
+}
+
+
+
+
+

API Endpoints

+

A list of interactive endpoints are available by accessing the API menu item on the left navigation +pane within you account on your SEED instance.

+

To view a list of non-interactive endpoints without an account, view swagger on the development server.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/aws.html b/docs/code_documentation/3.0.0/aws.html new file mode 100644 index 00000000..f0dc8237 --- /dev/null +++ b/docs/code_documentation/3.0.0/aws.html @@ -0,0 +1,275 @@ + + + + + + + AWS Setup — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

AWS Setup

+

Amazon Web Services (AWS) provides the preferred hosting for the SEED Platform.

+

seed is a Django Project and Django’s documentation is an excellent place for general +understanding of this project’s layout.

+
+

Prerequisites

+

Ubuntu server 18.04 LTS

+
+

Note

+

These instructions have not been updated for Ubuntu 18.04. It is recommended to use Docker-based deployments.

+
+
sudo apt-get update
+sudo apt-get upgrade
+sudo apt-get install -y libpq-dev python-dev python-pip libatlas-base-dev \
+gfortran build-essential g++ npm libxml2-dev libxslt1-dev git mercurial \
+libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python
+
+
+

PostgreSQL and Redis are not included in the above commands. For a quick installation on AWS it +is okay to install PostgreSQL and Redis locally on the AWS instance. If a more permanent and +scalable solution, it is recommended to use AWS’s hosted Redis (ElastiCache) and PostgreSQL service.

+
+

Note

+

postgresql >=9.4 is required to support JSON Type

+
+
# To install PostgreSQL and Redis locally
+sudo apt-get install redis-server
+sudo apt-get install postgresql postgresql-contrib
+
+
+
+

Amazon Web Services (AWS) Dependencies

+

The following AWS services can be used for SEED but are not required:

+
    +
  • RDS (PostgreSQL >=9.4)

  • +
  • ElastiCache (redis)

  • +
  • SES

  • +
+
+
+
+

Python Dependencies

+

Clone the SEED repository from github

+
$ git clone git@github.com:SEED-platform/seed.git
+
+
+

enter the repo and install the python dependencies from requirements

+
$ cd seed
+$ sudo pip install -r requirements/aws.txt
+
+
+
+
+

JavaScript Dependencies

+

npm is required to install the JS dependencies.

+
$ sudo apt-get install build-essential
+$ sudo apt-get install curl
+
+
+
$ npm install
+
+
+
+
+

Database Configuration

+

Copy the local_untracked.py.dist file in the config/settings directory to +config/settings/local_untracked.py, and add a DATABASES configuration with your database username, +password, host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database +instance you have manually installed within your infrastructure.

+
# Database
+DATABASES = {
+    'default': {
+        'ENGINE':'django.db.backends.postgresql_psycopg2',
+        'NAME': 'seed',
+        'USER': '',
+        'PASSWORD': '',
+        'HOST': '',
+        'PORT': '',
+    }
+}
+
+
+
+

Note

+

In the above database configuration, seed is the database name, this +is arbitrary and any valid name can be used as long as the database exists.

+
+

create the database within the postgres psql shell:

+
CREATE DATABASE seed;
+
+
+

or from the command line:

+
createdb seed
+
+
+

create the database tables and migrations:

+
python manage.py syncdb
+python manage.py migrate
+
+
+

create a superuser to access the system

+
$ python manage.py create_default_user --username=demo@example.com --organization=example --password=demo123
+
+
+
+

Note

+

Every user must be tied to an organization, visit /app/#/profile/admin +as the superuser to create parent organizations and add users to them.

+
+
+
+

Cache and Message Broker

+

The SEED project relies on redis for both cache and message brokering, and +is available as an AWS ElastiCache service. +local_untracked.py should be updated with the CACHES and CELERY_BROKER_URL +settings.

+
CELERY_BROKER_URL = 'redis://seed-core-cache.ntmprk.0001.usw2.cache.amazonaws.com:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+
+
+
+

Running Celery the Background Task Worker

+

Celery is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, celery +can be started:

+
celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/data_model.html b/docs/code_documentation/3.0.0/data_model.html new file mode 100644 index 00000000..b977adf8 --- /dev/null +++ b/docs/code_documentation/3.0.0/data_model.html @@ -0,0 +1,606 @@ + + + + + + + Data Model — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Data Model

+_images/case-a.webp +_images/case-b.webp +_images/case-c.webp +_images/case-d.webp +_images/data-model.webp +
+

Todo

+

Documentation below is out of state and needs updated.

+
+

Our primary data model is based on a tree structure with BuildingSnapshot +instances as nodes of the tree and the tip of the tree referenced by a +CanonicalBuilding.

+

Take the following example: a user has loaded a CSV file containing information +about one building and created the first BuildingSnapshot (BS0). At this point +in time, BS0 is linked to the first CanonicalBuilding (CB0), and CB0 is also +linked to BS0.

+
BS0 <-- CB0
+BS0 --> CB0
+
+
+

These relations are represented in the database as foreign keys from the +BuildingSnapshot table to the CanonicalBuilding table, and from the +CanonicalBuilding table to the BuildingSnapshot table.

+

The tree structure comes to fruition when a building, BS0 in our case, is +matched with a new building, say BS1, enters the system and is auto-matched.

+

Here BS1 entered the system and was matched with BS0. When a match occurs, +a new BuildingSnapshot is created, BS2, with the fields from the existing +BuildingSnapshot, BS0, and the new BuildingSnapshot, BS1, merged +together. If both the existing and new BuildingSnapshot have data for a +given field, the new record’s fields are preferred and merged into the child, B3.

+

The fields from new snapshot are preferred because that is the newer of the +two records from the perspective of the system. By preferring the most recent fields +this allows for evolving building snapshots over time. For example, if an existing +canonical record has a Site EUI value of 75 and some changes happen to a building +that cause this to change to 80 the user can submit a new record with that change.

+

All BuildingSnapshot instances point to a CanonicalBuilding.

+
BS0  BS1
+  \ /
+  BS2 <-- CB0
+
+BS0 --> CB0
+BS1 --> CB0
+BS2 --> CB0
+
+
+
+

parents and children

+

BuildingSnapshots also have linkage to other BuildingSnapshots in order to +keep track of their parents and children. This is represented in the +Django model as a many-to-many relation from BuildingSnapshot to BuildingSnapshot. +It is represented in the PostgreSQL database as an additional seed_buildingsnapshot_children +table.

+

In our case here, BS0 and BS1 would both have children BS2, and BS2 would +have parents BS0 and BS1.

+
+

Note

+

throughout most of the application, the search_buildings endpoint +is used to search or list active building. This is to say, buildings that +are pointed to by an active CanonicalBuilding. +The search_mapping_results endpoint allows the search of buildings +regardless of whether the BuildingSnapshot is pointed to by an active +CanonicalBuilding or not and this search is needed during the mapping +preview and matching sections of the application.

+
+

For illustration purposes let’s suppose BS2 and a new building BS3 match to form a child BS4.

+ + + + + + + + + + + + + + + + + + + + +

parent

child

BS0

BS2

BS1

BS2

BS2

BS4

BS3

BS4

+

And the corresponding tree would look like:

+
BS0  BS1
+  \ /
+  BS2  BS3
+    \  /
+     BS4 <-- CB0
+
+BS0 --> CB0
+BS1 --> CB0
+BS2 --> CB0
+BS3 --> CB0
+BS4 --> CB0
+
+
+
+

matching

+

During the auto-matching process, if a raw BuildingSnapshot matches an +existing BuildingSnapshot instance, then it will point to the existing +BuildingSnapshot instance’s CanonicalBuilding. In the case where there is no +existing BuildingSnapshot to match, a new CanonicalBuilding will be created, as +happened to B0 and C0 above.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

field

BS0

BS1

BS2 (child)

id1

11

11

11

id2

12

12

id3

13

13

id4

14

15

15

+
+
+
+

manual-matching vs auto-matching

+

Since BuildingSnapshots can be manually matched, there is the possibility for +two BuildingSnapshots each with an active CanonicalBuilding to match and the +system has to choose to move only one CanonicalBuilding to the tip of the tree +for the primary BuildingSnapshot and deactivate the secondary +BuildingSnapshot’s CanonicalBuilding.

+

Take for example:

+
BS0  BS1
+  \ /
+  BS2  BS3
+    \  /
+     BS4 <-- CB0 (active: True)         BS5 <-- CB1 (active: True)
+
+
+

If a user decides to manually match BS4 and BS5, the system will take the +primary BuildingSnapshot’s CanonicalBuilding and have it point to their +child and deactivate CB1. The deactivation is handled by setting a field +on the CanonicalBuilding instance, active, from True to False.

+

Here is what the tree would look like after the manual match of BS4 and +BS5:

+
BS0  BS1
+  \ /
+  BS2  BS3
+    \  /
+     BS4  BS5 <-- CB1 (active: False)
+       \  /
+        BS6 <-- CB0 (active: True)
+
+
+

Even though BS5 is pointed to by a CanonicalBuilding, CB1, BS5 will not be +returned by the normal search_buildings endpoint because the +CanonicalBuilding pointing to it has its field active set to False.

+
+

Note

+

anytime a match is unmatched the system will create a new +CanonicalBuilding or set an existing CanonicalBuilding’s active field to +True for any leaf BuildingSnapshot trees.

+
+
+
+

what really happens to the BuildingSnapshot table on import (and when)

+

The above is conceptually what happens but sometimes the devil is in the details. +Here is what happens to the BuildingSnapshot table in the database when records +are imported.

+

Every time a record is added at least two BuildingSnapshot records are created.

+

Consider the following simple record:

+ + + + + + + + + + + + + + + + + +

Property Id

Year Ending

Property Floor Area

Address 1

Release Date

499045

2000

1234

1 fake st

12/12/2000

+

The first thing the user is upload the file. When the user sees the +“Successful Upload!” dialog one record has been added to the +BuildingSnapshot table.

+

This new record has an id (73700 in this case) and a created and +modified timestamp. Then there are a lot of empty fields and a +source_type of 0. Then there is the extra_data column which contains +the contents of the record in key-value form:

+
+
Address 1:
+

“1 fake st”

+
+
Property Id:
+

“499045”

+
+
Year Ending:
+

“2000”

+
+
Release Date:
+

“12/12/2000”

+
+
Property Floor Area:
+

“1234”

+
+
+

And a corresponding extra_data_sources that looks like

+
+
Address 1:
+

73700

+
+
Property Id:
+

73700

+
+
Year Ending:
+

73700

+
+
Release Date:
+

73700

+
+
Property Floor Area:
+

73700

+
+
+

All of the fields that look like _source_id are also populated +with 73700 E.G. owner_postal_code_source_id.

+

The other fields of interest are the organization field which +is populated with the user’s default organization and the import_file_id +field which is populated with a reference to a data_importer_importfile record.

+

At this point the record has been created before the user hits the +“Continue to data mapping” button.

+

The second record (id = 73701) is created by the time the user gets to the screen +with the “Save Mappings” button. This second record has the following fields populated:

+
    +
  • id

  • +
  • created

  • +
  • modified

  • +
  • pm_property_id

  • +
  • year_ending

  • +
  • gross_floor_area

  • +
  • address_line_1

  • +
  • release_date

  • +
  • source_type (this is 2 instead of 0 as with the other record)

  • +
  • import_file_id

  • +
  • organization_id.

  • +
+

That is all. All other fields are empty. In this case that is all that happens.

+

Now consider the same user uploading a new file from the next year that looks like

+ + + + + + + + + + + + + + + + + +

Property Id

Year Ending

Property Floor Area

Address 1

Release Date

499045

2000

1234

1 fake st

12/12/2001

+

As before one new record is created on upload. This has id 73702 and follows the same +pattern as 73700. And similarly 73703 is created like 73701 before the “Save Mappings” +button appears.

+

However this time the system was able to make a match with an existing record. +After the user clicks the “Confirm mappings & start matching” button a new record +is created with ID 73704.

+

73704 is identical to 73703 (in terms of contents of the BuildingSnapshot table only) +with the following exceptions:

+
    +
  • created and modified timestamps are different

  • +
  • match type is populated and has a value of 1

  • +
  • confidence is populated and has a value of .9

  • +
  • source_type is 4 instead of 2

  • +
  • canonical_building_id is populated with a value

  • +
  • import_file_id is NULL

  • +
  • last_modified_by_id is populated with value 2 (This is a key into the landing_seeduser table)

  • +
  • address_line_1_source_id is 73701

  • +
  • gross_floor_area_source_id is populated with value 73701

  • +
  • pm_property_id_source_id is populated with 73701

  • +
  • release_date_source_id is populated with 73701

  • +
  • year_ending_source_id is populated with 73701

  • +
+
+
+

what really happens to the CanonicalBuilding table on import (and when)

+

In addition to the BuildingSnapshot table the CanonicalBuilding table is also updated +during the import process. To summarize the above 5 records were created in the +BuildingSnapshot table:

+
    +
  1. 73700 is created from the raw 2000 data

  2. +
  3. 73701 is the mapped 2000 data,

  4. +
  5. 73702 is created from the raw 2001 data

  6. +
  7. 73703 is the mapped 2001 data

  8. +
  9. 73704 is the result of merging the 2000 and 2001 data.

  10. +
+

In this process CanonicalBuilding is updated twice. First when the 2000 record is imported the +CanonicalBuilding gets populated with one new row at the end of the matching step. +I.E. when the user sees the “Load More Data” screen. At this point there is a new row that looks like

+ + + + + + + + + + + + + +

id

active

canonical_building_id

20505

TRUE

73701

+

At this point there is one new canonical building and that is the BuildingSnapshot with +id 73701. Next the user uploads the 2001 data. When the “Matching Results” screen +appears the CanonicalBuilding table has been updated. Now it looks like

+ + + + + + + + + + + + + +

id

active

canonical_building_id

20505

TRUE

73704

+

There is still only one canonical building but now it is the BuildingSnapshot record +that is the result of merging the 2000 and 2001 data: id = 73704.

+
+
+

organization

+

BuildingSnapshots belong to an Organization field that is a foreign key into the organization +model (orgs_organization in Postgres).

+

Many endpoints filter the buildings based on the organizations the requesting user +belongs to. E.G. get_buildings changes which fields are returned based on the +requesting user’s membership in the BuildingSnapshot’s organization.

+
+
+

*_source_id fields

+

Any field in the BuildingSnapshot table that is populated with data from a +submitted record will have a corresponding _source_id field. E.G +pm_property_id has pm_property_id_source_id, +address_line_1 has address_line_1_source_id, +etc…

+

These are foreign keys into the BuildingSnapshot that is the source of that +value. To extend the above table

+ + + + + + + + + + + + + + + + + + + + + + + +

field

BS0

BS1

BS2 (child)

BS2 (child) _source_id

id1

11

11

BS0

id2

12

12

BS1

+

NOTE: The BuildingSnapshot records made from the raw input file have all the +_source_id fields populated with that record’s ID. The non-canonical BuildingSnapshot +records created from the mapped data have none set. The canonical BuildingSnapshot +records that are the result of merging two records have only the _source_id fields +set where the record itself has data. E.G. in the above address_line_1 is set to +“1 fake st.” so there is a value in the canonical BuildingSnapshot’s address_line_1_source_id +field. However there is no block number so block_number_source_id is empty. This +is unlike the two raw BuildingSnapshot records who also have no block_number but +nevertheless have a block_number_source_id populated.

+
+
+

extra_data

+

The BuildingSnapshot model has many “named” fields. Fields like “address_line_1”, +“year_built”, and “pm_property_id”. However the users are allowed to submit files +with arbitrary fields. Some of those arbitrary fields can be mapped to “named” +fields. E.G. “Street Address” can usually be mapped to “Address Line 1”. +For all the fields that cannot be mapped like that there is the extra_data field.

+

extra_data is Django json field that serves as key-value storage for other +user-submitted fields. As with the other “named” fields there is a corresponding +extra_data_sources field that serves the same role as the other _source_id fields. +E.G. If a BuildingSnapshot has an extra_data field that looks like

+
+
an_unknown_field:
+

1

+
+
something_else:
+

2

+
+
+

It should have an extra_data_sources field that looks like

+
+
an_unknown_field:
+

some_BuildingSnapshot_id

+
+
something_else:
+

another_BuildingSnapshot_id

+
+
+
+
+

saving and possible data loss

+

When saving a Property file some fields that are truncated if too long. +The following are truncated to 255 characters

+
    +
  • jurisdiction_tax_lot_id

  • +
  • pm_property_id

  • +
  • custom_id_1

  • +
  • ubid

  • +
  • lot_number

  • +
  • block_number

  • +
  • district

  • +
  • owner

  • +
  • owner_email

  • +
  • owner_telephone

  • +
  • owner_address

  • +
  • owner_city_state

  • +
  • owner_postal_code

  • +
+

And the following are truncated to 255:

+
    +
  • property_name

  • +
  • address_line_1

  • +
  • address_line_2

  • +
  • city

  • +
  • postal_code

  • +
  • state_province

  • +
  • building_certification

  • +
+

No truncation happens to any of the fields stored in extra_data.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/data_quality.html b/docs/code_documentation/3.0.0/data_quality.html new file mode 100644 index 00000000..b5fc5bfe --- /dev/null +++ b/docs/code_documentation/3.0.0/data_quality.html @@ -0,0 +1,126 @@ + + + + + + + Data Quality — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Data Quality

+

Data quality checks are run after the data are paired, during import of Properties/TaxLots, or on-demand by selecting rows in the inventory +page and clicking the action button. This checks whether any default or user-defined Rules are broken or satisfied by Property/TaxLot records.

+

Notably, in most cases when data quality checks are run, Labels can be applied for any broken Rules that have a Label. +To elaborate, Rules can have an attached Label. When a data quality check is run, records that break one of these “Labeled Rules” +are then given that Label. The case where this Label attachment does not happen is during import due to performance reasons.

+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/deployment.html b/docs/code_documentation/3.0.0/deployment.html new file mode 100644 index 00000000..f6ff5016 --- /dev/null +++ b/docs/code_documentation/3.0.0/deployment.html @@ -0,0 +1,212 @@ + + + + + + + Deployment Guide — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Deployment Guide

+

SEED is intended to be installed on Linux instances in the cloud (e.g., AWS), and on local hardware. SEED Platform does not officially support Windows for production deployment. If this is desired, see the Django notes.

+ +
+

Migrations

+

Migrations are handles through Django; however, various versions have customs actions for the migrations. See the migrations page for more information.

+
+
+

Monitoring

+
+

Sentry

+

Sentry can monitor your webservers for any issues. To enable sentry add the following to +your local_untracked.py files after setting up your Sentry account on sentry.io.

+

The RAVEN_CONFIG is used for the backend and the SENTRY_JS_DSN is used for the frontend. At the moment, +it is recommended to setup two sentry projects, one for backend and one for frontend.

+
import sentry_sdk
+from sentry_sdk.integrations.django import DjangoIntegration
+from sentry_sdk.integrations.celery import CeleryIntegration
+
+sentry_sdk.init(
+    dsn="https://<user>@<key>.ingest.sentry.io/<job>",
+    integrations=[
+        DjangoIntegration(),
+        CeleryIntegration(),
+    ],
+
+    # Set traces_sample_rate to 1.0 to capture 100%
+    # of transactions for performance monitoring.
+    # We recommend adjusting this value in production.
+    traces_sample_rate=1.0,
+
+    # If you wish to associate users to errors (assuming you are using
+    # django.contrib.auth) you may enable sending PII data.
+    send_default_pii=True
+)
+
+SENTRY_JS_DSN = 'https://<key>@sentry.io/<job_id>'
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/developer_resources.html b/docs/code_documentation/3.0.0/developer_resources.html new file mode 100644 index 00000000..191b3048 --- /dev/null +++ b/docs/code_documentation/3.0.0/developer_resources.html @@ -0,0 +1,609 @@ + + + + + + + Developer Resources — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Developer Resources

+ +
+

General Notes

+
+

Pre-commit

+

We use precommit commits for formatting. Set it up locally with

+
pre-commit install
+
+
+
+
+

Ruff Settings

+

Ruff is used to statically verify code syntax. To run ruff locally call:

+
tox -e precommit -- ruff
+tox -e precommit -- ruff-format
+
+
+
+
+

Python Type Hints

+

Python type hints are beginning to be added to the SEED codebase. The benefits are +eliminating some accidental typing mistakes to prevent bugs as well as a better IDE +experience.

+
+

Usage

+

SEED does not require exhaustive type annotations, but it is recommended you add them if you +create any new functions or refactor any existing code where it might be beneficial (e.g. types +that appear ambiguous or that the IDE can’t determine) and not require a ton of additional effort.

+

When applicable, we recommend you use built-in collection types +such as list, dict or tuple instead of the capitalized types +from the typing module. You can also use TypedDict and NotRequired from the typing_extensions +package to specify the types of required/optional keys of dictionaries.

+

Common gotchas:

+
    +
  • If trying to annotate a class method with the class itself, import from __future__ import annotations

  • +
  • If you’re getting warnings about runtime errors due to a type name, make sure your IDE is set up to point to an environment with python 3.9

  • +
  • If you’re wasting time trying to please the type checker, feel free to throw # type: ignore on the problematic line (or at the top of the file to ignore all issues for that file)

  • +
+
+
+

Type Checking

+

CI currently runs static type checking on the codebase using mypy. For +your own IDE, we recommend the following extensions:

+
    +
  • VSCode: Pylance (uses Microsoft’s Pyright type checking)

  • +
+

To run the same typechecking applied in CI (i.e., using mypy) you can run the following

+
tox -e mypy
+
+
+
+
+
+
+

Django Notes

+
+

Adding New Fields to Database

+

Adding new fields to SEED can be complicated since SEED has a mix of typed fields (database fields) and extra data +fields. Follow the steps below to add new fields to the SEED database:

+
    +
  1. Add the field to the PropertyState or the TaxLotState model. Adding fields to the Property or TaxLot models is more complicated and not documented yet.

  2. +
  3. Add field to list in the following locations:

  4. +
+
    +
  • models/columns.py: Column.DATABASE_COLUMNS

  • +
  • TaxLotState.coparent or PropertyState.coparent: SQL query and keep_fields

  • +
+
    +
  1. Run ./manage.py makemigrations

  2. +
  3. Add in a Python script in the new migration to add in the new column into every organizations list of columns. Note that the new_db_fields will be the same as the data in the Column.DATABASE_COLUMNS that were added.

    +
    +
    def forwards(apps, schema_editor):
    +    Column = apps.get_model("seed", "Column")
    +    Organization = apps.get_model("orgs", "Organization")
    +
    +    new_db_fields = [
    +        {
    +            'column_name': 'geocoding_confidence',
    +            'table_name': 'PropertyState',
    +            'display_name': 'Geocoding Confidence',
    +            'column_description': 'Geocoding Confidence',
    +            'data_type': 'number',
    +        }, {
    +            'column_name': 'geocoding_confidence',
    +            'table_name': 'TaxLotState',
    +            'display_name': 'Geocoding Confidence',
    +            'column_description': 'Geocoding Confidence',
    +            'data_type': 'number',
    +        }
    +    ]
    +
    +    # Go through all the organizations
    +    for org in Organization.objects.all():
    +        for new_db_field in new_db_fields:
    +            columns = Column.objects.filter(
    +                organization_id=org.id,
    +                table_name=new_db_field['table_name'],
    +                column_name=new_db_field['column_name'],
    +                is_extra_data=False,
    +            )
    +
    +            if not columns.count():
    +                new_db_field['organization_id'] = org.id
    +                Column.objects.create(**new_db_field)
    +            elif columns.count() == 1:
    +                # If the column exists, then update the display_name and data_type if empty
    +                c = columns.first()
    +                if c.display_name is None or c.display_name == '':
    +                    c.display_name = new_db_field['display_name']
    +                if c.data_type is None or c.data_type == '' or c.data_type == 'None':
    +                    c.data_type = new_db_field['data_type']
    +                        for col in columns:
    +                # If the column exists, then update the column_description if empty
    +                if c.column_description is None or c.column_description == '':
    +                    c.column_description = new_db_field['column_description']
    +                c.save()
    +            else:
    +                print("  More than one column returned")
    +
    +
    +class Migration(migrations.Migration):
    +    dependencies = [
    +        ('seed', '0090_auto_20180425_1154'),
    +    ]
    +
    +    operations = [
    +        ... existing db migrations ...,
    +        migrations.RunPython(forwards),
    +    ]
    +
    +
    +
    +
  4. +
  5. Run migrations ./manage.py migrate

  6. +
  7. Run unit tests, fix failures. Below is a list of files that need to be fixed (this is not an exhaustive list)

  8. +
+
    +
  • test_mapping_data.py:test_keys

  • +
  • test_columns.py:test_column_retrieve_schema

  • +
  • test_columns.py:test_column_retrieve_db_fields

  • +
+
    +
  1. (Optional) Update example files to include new fields

  2. +
  3. Test import workflow with mapping to new fields

  4. +
+
+
+
+

NGINX Notes

+

Toggle maintenance mode to display a maintenance page and prevent access to all site resources including API endpoints:

+
docker exec seed_web ./docker/maintenance.sh on
+docker exec seed_web ./docker/maintenance.sh off
+
+
+
+
+

AngularJS Integration Notes

+
+

Template Tags

+

Angular and Django both use {{ and }} as variable delimiters, and thus the AngularJS variable delimiters are +renamed {$ and $}.

+
window.BE.apps.seed = angular.module('BE.seed', ['$interpolateProvider', ($interpolateProvider) => {
+  $interpolateProvider.startSymbol('{$');
+  $interpolateProvider.endSymbol('$}');
+}]);
+
+
+
+
+

Django CSRF Token and AJAX Requests

+

For ease of making angular $http requests, we automatically add the CSRF token to all $http requests as +recommended by http://django-angular.readthedocs.io/en/latest/integration.html#xmlhttprequest

+
window.BE.apps.seed.run(($http, $cookies) => {
+  $http.defaults.headers.common['X-CSRFToken'] = $cookies['csrftoken'];
+});
+
+
+
+
+

Routes and Partials or Views

+

Routes in static/seed/js/seed.js (the normal angularjs app.js)

+
SEED_app.config(['stateHelperProvider', '$urlRouterProvider', '$locationProvider', (stateHelperProvider, $urlRouterProvider, $locationProvider) => {
+  stateHelperProvider
+    .state({
+      name: 'home',
+      url: '/',
+      templateUrl: static_url + 'seed/partials/home.html'
+    })
+    .state({
+      name: 'profile',
+      url: '/profile',
+      templateUrl: static_url + 'seed/partials/profile.html',
+      controller: 'profile_controller',
+      resolve: {
+        auth_payload: ['auth_service', '$q', 'user_service', function (auth_service, $q, user_service) {
+          var organization_id = user_service.get_organization().id;
+          return auth_service.is_authorized(organization_id, ['requires_superuser']);
+        }],
+        user_profile_payload: ['user_service', function (user_service) {
+          return user_service.get_user_profile();
+        }]
+      }
+    });
+}]);
+
+
+

HTML partials in static/seed/partials/

+
+
+
+

Logging

+

Information about error logging can be found here - https://docs.djangoproject.com/en/1.7/topics/logging/

+

Below is a standard set of error messages from Django.

+

A logger is configured to have a log level. This log level describes the severity of +the messages that the logger will handle. Python defines the following log levels:

+
DEBUG: Low level system information for debugging purposes
+INFO: General system information
+WARNING: Information describing a minor problem that has occurred.
+ERROR: Information describing a major problem that has occurred.
+CRITICAL: Information describing a critical problem that has occurred.
+
+
+

Each message that is written to the logger is a Log Record. The log record is stored +in the web server & Celery

+
+
+

BEDES Compliance and Managing Columns

+

Columns that do not represent hardcoded fields in the application are represented using +a Django database model defined in the seed.models module. The goal of adding new columns +to the database is to create seed.models.Column records in the database for each column to +import. Currently, the list of Columns is dynamically populated by importing data.

+

There are default mappings for ESPM are located here:

+
+
+
+
+

Resetting the Database

+

This is a brief description of how to drop and re-create the database +for the seed application.

+

The first two commands below are commands distributed with the +Postgres database, and are not part of the SEED application. The third +command below will create the required database tables for SEED and +setup initial data that the application expects (e.g. initial columns for +BEDES). The last command below (spanning multiple lines) will create a +new superuser and organization that you can use to login to the +application, and from there create any other users or organizations +that you require.

+

Below are the commands for resetting the database and creating a new +user:

+
createuser -U seed seeduser
+
+psql -d postgres -U seeduser -c 'DROP DATABASE seed;'
+psql -d postgres -U seeduser -c 'CREATE DATABASE seed;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;'
+
+./manage.py migrate
+./manage.py create_default_user \
+    --username=demo@seed-platform.org \
+    --password=password \
+    --organization=testorg
+
+
+
+
+

Restoring a Database Dump

+
psql -d postgres -U seeduser -c 'DROP DATABASE seed;'
+psql -d postgres -U seeduser -c 'CREATE DATABASE seed;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;'
+psql -d seed -U seeduser -c 'SELECT timescaledb_pre_restore();'
+
+# restore a previous database dump (must be pg_restore 12+)
+pg_restore -d seed -U seeduser /backups/prod-backups/prod_20191203_000002.dump
+# if any errors appear during the pg_restore process check that the `installed_version` of the timescaledb extension where the database was dumped matches the extension version where it's being restored
+# `SELECT default_version, installed_version FROM pg_available_extensions WHERE name = 'timescaledb';`
+
+psql -d seed -U seeduser -c 'SELECT timescaledb_post_restore();'
+
+./manage.py migrate
+
+# if needed add a user to the database
+./manage.py create_default_user \
+    --username=demo@seed-platform.org \
+    --password=password \
+    --organization=testorg
+
+
+

If restoring a production backup to a different deployment update the site settings for password reset emails, and disable celerybeat Salesforce updates/emails:

+
./manage.py shell
+
+from django.contrib.sites.models import Site
+site = Site.objects.first()
+site.domain = 'dev1.seed-platform.org'
+site.name = 'SEED Dev1'
+site.save()
+
+from seed.models import Organization
+Organization.objects.filter(salesforce_enabled=True).update(salesforce_enabled=False)
+
+from django_celery_beat.models import PeriodicTask, PeriodicTasks
+PeriodicTask.objects.filter(enabled=True, name__startswith='salesforce_sync_org-').update(enabled=False)
+PeriodicTasks.update_changed()
+
+
+
+
+

Migrating the Database

+

Migrations are handles through Django; however, various versions have customs actions for the migrations. See the migrations page for more information based on the version of SEED.

+
+
+

Testing

+

JS tests can be run with Jasmine at the url /angular_js_tests/.

+

Python unit tests are run with

+
python manage.py test --settings=config.settings.test
+
+
+
+
Note on geocode-related testing:

Most of these tests use VCR.py and cassettes to capture and reuse recordings of HTTP requests and responses. Given that, unless you want to make changes and/or refresh the cassettes/recordings, there isn’t anything needed to run the geocode tests.

+

In the case that the geocoding logic/code is changed or you’d like to the verify the MapQuest API is still working as expected, you’ll need to run the tests with a small change. Namely, you’ll want to provide the tests with an API key via an environment variable called “TESTING_MAPQUEST_API_KEY” or within your local_untracked.py file with that same variable name.

+

In order to refresh the actual cassettes, you’ll just need to delete or move the old ones which can be found at “.seed/tests/data/vcr_cassettes”. The API key should be hidden within the cassettes, so these new cassettes can and should be pushed to GitHub.

+
+
+

Run coverage using

+
coverage run manage.py test --settings=config.settings.test
+coverage report --fail-under=83
+
+
+

Python compliance uses Ruff

+
tox -e precommit -- ruff
+tox -e precommit -- ruff-format
+
+
+

JavaScript compliance uses ESLint, SCSS compliance uses StyleLint, and HTML compliance uses Prettier

+
npm run lint
+npm run lint:fix
+
+
+
+
+

Building Documentation

+

Older versions of the source code documentation are (still) on readthedocs; however, newer versions are built and pushed to the seed-website repository manually. To build the documentation follow the script below:

+
cd docs
+rm -rf htmlout
+sphinx-build -b html source htmlout
+
+
+

For releasing, copy the htmlout directory into the seed-platform’s website repository under docs/code_documentation/<new_version>. Make sure to add the new documentation to the table in the docs/developer_resources.md.

+
+
+

Contribution Instructions / Best Practices

+

If this is the first time contributing and you are outside of the DOE National Lab system, then you will need to review and fill out the contribution agreement which is found in SEED’s Contribution Agreement in the GitHub repository

+

The desired workflow for development and submitting changes is the following:

+
    +
  1. Fork the repository on GitHub if you do not have access to the repository, otherwise, work within the https://github.com/seed-platform/seed repository.

  2. +
  3. Ensure there is a ticket/issue created for the work you are doing. Verify that the ticket is assigned to you and that it is part of the latest project board on the GitHub site (https://github.com/orgs/SEED-platform/projects).

  4. +
  5. Move the ticket/issue to ‘In Progress’ in the GitHub project tracker when you begin work

  6. +
  7. Create a branch off of develop (unless it is a hotfix, then branch of the appropriate tag). The recommended naming convention is <issue_id>-short-descriptive-name.

  8. +
  9. Make changes and write a test for the code added.

  10. +
  11. Make sure tests pass locally. Most branches created and pushed to GitHub will be tested automatically.

  12. +
  13. Upon completion of the work, create a pull request (PR) against the develop branch (or hotfix branch if applicable). In the PR description fill out the requested information and include the issue number (e.g., #1234).

  14. +
  15. +
    Assign one label to the PR (not the ticket/issue) in order to auto-populate change logs (e.g., Bug, Feature, Maintenance, Performance, DoNotPublish) This is required and CI will fail if not present.
      +
    • Bug (these will appear as “Bug Fixes” in the change log)

    • +
    • Feature (features will appear as “New Features” item in the change log)

    • +
    • Enhancement (these will appear as “Improvements” in the change log)

    • +
    • Maintenance (these will appear under “Maintenance” in the change log)

    • +
    • Performance (these will appear under “Maintenance” in the change log)

    • +
    • Documentation (these will appear under “Maintenance” in the change log)

    • +
    • Do not publish (these will no appear in the change log)

    • +
    +
    +
    +
  16. +
  17. Ensure all tests pass.

  18. +
  19. Assign a reviewer to the PR.

  20. +
  21. If the reviewer requests changes, then addresses changes and re-assign the reviewer as needed.

  22. +
  23. Once approved, merge the PR!

  24. +
  25. Move the related ticket(s)/issue(s) to the ‘Ready to Deploy’ column in the GitHub project tracker.

  26. +
+
+
+

Release Instructions

+

To make a release do the following:

+
    +
  1. Create a branch from develop to prepare the updates (e.g., 2.21.0-release-prep).

  2. +
  3. Update the root package.json file with the release version number, and then run npm install. Always use MAJOR.MINOR.RELEASE.

  4. +
  5. Update the docs/sources/migrations.rst file with any required actions.

  6. +
  7. Commit the changes and push the release prep branch to GitHub, then go to the Releases page to draft a new release which will generate the changelog.

  8. +
  9. Copy the GitHub changelog results into CHANGELOG.md. Cleanup the formatting and items as needed (make sure the spelling is correct, starts with a capital letter, if any PRs were missing the Do not publish label, etc.) and push the changelog update.

  10. +
  11. Make sure that any new UI needing localization has been tagged for translation, and that any new translation keys exist in the lokalise.com project. (see translation documentation).

  12. +
  13. Create PR for release preparation and merge after tests/reviews pass.

  14. +
  15. Create a new Release using the develop branch and new release number as the tag (https://github.com/SEED-platform/seed/releases). Include list of changes since previous release (e.g., the additions to CHANGELOG.md).

  16. +
  17. Locally, merge the develop branch into the main branch and push.

  18. +
  19. Verify that the Docker versions are built and pushed to Docker Hub (https://hub.docker.com/r/seedplatform/seed/tags/).

  20. +
  21. Publish the new documentation in the seed-platform website repository (see instructions above under Building Documentation).

  22. +
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/docker.html b/docs/code_documentation/3.0.0/docker.html new file mode 100644 index 00000000..10ed732f --- /dev/null +++ b/docs/code_documentation/3.0.0/docker.html @@ -0,0 +1,246 @@ + + + + + + + Docker Deployment on AWS — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Docker Deployment on AWS

+

Amazon Web Services (AWS) provides the preferred hosting for the SEED Platform.

+

seed is a Django Project and Django’s documentation is an excellent place for general +understanding of this project’s layout.

+
+

Installation

+

Ubuntu server 18.04 or newer with a m5ad.xlarge (if using in Production instance)

+
    +
  • After launching the instance, run the following commands to install docker.

  • +
+
# Install any upgrades
+sudo apt-get update
+sudo apt-get upgrade -y
+
+# Remove any old docker engines
+sudo apt-get remove docker docker-engine docker.io containerd runc
+
+# Install docker community edition
+sudo apt-get update
+sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
+curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
+sudo add-apt-repository \
+    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
+    $(lsb_release -cs) \
+    stable"
+
+sudo apt-get update
+sudo apt-get install -y docker-ce docker-ce-cli containerd.io
+# Add your user to the docker group
+sudo groupadd docker
+sudo usermod -aG docker $USER
+newgrp docker
+
+
+
+

Note

+

It is okay if the first command fails

+
+
    +
  • Verify that the DNS is working correctly. Run the following and verify the response lists IPs (v6 most likely)

  • +
+
# verify that the dns resolves
+docker run --rm seedplatform/seed getent hosts seed-platform.org
+# or
+docker run --rm tutum/dnsutils nslookup email.us-west-2.amazonaws.com
+
+
+
    +
  • Install Docker compose

  • +
+
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
+sudo chmod +x /usr/local/bin/docker-compose
+
+
+
    +
  • Checkout SEED (or install from the releases).

  • +
+
git clone
+
+
+
    +
  • Add in the Server setting into profile.d. For example add the content below (appropriately filled out) into /etc/profile.d/seed.sh

  • +
+
export POSTGRES_USER=seed
+export POSTGRES_DB=seed
+export POSTGRES_PASSWORD=GDEus3fasd1askj89QkAldjfX
+export POSTGRES_PORT=5432
+export SECRET_KEY="96=7jg%_&1-z9c9qwwu2@w$hb3r322yf3lz@*ekw-1@ly-%+^"
+
+# The admin user is only valid only until the database is restored
+export SEED_ADMIN_USER=user@seed-platform.org
+export SEED_ADMIN_PASSWORD="7FeBWal38*&k3jlfa92lakj8ih4"
+export SEED_ADMIN_ORG=default
+
+# For SES
+export AWS_ACCESS_KEY_ID=<AWS_ACCESS_KEY>
+export AWS_SECRET_ACCESS_KEY=<AWS_SECRET_KEY>
+export AWS_SES_REGION_NAME=us-west-2
+export AWS_SES_REGION_ENDPOINT=email.us-west-2.amazonaws.com
+export SERVER_EMAIL=user@seed-platform.org
+
+
+
    +
  • Before launching the first time, make sure the persistent volumes and the backup directory exist.

  • +
+
docker volume create --name=seed_pgdata
+docker volume create --name=seed_media
+
+mkdir -p $HOME/seed-backups
+
+
+
+

Note

+

Make sure to have the seed-backups in your path, otherwise the db-postgres container will not launch.

+
+
    +
  • Launch the project

  • +
+
cd <checkout dir>
+./deploy.sh
+
+
+
+
+

Deploying with Docker

+

The preferred way to deploy with Docker is using docker swarm and docker stack. +Look at the deploy.sh script for implementation details.

+

The short version is to simply run the command below. Note that the passing of the docker-compose.yml filename is not required if using docker-compose.local.yml.

+

`bash +./deploy.sh docker-compose.local.yml +`

+

If deploying using a custom docker-compose yml file, then simple replace the name in the command above.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/faq.html b/docs/code_documentation/3.0.0/faq.html new file mode 100644 index 00000000..ee1c663d --- /dev/null +++ b/docs/code_documentation/3.0.0/faq.html @@ -0,0 +1,190 @@ + + + + + + + Frequently Asked Questions — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Frequently Asked Questions

+

Here are some frequently asked questions and/or issues.

+ +
+

Questions

+
+

What is the SEED Platform?

+

The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity.

+

The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL.

+

The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions.

+

Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy.

+
+
+
+

Issues

+
+

Why is the domain set to example.com?

+

If you see example.com in the emails that are sent from your hosted version of SEED then you will +need to update your django sites object in the database.

+
$ ./manage.py shell
+
+from django.contrib.sites.models import Site
+one = Site.objects.all()[0]
+one.domain = 'newdomain.org'
+one.name = 'SEED'
+one.save()
+
+
+
+
+

Why aren’t the static assets being served correctly?

+

Make sure that your local_untracked.py file does not have STATICFILES_STORAGE set to anything. If so, +then comment out that section and redeploy/recollect/compress your static assets.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/genindex.html b/docs/code_documentation/3.0.0/genindex.html new file mode 100644 index 00000000..cc42e260 --- /dev/null +++ b/docs/code_documentation/3.0.0/genindex.html @@ -0,0 +1,2820 @@ + + + + + + Index — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | J + | K + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | U + | V + | W + | X + | Y + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

J

+ + + +
+ +

K

+ + + +
+ +

L

+ + + +
+ +

M

+ + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

Q

+ + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + + +
+ +

X

+ + +
+ +

Y

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/getting_started.html b/docs/code_documentation/3.0.0/getting_started.html new file mode 100644 index 00000000..c6e83e1e --- /dev/null +++ b/docs/code_documentation/3.0.0/getting_started.html @@ -0,0 +1,160 @@ + + + + + + + Getting Started — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/help.html b/docs/code_documentation/3.0.0/help.html new file mode 100644 index 00000000..0c9b9e73 --- /dev/null +++ b/docs/code_documentation/3.0.0/help.html @@ -0,0 +1,141 @@ + + + + + + + Help — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Help

+
+

For SEED Platform Users

+

Please visit our website for information, tutorials, and documentation to help you learn how to use SEED.

+

https://seed-platform.org

+

The SEED Users Forum is where you can review user announcements, workflow questions, and join to connect with other users.

+

https://lists.buildingenergytools.org/g/SEEDusers/topics

+

For general inquiries or help on a specific problem, please fill out a request on the building data tools website help desk and select SEED as the relevant tool:

+

https://buildingdata.energy.gov/#/help-desk

+
+
+

For SEED Platform Developers

+

The open-source code is available on the GitHub organization SEED-Platform and contains various repositories for the different components of the platform such as the main SEED application, a Python SEED client to communicate to SEED’s API and various example datasets.

+

https://github.com/SEED-platform

+

The SEED Developers Forum contains various topics and joining enables you to connect with other developers. It is recommended to join this forum to submit developer questions, features requests, and report issues as needed. Also, submitting issues on GitHub is encouraged.

+

https://lists.buildingenergytools.org/g/SEEDdevelopers/topics

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/index.html b/docs/code_documentation/3.0.0/index.html new file mode 100644 index 00000000..eb7d4ef0 --- /dev/null +++ b/docs/code_documentation/3.0.0/index.html @@ -0,0 +1,244 @@ + + + + + + + Standard Energy Efficiency Data (SEED) Platform — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Standard Energy Efficiency Data (SEED) Platform

+

The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity.

+

The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL.

+

The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions.

+

Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy.

+
+ +
+
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/kubernetes_deployment.html b/docs/code_documentation/3.0.0/kubernetes_deployment.html new file mode 100644 index 00000000..78e93254 --- /dev/null +++ b/docs/code_documentation/3.0.0/kubernetes_deployment.html @@ -0,0 +1,371 @@ + + + + + + + Kubernetes Deployment Guide with Helm — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Kubernetes Deployment Guide with Helm

+

Kubernetes is a robust container orchestration system for easy application deployment and management. Helm takes that a step further with by packaging up required helm “charts” into one deployment command.

+
+

Setup

+
+

Cluster

+

In order to deploy the SEED platform on a Kubernetes you will need “cluster” which will be configured by your cloud service of choice. Each installation will be slightly different depending on the service. +Below are links to quick-start guides for provisioning a cluster and connecting. These instructions are specifically for AWS, but after the Kubernetes cluster is launched, the helm commands can be used in +the same way.

+
    +
  • Amazon Web Services (AWS)

  • +
  • Google Cloud Platform (GCP)

  • +
  • Azure (AKS)

  • +
+
+

AWS CLI Configuration

+

Download and configure the AWS CLI with instructions: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html

+
aws configure
+AWS Access Key ID [None]: <insert key> (from account)
+AWS Secret Access Key [None]: <insert secret key> (from account)
+Default region name [None]: us-east-1
+Default output format [None]: json
+
+
+
+
+
+

Kubectl

+

Download and install Kubectl:

+
    +
  • Windows

  • +
  • +
    Mac (with Homebrew) brew install kubectl

    ` +brew install kubectl +`

    +
    +
    +
  • +
+

Kubectl is the main function in which you will be interfacing with your deployed application on your cluster. This CLI is what connects you to your cluster that you have just provisioned. +If your cloud service did not have you configure kubectl in your cluster setup, you can download it here. Once kubectl is installed and configured to your cluster +you can run some simple commands to ensure its working properly:

+
#View the cluster
+kubectl cluster-info
+
+#View pods, services and replicasets (will be empty until deploying an app)
+kubectl get all
+
+
+

All of the common kubectl commands can be found in these docs

+
+

Note

+

For those unfamiliar with CLIs, there are a number of GUI applications that are able to deploy on your stack with ease. One of which is Kubernetes native application called Dashboard UI or a third-party application called Octant brew install octant.

+
+
+
+

Helm

+

Helm organizes all of your Kubernetes deployment, service, and volume yml files into “charts” that can be deployed, managed, and published with simple commands. +To install Helm:

+ +
+
+

EKS Control (AWS Specific)

+

EKSCtl is a command line tool to manage Elastic Kubernetes clusters on AWS. If not using AWS, then disregard this section.

+ +

To launch a cluster on using EKSCts, run the following command in the terminal (assuming adequate permissions for the user). Also make sure to replace items in the <> brackets.

+
eksctl create cluster \
+--name <cluster-name> \
+--version 1.21 \
+--region us-east-1 \
+--node-type m5.large \
+--nodes 1 \
+--nodes-min 1 \
+--nodes-max 1 \
+--managed \
+--tags environment=<env-type, e.g., dev, prod>
+
+
+
+
+

Charts

+

SEED stores its charts in the charts directory of the Github Repo. There are two main charts that are deployed when starting SEED on Kubernetes.

+
    +
  • persistentvolumes - these are the volumes to store SEED media data and SEED Postgres data

  • +
  • seed - this stores all of the other deployment and service files for the application

  • +
+

Unlike persistentvolumes, the seed charts must be modified with user environment variables that will be forwarded to the docker container for deployment. +Before deployment, the user MUST set these variables to their desired values.

+

This chart contains the deployment specification for the SEED web container. Replace all the values in <>.

+
# Environment variables for the web container
+- env:
+    # AWS Email service variables to send emails to new users - can be removed if not using this functionality.
+    - name: AWS_ACCESS_KEY_ID
+      value: <access_key_id>
+    - name: AWS_SECRET_ACCESS_KEY
+      value: <secret_access_key>
+    - name: AWS_SES_REGION_NAME
+      value: us-west-2
+    - name: AWS_SES_REGION_ENDPOINT
+      value: email.us-west-2.amazonaws.com
+    - name: SERVER_EMAIL
+      value: info@seed-platform.org
+    # Django Variables
+    - name: DJANGO_SETTINGS_MODULE
+      value: config.settings.docker
+    - name: SECRET_KEY
+      value: <replace-secret-key>
+    - name: SEED_ADMIN_ORG
+      value: default
+    - name: SEED_ADMIN_PASSWORD
+      value: <super-secret-password>
+    - name: SEED_ADMIN_USER
+      value: <user@seed-platform.org>
+    # Postgres variables
+    - name: POSTGRES_DB
+      value: seed
+    - name: POSTGRES_PASSWORD
+      value: <super-secret-password> # must match db-postgres-deployment.yaml and web-celery-deployment.yaml
+    - name: POSTGRES_PORT
+      value: "5432"
+    - name: POSTGRES_USER
+      value: seeduser
+    # Bsyncr analysis variables
+    - name: BSYNCR_SERVER_PORT
+      value: "5000"
+    - name: BSYNCR_SERVER_HOST
+      value: bsyncr
+    # Sentry monitoring - remove if not applicable
+    - name: SENTRY_JS_DSN
+      value: <enter-dsn>
+    - name: SENTRY_RAVEN_DSN
+      value: <enter-dsn>
+    # Google self registration security - remove if not applicable
+    - name: GOOGLE_RECAPTCHA_SITE_KEY
+      value: <reCAPTCHA-site-key>
+    - name: GOOGLE_RECAPTCHA_SECRET_KEY
+      value: <reCAPTCHA-key>
+    image: seedplatform/seed:<insert deployment image version>
+    #versions can be found here https://github.com/SEED-platform/seed/releases/tag/v2.9.3
+
+
+

This chart contains the deployment specification for the Celery container to connect to Postgres. Replace the Postgres password to match web-deployment.

+
- name: POSTGRES_PASSWORD
+  value: <super-secret-password>  # must match db-postgres-deployment.yaml and web-celery-deployment.yaml
+
+
+

This chart contains the deployment specification for the bsyncr analysis server. Request a NOAA token from this website.

+
- name: NOAA_TOKEN
+  value: <token>
+
+
+
+
+
+

Deployment

+

Once you are connected to your cluster and have your settings configured with the environment variables of you choice in the charts, you are ready to deploy the app. +First, make sure that the correct context is selected which is needed if there is more than one cluster:

+
kubectl config get-contexts
+kubectl config use-context <context-name>
+
+
+

Deploy the site using the helm commands in the root of the charts directory.

+
    +
  • helm install --generate-name persistentvolumes

  • +
  • helm install --generate-name seed

  • +
+

You will be able to see SEED coming online with statuses like container creating, and running with:

+
    +
  • kubectl get all

  • +
+

Once all of the pods are running you will be able to hit the external ingress through the URL listed in the web service information. It should look something like

+
service/web           LoadBalancer   10.100.154.227   <my-unique-url>   80:32291/TCP
+
+
+
+
+

Managing Existing Clusters

+
+

Upgrade/Redeploy the Helm Stack

+

To upgrade or dedeploy a helm chart, first find the helm release that you want to upgrade, then run the upgrade with the selected chart.

+
helm list
+helm upgrade <cluster-name> ./seed
+
+
+
+
+

Managing the Kubernetes Cluster (AWS Specific)

+

Enable kubectl to talk to one of the created clusters by running the following command in the terminal after configuring the AWS credentials and cli.

+
aws eks --region <aws-region> update-kubeconfig --name <cluster-name>
+
+
+
+
+

Logging In

+

After a successful deployment in order to login you will need to create yourself as a user in the web container. To do this, we will exec into the container and run some Django commands. +* View all deployments and services, kubectl get all +* kubectl get pods +* kubectl exec -it <pod-id> -- bash

+

Now that we are in the container, we can make a user. +.. code-block:: bash

+
+

./manage.py create_default_user –username=admin@my.org –organization=seedorg –password=badpass

+
+

You can now use these credentials to log in to the SEED website.

+
+
+

Update web and web-celery

+

The command below will restart the pods and re-pull the docker images.

+
kubectl rollout restart deployment web && kubectl rollout restart deployment web-celery
+
+
+
+
+
+

Other Resources

+

Common kubectl actions can be found on the kubernetes website

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/license.html b/docs/code_documentation/3.0.0/license.html new file mode 100644 index 00000000..80559417 --- /dev/null +++ b/docs/code_documentation/3.0.0/license.html @@ -0,0 +1,187 @@ + + + + + + + License — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

License

+

SEED Platform™, Copyright (c) 2017, 2024 Alliance for Sustainable Energy, LLC, and other contributors. +All rights reserved.

+

Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met:

+

(1) Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer.

+

(2) Redistributions in binary form must reproduce the above copyright notice, this list of +conditions and the following disclaimer in the documentation and/or other materials provided +with the distribution.

+

(3) Neither the name of the copyright holder nor the names of its contributors may be used +to endorse or promote products derived from this software without specific prior written +permission.

+

(4) Other than as required in clauses (1) and (2), distributions in any form of modifications +or other derivative works may not use the “SEED Platform” trademark, “Standard Energy +Efficiency Data Platform”, “Standard Energy Efficiency Data”, “SEED”, or any other confusingly +similar designation without specific prior written permission from the U.S. Department of Energy.

+

(5) The name of the copyright holder(s), any contributors, the United States Government, the +United States Department of Energy, or any of their employees may not be used to endorse or +promote products derived from this software without specific prior written permission from the +respective party.

+

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS “AS IS” AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED STATES +DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE.

+

+

This program also includes the following licenses:

+

Copyright (c) 2014 - 2017 The Regents of the University of California, through +Lawrence Berkeley National Laboratory (subject to receipt of any required approvals +from the U.S. Department of Energy) and contributors. All rights reserved.

+
    +
  1. Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met:

    +
    +

    (1) Redistributions of source code must retain the copyright notice, this +list of conditions and the following disclaimer.

    +

    (2) Redistributions in binary form must reproduce the copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution.

    +

    (3) Neither the name of the University of California, Lawrence Berkeley +National Laboratory, U.S. Dept. of Energy nor the names of its +contributors may be used to endorse or promote products derived from this +software without specific prior written permission.

    +

    (4) Neither the names Standard Energy Efficiency Data Platform, Standard +Energy Efficiency Data, SEED Platform, SEED, derivatives thereof nor +designations containing these names, may be used to endorse or promote +products derived from this software without specific prior written +permission from the U.S. Dept. of Energy.

    +
    +
  2. +
  3. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  4. +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/linux.html b/docs/code_documentation/3.0.0/linux.html new file mode 100644 index 00000000..f1573321 --- /dev/null +++ b/docs/code_documentation/3.0.0/linux.html @@ -0,0 +1,400 @@ + + + + + + + General Linux Setup — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

General Linux Setup

+

While Amazon Web Services (AWS) provides the preferred hosting for SEED, +running on a bare-bones Linux server follows a similar setup, replacing the +AWS services with their Linux package counterparts, namely: PostgreSQL and +Redis.

+

SEED is a Django project and Django’s documentation +is an excellent place to general understanding of this project’s layout.

+
+

Prerequisites

+

Ubuntu server/desktop 16.04 or newer (18.04 recommended)

+

Install the following base packages to run SEED:

+
sudo add-apt-repository ppa:timescale/timescaledb-ppa
+sudo apt update
+sudo apt upgrade
+sudo apt install libpq-dev python3-dev python3-pip libatlas-base-dev \
+gfortran build-essential nodejs npm libxml2-dev libxslt1-dev git \
+libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python mercurial
+sudo apt install gdal-bin postgis
+sudo apt install redis-server
+sudo apt install timescaledb-postgresql-10 postgresql-contrib
+
+
+
+

Note

+

postgresql >=9.3 is required to support JSON Type

+
+
+
+

Configure PostgreSQL

+

Replace ‘seeddb’, ‘seeduser’ with desired db/user. By +default use password seedpass when prompted

+
$ sudo timescaledb-tune
+$ sudo service postgresql restart
+$ sudo su - postgres
+$ createuser -P "seeduser"
+$ createdb "seeddb" --owner="seeduser"
+$ psql
+postgres=# GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO "seeduser";
+postgres=# ALTER USER "seeduser" CREATEDB CREATEROLE SUPERUSER;
+postgres=# \q
+$ exit
+
+
+
+
+

Python Dependencies

+

clone the seed repository from github

+
$ git clone git@github.com:SEED-platform/seed.git
+
+
+

enter the repo and install the python dependencies from requirements

+
$ cd seed
+$ pip3 install -r requirements/local.txt
+
+
+
+
+

JavaScript Dependencies

+
$ npm install
+
+
+
+
+

Django Database Configuration

+

Copy the local_untracked.py.dist file in the config/settings directory to +config/settings/local_untracked.py, and add a DATABASES configuration with your database username, password, +host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database instance +you have manually installed within your infrastructure.

+
# Database
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.contrib.gis.db.backends.postgis',
+        'NAME': 'seeddb',
+        'USER': 'seeduser',
+        'PASSWORD': '<PASSWORD>',
+        'HOST': 'localhost',
+        'PORT': '5432',
+    }
+}
+
+
+
+

Note

+

Other databases could be used such as MySQL, but are not supported +due to the postgres-specific JSON Type

+
+

In in the above database configuration, seed is the database name, this is arbitrary and any valid name can be +used as long as the database exists. Enter the database name, user, password you set above.

+

The database settings can be tested using the Django management command, python3 manage.py dbshell to connect to the +configured database.

+

create the database tables and migrations:

+
$ python3 manage.py migrate
+
+
+
+
+

Cache and Message Broker

+

The SEED project relies on redis for both cache and message brokering, and +is available as an AWS ElastiCache service or with the redis-server +Linux package. (sudo apt install redis-server)

+

local_untracked.py should be updated with the CACHES and CELERY_BROKER_URL +settings.

+
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+
+
+
+

Creating the initial user

+

create a superuser to access the system

+
$ python3 manage.py create_default_user --username=admin@my.org --organization=lbnl --password=badpass
+
+
+
+

Note

+

Of course, you need to save this user/password somewhere, since this is what +you will use to login to the SEED website.

+

Every user must be tied to an organization, visit /app/#/profile/admin +as the superuser to create parent organizations and add users to them.

+
+
+
+

Running celery the background task worker

+

Celery is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, celery +can be started:

+
DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler
+
+
+
+
+

Running the development web server

+

The Django dev server (not for production use) can be a quick and easy way to +get an instance up and running. The dev server runs by default on port 8000 +and can be run on any port. See Django’s runserver documentation for more +options.

+
$ python3 manage.py runserver --settings=config.settings.dev
+
+
+
+
+

Running a production web server

+

Our recommended web server is uwsgi sitting behind nginx. The python package uwsgi is needed for this, and +should install to /usr/local/bin/uwsgi We recommend using dj-static to load static files.

+
+

Note

+

The use of the dev settings file is production ready, and should be +used for non-AWS installs with DEBUG set to False for production use.

+
+
$ pip3 install uwsgi dj-static
+
+
+

Generate static files:

+
$ python3 manage.py collectstatic --settings=config.settings.prod -i package.json -i package-lock.json -i node_modules/openlayers-ext/index.html
+
+
+

Update config/settings/local_untracked.py:

+
DEBUG = False
+# static files
+STATIC_ROOT = 'collected_static'
+STATIC_URL = '/static/'
+
+
+

Start the web server (this also starts celery):

+
$ ./bin/start-seed
+
+
+
+

Warning

+

Note that uwsgi has port set to 80. In a production setting, a dedicated web server such as nginx would be +receiving requests on port 80 and passing requests to uwsgi running on a different port, e.g 8000.

+
+
+
+

Environment Variables

+

The following environment variables can be set within the ~/.bashrc file to +override default Django settings.

+
export SENTRY_DSN=https://xyz@app.getsentry.com/123
+export DEBUG=False
+export ONLY_HTTPS=True
+
+
+
+
+

Mail Services

+
+

AWS SES Service

+

In the AWS setup, we can use SES to provide an email service for Django. The service is +configured in the config/settings/local_untracked.py:

+
EMAIL_BACKEND = 'django_ses.SESBackend'
+
+
+

In general, the following steps are needed to configure SES:

+
    +
  1. Access Amazon SES Console - Quickstart

  2. +
  3. Login to Amazon SES Console. Verify which region we are using (e.g., us-east-1)

  4. +
  5. Decide on email address that will be sending the emails and add them to the SES Verified Emails.

  6. +
  7. Test that SES works as expected (while in the SES sandbox). Note that you will need to add the sender and recipient emails to the verified emails while in the sandbox.

  8. +
  9. Update the local_untracked.py file or set the environment variables for the docker file.

  10. +
  11. Once ready, move the SES instance out of the sandbox. Following instructions here

  12. +
  13. (Optional) Set up Amazon Simple Notification Service (Amazon SNS) to notify you of bounced emails and other issues.

  14. +
  15. (Optional) Use the AWS Management Console to set up Easy DKIM, which is a way to authenticate your emails. Amazon SES console will have the values for SPF and DKIM that you need to put into your DNS.

  16. +
+
+
+

SMTP service

+

Many options for setting up your own SMTP service/server or using other SMTP +third party services are available and compatible including gmail. SMTP is not configured for working within Docker at the moment.

+
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
+
+
+
+
+
+

local_untracked.py

+
# PostgreSQL DB config
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.postgresql_psycopg2',
+        'NAME': 'seed',
+        'USER': 'your-username',
+        'PASSWORD': 'your-password',
+        'HOST': 'your-host',
+        'PORT': 'your-port',
+    }
+}
+
+# config for local storage backend
+DOMAIN_URLCONFS = {'default': 'config.urls'}
+
+CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+# SMTP config
+EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
+
+# static files
+STATIC_ROOT = 'collected_static'
+STATIC_URL = '/static/'
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/mapping.html b/docs/code_documentation/3.0.0/mapping.html new file mode 100644 index 00000000..1e6fe69d --- /dev/null +++ b/docs/code_documentation/3.0.0/mapping.html @@ -0,0 +1,166 @@ + + + + + + + Mapping — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Mapping

+

This document describes the set of calls that occur from the web client or API +down to the back-end for the process of mapping data into SEED.

+

An overview of the process is:

+
    +
  1. Import - A file is uploaded to the server

  2. +
  3. Save - The file is batched saved into the database as JSON data

  4. +
  5. Mapping - Mapping occurs on that file

  6. +
  7. Matching / Merging

  8. +
  9. Pairing

  10. +
+
+

Import

+

From the web UI, the import process invokes seed.views.main.save_raw_data to save the data. When the data is +done uploading, we need to know whether it is a Portfolio Manager file, so we can add metadata to the record in the +database. The end of the upload happens in seed.data_importer.views.DataImportBackend.upload_complete. At this +point, the request object has additional attributes for Portfolio Manager files. These are saved in the model +seed.data_importer.models.ImportFile.

+
+
+

Mapping

+

Once files are uploaded, file header columns need to be mapped to SEED columns. Mappings can be specified/decided manually for any particular file import, +or mapping profiles can be created and subsequently applied to any file imports.

+

When a column mapping profile is applied to an import file, file header columns defined in the profile must match exactly (spaces, lowercase, uppercase, etc.) +in order for the corresponding SEED column information to be used/mapped.

+
+
+

Matching

+
+

Todo

+

document

+
+
+
+

Pairing

+
+

Todo

+

document

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/matching.html b/docs/code_documentation/3.0.0/matching.html new file mode 100644 index 00000000..163ed96a --- /dev/null +++ b/docs/code_documentation/3.0.0/matching.html @@ -0,0 +1,243 @@ + + + + + + + Matching — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Matching

+
+

What is it?

+

Within SEED, matching refers to a possible relationship between at least 2 properties or at least 2 tax lots. +Two properties match if they have the same values for some specified field(s). +These specified fields are referred to as matching criteria, and each SEED organization has its +own set of matching criteria which is customizable by users.

+
+
+

Why does it exist?

+

At a high level, matching is used to identify if two or more property records are actually different +representations of the same property (or tax lots representing one tax lot). For example, within the same cycle, +two matching records, so one persists while the other is used and subsequently discarded to update the persisting record +(say if the building owner’s phone number changed). Or across different cycles, it’s possible that the +two records capture the same property at different times/cycles - this relationship is referred to as a link.

+
+
+

How and when is it used?

+
+

In-Cycle Merging

+

(This is different from manual merging.)

+

For records within the same cycle, there really shouldn’t be more than one +representation of the same property (or tax lot). As much as possible, the program +is set up to prevent this from happening by automatically merging matched +records together whenever they might occur in the same cycle.

+

Specifically, a merge of matches might need to occur after any of the following events:

+
    +
  1. The record has been manually edited.

  2. +
  3. The record was just created as a result of a manual merge (via the ‘Actions’ on the Properties or Tax Lots page).

  4. +
  5. The record has just been imported.

  6. +
+

The actual execution of merges includes a few additional, unrelated steps but, +in the scope of merging, the following occurs.

+

The record in the scenarios listed above is the “target” record. Any and all +matches found, excluding the “target”, are merged together first. If there are +overlapping values, priority is given to more recently updated records.

+

Once these matches (excluding the target) are merged together, the final step is +to merge the “target” record. In all but one case, choosing between overlapping +values gives priority to the “target”. That one case is when a record has just been +imported. Here, overlapping values follow merge protection rules set by +the user for an organization in this final step.

+
+
+

Linking (Across Cycles)

+

For records in different cycles, matches between these are considered links. +Links are used to connect snapshots of the same record year-over-year (at different time periods). +This allows for the analysis of how the record has changed over time.

+

In the case of properties, these links are used to associate meters to properties. +This means that adding meters to a property in one cycle will make those meters +accessible to that same property’s instance in all other cycles.

+

This association can be viewed in aggregate; all of the records within some selected cycles are +grouped and displayed with their links. Alternatively, this association can be viewed for particular linked +group; the linked records of this group are displayed by themselves.

+
+
+

Putting them Together, Match-Merge-Linking

+

As mentioned earlier, there is a rule or assumption that at most one representation of +the same record can exist in any given cycle.

+

This avoids unresolvable situations that would prevent year-over-year analysis. +In the most simple case, a record in Cycle A matches two records in Cycle B. +SEED wouldn’t know which of the two records in Cycle B should be +the “snapshot” for this time period.

+

For this reason, in-cycle match merging always occurs before cross-cycle match linking. +So when searches for links do happen, ambiguous cases have already been resolved.

+

For an individual record, these are the following cases in which a +match-merge-link is automatically run: +1. Explicit triggering (from the Property/TaxLot Detail page) +2. After editing (in the Property/TaxLot Detail page) +3. After manual merging (in the Properties/Tax Lots list page). Explicitly +specified merges happen as chosen by the user. Then, if the resulting record has +matches, merges and/or linking happens. +4. When importing a record. If the incoming record has matches, +merges and/or linking happens.

+

For a whole organization, a match-merge-link round for all records in that +organization is run in the following cases: +1. During the original deployment of this feature - This happens in order to +initially normalize the existing data and establish all initial links. +2. Whenever a user changes matching criteria - This happens in order to +re-normalize existing data and reestablish links. As of this writing, before +committing matching criteria changes, a user can view a preview of how their +records will be affected as these are difficult to reverse.

+
+
+

Note on In-Cycle Not-merged Matches

+

Even though the application tries it’s best to have only one representative record per property +(or tax lot) per Cycle, it’s possible for there to exist matches that were not merged. +This can happen if a user manually unmerges a record after a (manual or automatic) merge occurs. +If this happens, and there exists two records that match each other but are not merged, +both records are completely unlinked. Without user intervention such as editing +one of the matching criteria values, these will be merged and linked as described +above next time the system finds them during a match search.

+
+
+
+

Match Searching in Depth

+

Though they accomplish the same goal, the process for merging is very different between the last case, importing, +and the first 2 cases, manual edit or manual merge.

+

In the case of manual merging or editing, this process accounts for the fact that these are records that already exist. +Specifically, they may have associations such as labels, notes, pairings, and for properties, meters. +So during a subsequent match search leading to a merge of two or more records, all of these “old” associations are +carried over to the final record once merges are complete.

+

In the case of importing, considerations must be taken for the fact that, in most cases, multiple records +are being imported together. Also, since this is the entry point for records, it’s possible that a user might +accidentally try to import the same record snapshot twice - where all the record values are the same as another +existing record (as opposed to just having the same values for matching criteria fields). So on import, the process is as follows:

+
    +
  1. Amongst only the incoming records, duplicates (of other incoming or existing) are flagged and ignored.

  2. +
  3. Amongst only the incoming records, matching records are merged together.

  4. +
  5. Amongst all records in the same Cycle, incoming records that match an existing record gets merged with priority to that existing record. If the incoming record has multiple existing matches, the existing matches are merged together in latest updated order first while also combining any other associations (labels, notes, etc.) just as in the manual merge or edit cases. Since the incoming record is new, it doesn’t have any of the other associations.

  6. +
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/migrations.html b/docs/code_documentation/3.0.0/migrations.html new file mode 100644 index 00000000..589cd9a1 --- /dev/null +++ b/docs/code_documentation/3.0.0/migrations.html @@ -0,0 +1,535 @@ + + + + + + + Migrations — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Migrations

+

Django handles the migration of the database very well; however, there are various changes to SEED that may require some custom (manual) migrations. The migration documentation includes the required changes based on deployment and development for each release.

+
+

Version Develop

+

In order to support Redis passwords, the configuration of the Redis/Celery settings changed a bit. +You will need to add the following to your local_untracked.py configuration file. If you are using +Docker then you will not need to do this.

+
CELERY_RESULT_BACKEND = CELERY_BROKER_URL
+
+
+

If you are using a password, then in your local_untracked.py configuration, add the password to +the CELERY_BROKER_URL. Your final configuration should look like the following in your +local_untracked.py file

+
CELERY_BROKER_URL = 'redis://:password@127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+CELERY_RESULT_BACKEND = CELERY_BROKER_URL
+CELERY_TASK_DEFAULT_QUEUE = 'seed-local'
+CELERY_TASK_QUEUES = (
+    Queue(
+        CELERY_TASK_DEFAULT_QUEUE,
+        Exchange(CELERY_TASK_DEFAULT_QUEUE),
+        routing_key=CELERY_TASK_DEFAULT_QUEUE
+    ),
+)
+
+
+
+
+

Version 3.0.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 3.0.0-beta.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.22.0

+
    +
  • Run ./manage.py migrate.

  • +
  • +
    There is a Redis dependency update in this release that requires users and deployments to modify their settings’ CACHES config.
      +
    1. Update your dependencies with pip install -r requirements/base.txt

    2. +
    3. Update the CACHES BACKEND property to django_redis.cache.RedisCache

    4. +
    5. Update the CACHES LOCATION property to match the redis-py native URL notation for connection strings, including the redis protocol and database number. e.g. redis://localhost:6379/1

    6. +
    +

    Since the CELERY_BROKER_URL setting must also be in the same format, it may be helpful to configure that setting first and then reference it in the caches LOCATION parameter.

    +
    +
    +
  • +
  • See the PR for an example migration.

  • +
+
+
+

Version 2.21.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.20.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.20.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
  • There is a single long running migration related to importing census tract disadvantaged community data. This migration should take around 7 minutes to complete.

  • +
+
+
+

Version 2.19.0

+
    +
  • Run ./manage.py migrate.

  • +
  • +
    There is a new migration in this release that requires column names to be unique across organization, table_name, and is_extra_data. This migration will fail if there are duplicate column names. If you have duplicate column names, you will need to manually fix them in your database before running the migration. The following steps will help you identify and fix the duplicate column names:
      +
    • Check the organization age to gauge the impact of the change. If it is a deprecated org, impact of the change will be low. Often this issue arose in older organizations when units were not part of the columns. The old mapping columns were not upserts with the units, so typically the columns impacted are the ones with units.

    • +
    • Query the seed_column table for the organization and column name displayed on the screen (e.g., organization_id = 300 and column_name = ‘Source EUI (kBtu/ft2)’). If there is no table_name set, it is likely an import file column name and can easily be cleaned up without causing issues. In such cases, there will be two rows, and you want to keep the one with the units_pint column set.

    • +
    • More complex columns may require deleting or updating the column_id in the seed_columnmapping_* tables. If there is a foreign key constraint with seed_columnmapping_*, take note of the ID you want to remove and the ID you want it to be replaced with (preferably keep the one with units_pint).

    • +
    • +
      If the constraint is on seed_columnmapping_column_raw:
        +
      • The field should be an import file column (i.e., no table_name item). Query for the old column in seed_columnmapping_column_raw (e.g., column_name = <old_id>).

      • +
      • Replace the old ID with the new one. If it errors because it already exists, then the row can be deleted.

      • +
      • Return to the seed_column table and remove the old ID.

      • +
      +
      +
      +
    • +
    • +
      If the constraint is on seed_columnmapping_column_mapped:
        +
      • The mapped column should have a table_name in the field. If not, it is likely an older organization.

      • +
      • If there is no table_name, remove the row from the seed_columnmapping_column_mapped table.

      • +
      • Return to the seed_column table and remove the old ID.

      • +
      +
      +
      +
    • +
    +
    +
    +
  • +
+
+
+

Version 2.18.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.18.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.4

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.3

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.2

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.16.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.15.2

+
    +
  • There are no migrations needed for this version.

  • +
+
+
+

Version 2.15.1

+
    +
  • There are no migrations needed for this version.

  • +
+
+
+

Version 2.15.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.14.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.13.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.12.0 - 2.12.4

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.11.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.10.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.7.3 to 2.9.0

+
    +
  • The migrations should work without additional support. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.7.2

+
    +
  • The migrations should work without additional support. Simply run ./manage.py migrate. There are no manual migrations needed.

  • +
  • Note the Important Note in Version 2.7.1 migration below which may require the need to run a “fake” migration

  • +
+
+
+

Version 2.7.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+

Important Note:

+

If upgrading from < 2.7.0 to >= 2.7.1 you may encounter a failed migration with 0118_match_merge_link_all_orgs. This is expected if the database is several versions behind, and it effectively reorders migration 118 to run after all other migrations have completed to prepare your database to recognize properties and taxlots across multiple cycles. Run the following code manually to fully migrate:

+
    +
  1. ./manage.py migrate --fake seed 0118_match_merge_link_all_orgs

  2. +
  3. ./manage.py migrate

  4. +
  5. ./manage.py shell

    +
    +
    from seed.lib.superperms.orgs.models import Organization
    +from seed.utils.match import whole_org_match_merge_link
    +
    +for org in Organization.objects.all():
    +    whole_org_match_merge_link(org.id, 'PropertyState')
    +    whole_org_match_merge_link(org.id, 'TaxLotState')
    +
    +
    +
    +
  6. +
+
+
+

Version 2.7.0

+
    +
  • This migration will run a match/merge/pair/link method upon migration. Make sure to run the migration manually and not inside of the docker container using the ./deploy.sh script.

  • +
  • Make sure to backup the database before performing the migration.

  • +
  • Run ./manage.py migrate.

  • +
+
+
+

Version 2.6.1

+
    +
  • The migrations should work without additional support. Simply run ./manage.py migrate. There are no manual migrations needed for the 2.6.1 release.

  • +
+
+
+

Version 2.6.0

+

Version 2.6.0 includes support for meters and time series data storage. In order to use this release +you must first install TimescaleDB.

+
+

Docker-based Deployment

+

Docker-based deployments shouldn’t require running any additional commands for installation. The +timescaledb installation will happen automatically when updating the postgres container. Also, +the installation of the extension occurs in a Django migration.

+
+
+

Ubuntu

+
sudo add-apt-repository ppa:timescale/timescaledb-ppa
+sudo apt update
+sudo apt install timescaledb-postgresql-10
+sudo timescaledb-tune
+sudo service postgresql restart
+
+
+
+
+

Max OSX

+
brew tap timescale/tap
+brew install timescaledb
+/usr/local/bin/timescaledb_move.sh
+timescaledb-tune
+brew services restart postgresql
+
+
+
+
+
+

Version 2.5.2

+
    +
  • There are no manual migrations that are needed. The ./manage.py migrate command may take awhile to run since the migration requires the recalculation of all the normalized addresses to parse bldg correct and to cast the result as a string and not a bytestring.

  • +
+
+
+

Version 2.5.1

+
    +
  • The migrations should work by simply running ./manage.py migrate. There are no manual migrations needed for the 2.5.1 release.

  • +
+
+
+

Version 2.5.0

+
+

Docker-based Deployment

+
    +
  • Add the MapQuest API key to your organization.

  • +
  • On deployment, the error below is indicative that you need to install the extensions in the postgres database. Run docker exec <postgres_container_id> update-postgis.sh.

    +
    +

    django.db.utils.OperationalError: could not open extension control file “/usr/share/postgresql/11/extension/postgis.control”: No such file or directory

    +
    +
  • +
  • If you are using a copied version of the docker-compose.yml file, then you need to change 127.0.0.1:5000/postgres to 127.0.0.1:5000/postgres-seed

  • +
+
+
+

Development

+
    +
  • Delete your bower directory rm -rf seed/static/vendors.

  • +
  • Delete your css directory rm -rf seed/static/seed/css.

  • +
  • Remove these lines from local_untracked.py if you have them.

  • +
+
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
+STATICFILES_STORAGE = DEFAULT_FILE_STORAGE
+
+
+
    +
  • Run pip3 install -r requirements/local.txt.

  • +
  • Run npm install from root checkout of SEED.

  • +
  • If testing geocoding, then sign up for as a MapQuest Developer and create a new MapQuest Key.

  • +
  • Add the key to the organization that you are using in development.

  • +
  • Update your DATABASES engine to be django.contrib.gis.db.backends.postgis

  • +
+
DATABASES = {
+    'default': {
+        'ENGINE': 'django.contrib.gis.db.backends.postgis',
+        'NAME': 'seeddb',
+        'USER': 'seeduser',
+        'PASSWORD': 'seedpass',
+        'HOST': 'localhost',
+        'PORT': '5432',
+    }
+}
+
+
+
    +
  • Run ./manage.py migrate

  • +
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules.html b/docs/code_documentation/3.0.0/modules.html new file mode 100644 index 00000000..98243602 --- /dev/null +++ b/docs/code_documentation/3.0.0/modules.html @@ -0,0 +1,521 @@ + + + + + + + Modules — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Modules

+
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/config.html b/docs/code_documentation/3.0.0/modules/config.html new file mode 100644 index 00000000..f8d8a11b --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/config.html @@ -0,0 +1,217 @@ + + + + + + + Configuration — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Configuration

+
+

Submodules

+
+
+

Template Context

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+config.template_context.sentry_js(request)
+
+ +
+
+config.template_context.session_key(request)
+
+ +
+
+

Tests

+
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+config.utils.de_camel_case(name)
+
+ +
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+config.views.robots_txt(request, allow=False)
+
+ +
+
+

WSGI

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

:description WSGI config for config project.

+

This module contains the WSGI application used by Django’s development server +and any production WSGI deployments. It should expose a module-level variable +named application. Django’s runserver and runfcgi commands discover +this application via the WSGI_APPLICATION setting.

+

Usually you will have the standard Django WSGI application here, but it also +might make sense to replace the whole Django WSGI application with a custom one +that later delegates to the Django one. For example, you could introduce WSGI +middleware here, or combine a Django application with an application of another +framework.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.cleansing.html b/docs/code_documentation/3.0.0/modules/seed.cleansing.html new file mode 100644 index 00000000..1ae3e28f --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.cleansing.html @@ -0,0 +1,915 @@ + + + + + + + Data Quality Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Data Quality Package

+
+

Inheritance

+
+
+

Submodules

+
+
+

Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+exception seed.models.data_quality.ComparisonError
+

Bases: Exception

+
+ +
+
+class seed.models.data_quality.DataQualityCheck(*args, **kwargs)
+

Bases: Model

+

Object that stores the high level configuration per organization of the DataQualityCheck

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+REQUIRED_FIELDS = {'PropertyState': ['address_line_1', 'custom_id_1', 'pm_property_id'], 'TaxLotState': ['address_line_1', 'custom_id_1', 'jurisdiction_tax_lot_id']}
+
+ +
+
+add_invalid_geometry_entry_provided(row_id, rule, display_name, value)
+
+ +
+
+add_result_comparison_error(row_id, rule, display_name, value, rule_check)
+
+ +
+
+add_result_dimension_error(row_id, rule, display_name, value)
+
+ +
+
+add_result_is_null(row_id, rule, display_name, value)
+
+ +
+
+add_result_max_error(row_id, rule, display_name, value, rule_max)
+
+ +
+
+add_result_min_error(row_id, rule, display_name, value, rule_min)
+
+ +
+
+add_result_missing_and_none(row_id, rule, display_name, value)
+
+ +
+
+add_result_missing_req(row_id, rule, display_name, value)
+
+ +
+
+add_result_string_error(row_id, rule, display_name, value)
+
+ +
+
+add_result_type_error(row_id, rule, display_name, value)
+
+ +
+
+add_rule(rule)
+

Add a new rule to the Data Quality Checks

+
+
Parameters:
+

rule – dict to be added as a new rule

+
+
Returns:
+

None

+
+
+
+ +
+
+add_rule_if_new(rule)
+

Add a new rule to the Data Quality Checks only if rule does not exist

+
+
Parameters:
+

rule – dict to be added as a new rule

+
+
Returns:
+

None

+
+
+
+ +
+
+static cache_key(identifier, organization_id)
+

Static method to return the location of the data_quality results from redis.

+
+
Parameters:
+

identifier – Import file primary key

+
+
Returns:
+

+
+
+
+ +
+
+check_data(record_type, rows)
+

Send in data as a queryset from the Property/Taxlot ids.

+
+
Parameters:
+
    +
  • record_type – one of PropertyState | TaxLotState

  • +
  • rows – rows of data to be checked for data quality

  • +
+
+
Returns:
+

None

+
+
+
+ +
+
+get_fieldnames(record_type)
+

Get fieldnames to apply to results.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+static initialize_cache(identifier, organization_id)
+

Initialize the cache for storing the results. This is called before the +celery tasks are chunked up.

+

The cache_key is different than the identifier. The cache_key is where all the results are +to be stored for the data quality checks, the identifier, is the random number (or specified +value that is used to identifier both the progress and the data storage

+
+
Parameters:
+

identifier – Identifier for cache, if None, then creates a random one

+
+
Returns:
+

list, [cache_key and the identifier]

+
+
+
+ +
+
+initialize_rules()
+

Initialize the default rules for a DataQualityCheck object

+
+
Returns:
+

None

+
+
+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+remove_all_rules()
+

Removes all the rules associated with this DataQualityCheck instance.

+
+
Returns:
+

None

+
+
+
+ +
+
+remove_status_label(label_class, rule, linked_id)
+

Remove label because it did not match any of the range exceptions

+
+
Parameters:
+
    +
  • label_class – statuslabel object, either property label or taxlot label

  • +
  • rule – rule object

  • +
  • linked_id – id of propertystate or taxlotstate object

  • +
+
+
Returns:
+

boolean, if labeled was applied

+
+
+
+ +
+
+reset_all_rules()
+

Delete all rules and reinitialize the default set of rules

+
+
Returns:
+

None

+
+
+
+ +
+
+reset_default_rules()
+

Reset only the default rules

+
+
Returns:
+

+
+
+
+ +
+
+reset_results()
+
+ +
+
+classmethod retrieve(organization_id)
+

DataQualityCheck was previously a simple object but has been migrated to a django model. +This method ensures that the data quality model will be backwards compatible.

+

This is the preferred method to initialize a new object.

+
+
Parameters:
+

organization – instance of Organization

+
+
Returns:
+

obj, DataQualityCheck

+
+
+
+ +
+
+retrieve_result_by_address(address)
+

Retrieve the results of the data quality checks for a specific address.

+
+
Parameters:
+

address – string, address to find the result for

+
+
Returns:
+

dict, results of data quality check for specific building

+
+
+
+ +
+
+retrieve_result_by_tax_lot_id(tax_lot_id)
+

Retrieve the results of the data quality checks by the jurisdiction ID.

+
+
Parameters:
+

tax_lot_id – string, jurisdiction tax lot id

+
+
Returns:
+

dict, results of data quality check for specific building

+
+
+
+ +
+
+rules
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+save_to_cache(identifier, organization_id)
+

Save the results to the cache database. The data in the cache are +stored as a list of dictionaries. The data in this class are stored as +a dict of dict. This is important to remember because the data from the +cache cannot be simply loaded into the above structure.

+
+
Parameters:
+

identifier – Import file primary key

+
+
Returns:
+

None

+
+
+
+ +
+
+update_status_label(label_class, rule, linked_id, row_id, add_to_results=True)
+
+
Parameters:
+
    +
  • label_class – statuslabel object, either propertyview label or taxlotview label

  • +
  • rule – rule object

  • +
  • linked_id – id of propertyview or taxlotview object

  • +
  • row_id

  • +
  • add_to_results – bool

  • +
+
+
Returns:
+

boolean, if labeled was applied

+
+
+
+ +
+ +
+
+exception seed.models.data_quality.DataQualityTypeCastError
+

Bases: Exception

+
+ +
+
+class seed.models.data_quality.Rule(*args, **kwargs)
+

Bases: Model

+

Rules for DataQualityCheck

+
+
+DATA_TYPES = [(0, 'number'), (1, 'string'), (2, 'date'), (3, 'year'), (4, 'area'), (5, 'eui')]
+
+ +
+
+DEFAULT_RULES = [{'condition': 'not_null', 'data_type': 1, 'field': 'address_line_1', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'not_null', 'data_type': 1, 'field': 'pm_property_id', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'not_null', 'field': 'custom_id_1', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'not_null', 'field': 'jurisdiction_tax_lot_id', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'TaxLotState'}, {'condition': 'not_null', 'data_type': 1, 'field': 'address_line_1', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'TaxLotState'}, {'condition': 'range', 'data_type': 4, 'field': 'conditioned_floor_area', 'max': 7000000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 4, 'field': 'conditioned_floor_area', 'min': 100, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 0, 'field': 'energy_score', 'max': 100, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 0, 'field': 'energy_score', 'min': 10, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 2, 'field': 'generation_date', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 0, 'field': 'gross_floor_area', 'max': 7000000, 'min': 100, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 0, 'field': 'occupied_floor_area', 'max': 7000000, 'min': 100, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 2, 'field': 'recent_sale_date', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 2, 'field': 'release_date', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 5, 'field': 'site_eui', 'max': 1000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'site_eui', 'min': 10, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'site_eui_weather_normalized', 'max': 1000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'source_eui', 'max': 1000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'source_eui', 'min': 10, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'source_eui_weather_normalized', 'max': 1000, 'min': 10, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 3, 'field': 'year_built', 'max': '2024', 'min': 1700, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 2, 'field': 'year_ending', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}]
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+RULE_EXCLUDE = 'exclude'
+
+ +
+
+RULE_INCLUDE = 'include'
+
+ +
+
+RULE_NOT_NULL = 'not_null'
+
+ +
+
+RULE_RANGE = 'range'
+
+ +
+
+RULE_REQUIRED = 'required'
+
+ +
+
+RULE_TYPE = [(0, 'default'), (1, 'custom')]
+
+ +
+
+RULE_TYPE_CUSTOM = 1
+
+ +
+
+RULE_TYPE_DEFAULT = 0
+
+ +
+
+SEVERITY = [(0, 'error'), (1, 'warning'), (2, 'valid')]
+
+ +
+
+SEVERITY_ERROR = 0
+
+ +
+
+SEVERITY_VALID = 2
+
+ +
+
+SEVERITY_WARNING = 1
+
+ +
+
+TYPE_AREA = 4
+
+ +
+
+TYPE_DATE = 2
+
+ +
+
+TYPE_EUI = 5
+
+ +
+
+TYPE_NUMBER = 0
+
+ +
+
+TYPE_STRING = 1
+
+ +
+
+TYPE_YEAR = 3
+
+ +
+
+condition
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_quality_check
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+data_quality_check_id
+
+ +
+
+data_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+enabled
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+field
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+for_derived_column
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+format_strings(value)
+
+ +
+
+get_data_type_display(*, field=<django.db.models.fields.IntegerField: data_type>)
+
+ +
+
+get_rule_type_display(*, field=<django.db.models.fields.IntegerField: rule_type>)
+
+ +
+
+get_severity_display(*, field=<django.db.models.fields.IntegerField: severity>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+max
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+maximum_valid(value)
+

Validate that the value is not greater than the maximum specified by the rule.

+
+
Parameters:
+

value – Value to validate rule against

+
+
Returns:
+

bool, True is valid, False if the value is out of range

+
+
+
+ +
+
+min
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+minimum_valid(value)
+

Validate that the value is not less than the minimum specified by the rule.

+
+
Parameters:
+

value – Value to validate rule against

+
+
Returns:
+

bool, True is valid, False if the value is out of range

+
+
+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+not_null
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+required
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+rule_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+severity
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+status_label
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+status_label_id
+
+ +
+
+str_to_data_type(value)
+

If the check is coming from a field in the database then it will be typed correctly; +however, for extra_data, the values are typically strings or unicode. Therefore, the +values are typed before they are checked using the rule’s data type definition.

+
+
Parameters:
+

value – variant, value to type

+
+
Returns:
+

typed value

+
+
+
+ +
+
+table_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+text_match
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+units
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+valid_text(value)
+

Validate the rule matches the specified text. Text is matched by regex.

+
+
Parameters:
+

value – Value to validate rule against

+
+
Returns:
+

bool, True is valid, False if the value does not match

+
+
+
+ +
+ +
+
+exception seed.models.data_quality.UnitMismatchError
+

Bases: Exception

+
+ +
+
+seed.models.data_quality.format_pint_violation(rule, source_value)
+

Format a pint min, max violation for human readability.

+

:param rule +:param source_value : Quantity - value to format into range +:return (formatted_value, formatted_min, formatted_max) : (String, String, String)

+
+ +
+
+

Tests

+
+
+

Views

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.data.html b/docs/code_documentation/3.0.0/modules/seed.data.html new file mode 100644 index 00000000..d2ed9da8 --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.data.html @@ -0,0 +1,157 @@ + + + + + + + Data Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Data Package

+
+

Submodules

+
+
+

BEDES

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.data_importer.html b/docs/code_documentation/3.0.0/modules/seed.data_importer.html new file mode 100644 index 00000000..bbebfb0b --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.data_importer.html @@ -0,0 +1,233 @@ + + + + + + + Data Importer Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Data Importer Package

+
+

Submodules

+
+
+

Managers

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.data_importer.managers.NotDeletedManager(*args, **kwargs)
+

Bases: Manager

+
+
+get_all(*args, **kwargs)
+

Method to return ALL ImportFiles, including the ones where deleted == True which are normally excluded. +This is used for database/filesystem cleanup.

+
+ +
+
+get_queryset(*args, **kwargs)
+

Return a new QuerySet object. Subclasses can override this method to +customize the behavior of the Manager.

+
+ +
+ +
+ +
+ +
+
+

Models

+
+
+

URLs

+
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

Utility methods pertaining to data import tasks (save, mapping, matching).

+
+
+seed.data_importer.utils.kbtu_thermal_conversion_factors(country)
+

Returns thermal conversion factors provided by Portfolio Manager. +In the PM app, using NREL’s test account, a property was created for each US +and CAN. All possible Meters of different Type and Units were added. +Readings of value 1 were added to deduce the factors provided below.

+

Consideration was given regarding having the provided ‘country’ value align with +Organizations’ thermal_conversion_assumption enums. Even though these two +should be aligned, the concept and need for these factors are not specific +solely to Orgs. So the ‘country’ value here is expected to be a string. +Specifically, there are instances in the codebase where the factors are +needed irrespective of any Organization’s preferences.

+
+ +
+
+seed.data_importer.utils.usage_point_id(raw_source_id)
+

Extracts and returns the usage point ID of a GreenButton full uri ID.

+
+ +
+
+

Views

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.features.html b/docs/code_documentation/3.0.0/modules/seed.features.html new file mode 100644 index 00000000..f0a3b342 --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.features.html @@ -0,0 +1,175 @@ + + + + + + + Features Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.html b/docs/code_documentation/3.0.0/modules/seed.html new file mode 100644 index 00000000..a15adcf2 --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.html @@ -0,0 +1,842 @@ + + + + + + + SEED Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SEED Package

+
+

Subpackages

+
+ +
+
+
+

Inheritance

+
+
+

Submodules

+
+
+

Decorators

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.decorators.DRFEndpointMixin
+

alias of Mixin

+
+ +
+
+seed.decorators.ajax_request(func)
+

Copied from django-annoying, with a small modification. Now we also check for ‘status’ or +‘success’ keys and slash return correct status codes

+

If view returned serializable dict, returns response in a format requested +by HTTP_ACCEPT header. Defaults to JSON if none requested or match.

+

Currently supports JSON or YAML (if installed), but can easily be extended.

+

Example:

+
@ajax_request
+def my_view(request):
+    news = News.objects.all()
+    news_titles = [entry.title for entry in news]
+    return {"news_titles": news_titles}
+
+
+
+ +
+
+seed.decorators.ajax_request_class(func)
+
    +
  • Copied from django-annoying, with a small modification. Now we also check for ‘status’ or

  • +
+

‘success’ keys and return correct status codes

+

If view returned serializable dict, returns response in a format requested +by HTTP_ACCEPT header. Defaults to JSON if none requested or match.

+

Currently supports JSON or YAML (if installed), but can easily be extended.

+

Example:

+
@ajax_request
+def my_view(self, request):
+    news = News.objects.all()
+    news_titles = [entry.title for entry in news]
+    return {"news_titles": news_titles}
+
+
+
+ +
+
+seed.decorators.decorator_to_mixin(decorator)
+

Converts a decorator written for a function view into a mixin for a class-based view.

+

Example:

+
LoginRequiredMixin = decorator_to_mixin(login_required)
+
+
+class MyView(LoginRequiredMixin):
+    pass
+
+
+class SomeView(decorator_to_mixin(some_decorator), decorator_to_mixin(something_else)):
+    pass
+
+
+
+ +
+
+seed.decorators.get_prog_key(func_name, import_file_pk)
+

Return the progress key for the cache

+
+ +
+
+seed.decorators.lock_and_track(fn, *args, **kwargs)
+

Decorator to lock tasks to single executor and provide progress url.

+
+ +
+
+seed.decorators.require_organization_id(func)
+

Validate that organization_id is in the GET params and it’s an int.

+
+ +
+
+seed.decorators.require_organization_id_class(fn)
+

Validate that organization_id is in the GET params and it’s an int.

+
+ +
+
+seed.decorators.require_organization_membership(fn)
+

Validate that the organization_id passed in GET is valid for request user.

+
+ +
+
+

Factory

+
+
+

Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Search

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

Search methods pertaining to buildings.

+
+
+seed.search.build_shared_buildings_orgs(orgs)
+

returns a list of sibling and parent orgs

+
+ +
+
+seed.search.create_inventory_queryset(inventory_type, orgs, exclude, order_by, other_orgs=None, cycle_id=None)
+

creates a queryset of properties or taxlots within orgs. +If other_orgs, properties/taxlots in both orgs and other_orgs +will be represented in the queryset.

+
+
Parameters:
+
    +
  • inventory_type – property or taxlot.

  • +
  • orgs – queryset of Organization inst.

  • +
  • exclude – django query exclude dict.

  • +
  • order_by – django query order_by str.

  • +
  • other_orgs – list of other orgs to or the query

  • +
+
+
+
+ +
+
+seed.search.get_inventory_fieldnames(inventory_type)
+

returns a list of field names that will be searched against

+
+ +
+
+seed.search.get_orgs_w_public_fields()
+

returns a list of orgs that have publicly shared fields

+
+ +
+
+seed.search.inventory_search_filter_sort(inventory_type, params, user, cycle_id=None)
+

Given a parsed set of params, perform the search, filter, and sort for +Properties or Taxlots

+
+ +
+
+seed.search.parse_body(request)
+

parses the request body for search params, q, etc

+
+
Parameters:
+

request – django wsgi request object

+
+
Returns:
+

dict

+
+
+

Example:

+
{
+    'exclude': dict, exclude dict for django queryset
+    'order_by': str, query order_by, defaults to 'tax_lot_id'
+    'sort_reverse': bool, True if ASC, False if DSC
+    'page': int, pagination page
+    'number_per_page': int, number per pagination page
+    'show_shared_buildings': bool, whether to search across all user's orgs
+    'q': str, global search param
+    'other_search_params': dict, filter params
+    'project_id': str, project id if exists in body
+}
+
+
+
+ +
+
+seed.search.process_search_params(params, user, is_api_request=False)
+

Given a python representation of a search query, process it into the +internal format that is used for searching, filtering, sorting, and pagination.

+
+
Parameters:
+
    +
  • params – a python object representing the search query

  • +
  • user – the user this search is for

  • +
  • is_api_request – bool, boolean whether this search is being done as an api request.

  • +
+
+
Returns:
+

dict

+
+
+

Example:

+
{
+    'exclude': dict, exclude dict for django queryset
+    'order_by': str, query order_by, defaults to 'tax_lot_id'
+    'sort_reverse': bool, True if ASC, False if DSC
+    'page': int, pagination page
+    'number_per_page': int, number per pagination page
+    'show_shared_buildings': bool, whether to search across all user's orgs
+    'q': str, global search param
+    'other_search_params': dict, filter params
+    'project_id': str, project id if exists in body
+}
+
+
+
+ +
+
+seed.search.search_inventory(inventory_type, q, fieldnames=None, queryset=None)
+

returns a queryset for matching Taxlot(View)/Property(View) +:param str or unicode q: search string +:param list fieldnames: list of model fieldnames +:param queryset: optional queryset to filter from +:returns: :queryset: queryset of matching buildings

+
+ +
+
+seed.search.search_properties(q, fieldnames=None, queryset=None)
+
+ +
+
+seed.search.search_taxlots(q, fieldnames=None, queryset=None)
+
+ +
+
+

Tasks

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.tasks.delete_organization(org_pk)
+

delete_organization_buildings

+
+ +
+
+seed.tasks.invite_new_user_to_seed(domain, email_address, token, user_pk, first_name)
+

Send invitation email to newly created user from the landing page. +NOTE: this function is only used on the landing page because the user has not been assigned an organization +domain – The domain name of the running seed instance +email_address – The address to send the invitation to +token – generated by Django’s default_token_generator +user_pk – primary key for this user record +first_name – First name of the new user +new_user

+

Returns: nothing

+
+ +
+
+seed.tasks.send_salesforce_error_log(org_pk, errors)
+

send salesforce error log to logging email when errors are encountered during scheduled sync

+
+ +
+
+

Token Generator

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
author:
+

Aleck Landgraf

+
+
+

token_generator.py - taken from django core master branch

+

needed a token check that would not expire after three days for sending a +signup email

+
+
+class seed.token_generators.SignupTokenGenerator
+

Bases: object

+

Strategy object used to generate and check tokens for the password +reset mechanism.

+
+
+check_token(user, token, token_expires=True)
+

Check that a password reset token is correct for a given user.

+
+ +
+
+make_token(user)
+

Returns a token that can be used once to do a password reset +for the given user.

+
+ +
+ +
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.landing.html b/docs/code_documentation/3.0.0/modules/seed.landing.html new file mode 100644 index 00000000..fc5532fd --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.landing.html @@ -0,0 +1,835 @@ + + + + + + + Landing Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Landing Package

+
+

Subpackages

+ +
+
+

Submodules

+
+
+

Forms

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.landing.forms.CustomCreateUserForm(*args, **kwargs)
+

Bases: UserCreationForm

+
+
+class Meta
+

Bases: object

+
+
+fields = ['username']
+
+ +
+
+model
+

alias of SEEDUser

+
+ +
+
+widgets = {'username': <django.forms.widgets.EmailInput object>}
+
+ +
+ +
+
+base_fields = {'password1': <django.forms.fields.CharField object>, 'password2': <django.forms.fields.CharField object>, 'username': <django.forms.fields.EmailField object>}
+
+ +
+
+declared_fields = {'password1': <django.forms.fields.CharField object>, 'password2': <django.forms.fields.CharField object>}
+
+ +
+
+property media
+

Return all media required to render the widgets on this form.

+
+ +
+ +
+
+class seed.landing.forms.LoginForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None)
+

Bases: Form

+
+
+base_fields = {'email': <django.forms.fields.EmailField object>, 'password': <django.forms.fields.CharField object>}
+
+ +
+
+declared_fields = {'email': <django.forms.fields.EmailField object>, 'password': <django.forms.fields.CharField object>}
+
+ +
+
+property media
+

Return all media required to render the widgets on this form.

+
+ +
+ +
+
+

Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.landing.models.SEEDUser(*args, **kwargs)
+

Bases: AbstractBaseUser, PermissionsMixin

+

An abstract base class implementing a fully featured User model with +admin-compliant permissions.

+

Username, password and email are required. Other fields are optional.

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+REQUIRED_FIELDS = ['email']
+
+ +
+
+USERNAME_FIELD = 'username'
+
+ +
+
+analysis_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+api_key
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+columnmapping_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+cycle_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+date_joined
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+deactivate_user()
+
+ +
+
+default_building_detail_custom_columns
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+default_custom_columns
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+default_organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+default_organization_id
+
+ +
+
+email
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+email_user(subject, message, from_email=None)
+

Sends an email to this User.

+
+ +
+
+first_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+generate_key()
+

Creates and sets an API key for this user. +Adapted from tastypie:

+

https://github.com/toastdriven/django-tastypie/blob/master/tastypie/models.py#L47

+
+ +
+
+get_absolute_url()
+
+ +
+
+get_full_name()
+

Returns the first_name plus the last_name, with a space in between.

+
+ +
+
+get_next_by_date_joined(*, field=<django.db.models.fields.DateTimeField: date_joined>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_date_joined(*, field=<django.db.models.fields.DateTimeField: date_joined>, is_next=False, **kwargs)
+
+ +
+
+get_short_name()
+

Returns the short name for the user.

+
+ +
+
+greenassessmentpropertyauditlog_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+importrecord_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+is_staff
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+last_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+logentry_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+modified_import_records
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+notes
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+oauth2_provider_accesstoken
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+oauth2_provider_application
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+oauth2_provider_grant
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+oauth2_provider_refreshtoken
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.contrib.auth.models.UserManager object>
+
+ +
+
+organizationuser_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+orgs
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+postofficeemail_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+postofficeemailtemplate_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+classmethod process_header_request(request)
+

Process the header string to return the user if it is a valid user.

+
+
Parameters:
+

request – object, request object with HTTP Authorization

+
+
Returns:
+

User object

+
+
+
+ +
+
+save(*args, **kwargs)
+

Ensure that email and username are synced.

+
+ +
+
+show_shared_buildings
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+user_permissions
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+username
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+

Tests

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.landing.tests.UserLoginTest(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_simple_login()
+

Happy path login

+
+ +
+ +
+
+

URLs

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.landing.views.account_activation_sent(request)
+
+ +
+
+seed.landing.views.activate(request, uidb64, token)
+
+ +
+
+seed.landing.views.create_account(request)
+
+ +
+
+seed.landing.views.landing_page(request)
+
+ +
+
+seed.landing.views.password_reset(request)
+
+ +
+
+seed.landing.views.password_reset_complete(request)
+
+ +
+
+seed.landing.views.password_reset_confirm(request, uidb64=None, token=None)
+
+ +
+
+seed.landing.views.password_reset_done(request)
+
+ +
+
+seed.landing.views.password_set(request, uidb64=None, token=None)
+
+ +
+
+seed.landing.views.signup(request, uidb64=None, token=None)
+
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.landing.management.commands.html b/docs/code_documentation/3.0.0/modules/seed.landing.management.commands.html new file mode 100644 index 00000000..d67d45ba --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.landing.management.commands.html @@ -0,0 +1,167 @@ + + + + + + + Landing Management Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Landing Management Package

+
+

Submodules

+
+
+

Update EULA

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.landing.management.html b/docs/code_documentation/3.0.0/modules/seed.landing.management.html new file mode 100644 index 00000000..1e67b0cf --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.landing.management.html @@ -0,0 +1,173 @@ + + + + + + + seed.landing.management package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

seed.landing.management package

+
+

Subpackages

+ +
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.lib.html b/docs/code_documentation/3.0.0/modules/seed.lib.html new file mode 100644 index 00000000..3261d5f5 --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.lib.html @@ -0,0 +1,157 @@ + + + + + + + Library Packages — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Library Packages

+
+

Submodules

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.lib.mappings.html b/docs/code_documentation/3.0.0/modules/seed.lib.mappings.html new file mode 100644 index 00000000..f0c9255e --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.lib.mappings.html @@ -0,0 +1,339 @@ + + + + + + + seed.lib.mappings package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

seed.lib.mappings package

+
+

Submodules

+
+
+

seed.lib.mappings.mapper module

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

:author Dan Gunter <dkgunter@lbl.gov>

+
+
+seed.lib.mappings.mapper.create_column_regexes(raw_columns)
+

Take the columns in the format below and sanitize the keys and add +in the regex.

+
+
Parameters:
+

raw_data – list of strings (columns names from imported file)

+
+
Returns:
+

list of dict

+
+
+
+ +
+
+seed.lib.mappings.mapper.get_pm_mapping(raw_columns, mapping_data=None, resolve_duplicates=True)
+

Create and return Portfolio Manager (PM) mapping for a given version of PM and the given +list of column names.

+

The method will take the raw_columns (from the CSV/XLSX file) and attempt to normalize the +column names so that they can be mapped to the data in the pm-mapping.json[‘from_field’].

+
+ +
+
+

seed.lib.mappings.mapping_columns module

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

:author Nicholas Long <nicholas.long@nrel.gov>

+
+
+class seed.lib.mappings.mapping_columns.MappingColumns(raw_columns, dest_columns, previous_mapping=None, map_args=None, default_mappings=None, threshold=0)
+

Bases: object

+

This class handles the probabilistic mapping of unknown columns to defined fields. This +is mainly used in the build_column_mapping API endpoint.

+
+
+add_mappings(raw_column, mappings, previous_mapping=False)
+

Add mappings to the data structure for later processing.

+
+
Parameters:
+
    +
  • raw_column – list of strings

  • +
  • mappings – list of tuples of potential mappings and confidences

  • +
  • previous_mapping – boolean, if true these mappings will take precedence

  • +
+
+
Returns:
+

Bool, whether the mapping was added

+
+
+
+ +
+
+apply_threshold(threshold)
+

Remove mapping suggestions that do not meet the defined threshold

+

This method is forced as part of the workflow for now, but could easily be made as a +separate call.

+
+
Parameters:
+

threshold – int, min value to be greater than or equal to.

+
+
Returns:
+

None

+
+
+
+ +
+
+property duplicates
+

Check for duplicate initial mapping results. Duplicates exist if the first suggested mapping +for two different raw_columns are the same. The example below would be one of those cases.

+
+
Returns:
+

List of raw col

+
+
+
+ +
+
+property final_mappings
+

Return the final mappings in a format that can be used downstream from this method +{

+
+

“raw_column_1”: (‘table’, ‘db_column_1’, confidence), +“raw_column_2”: (‘table’, ‘db_column_1’, confidence),

+
+

}

+
+ +
+
+first_suggested_mapping(raw_column)
+

Grab the first suggested mapping for a raw column

+
+
Parameters:
+

raw_column – String

+
+
Returns:
+

tuple of the mapping (‘table’, ‘field’, confidence), or ()

+
+
+
+ +
+
+resolve_duplicate(dup_map_field, raw_columns)
+

If there are duplicates, that is two raw_columns are trying to map to the same suggested +column, then select the next available one on the duplicate column. The one with the highest +confidence will ‘win’ the duplicate battle.

+
+
Parameters:
+
    +
  • dup_map_field – String, name of the field that is a duplicate

  • +
  • raw_columns – list, raw columns that mapped to the same result

  • +
+
+
Returns:
+

None

+
+
+
+ +
+
+set_initial_mapping_cmp(raw_column)
+

Set the initial_mapping_cmp helper item in the self.data hash. This is used to detect +if there are any duplicates. The initial mapping cmp will be the first match in the list +(i.e., the one with the highest confidence).

+
+
Parameters:
+

raw_column – String, name of the raw column to set the initial_mapping_cmp

+
+
Returns:
+

None

+
+
+
+ +
+ +
+
+seed.lib.mappings.mapping_columns.sort_duplicates(a, b)
+

Custom sort for the duplicate hash to decide which raw column will get the mapping suggestion +based on the confidence.

+
+ +
+
+

seed.lib.mappings.mapping_data module

+
+
+

seed.lib.mappings.test_mapper module

+
+
+

seed.lib.mappings.test_mapping_columns module

+
+
+

seed.lib.mappings.test_mapping_data module

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.lib.merging.html b/docs/code_documentation/3.0.0/modules/seed.lib.merging.html new file mode 100644 index 00000000..4f465b6c --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.lib.merging.html @@ -0,0 +1,226 @@ + + + + + + + seed.lib.merging package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

seed.lib.merging package

+
+

Submodules

+
+
+

seed.lib.merging.merging module

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

:author Dan Gunter <dkgunter@lbl.gov>

+
+
+seed.lib.merging.merging.get_attrs_with_mapping(data_set_buildings, mapping)
+

Returns a dictionary of attributes from each data_set_building.

+
+
Parameters:
+
    +
  • data_set_buildings – list, instances to merge.

  • +
  • mapping

  • +
+
+
Returns:
+

dict: possible attributes keyed on attr name.

+
+
+
+ +
+
+seed.lib.merging.merging.get_propertystate_attrs(data_set_buildings)
+
+ +
+
+seed.lib.merging.merging.get_state_attrs(state_list)
+

Return a list of state attributes. This does not include any of the extra data columns

+
+ +
+
+seed.lib.merging.merging.get_state_to_state_tuple(inventory)
+

Return the list of the database fields based on the inventory type

+
+ +
+
+seed.lib.merging.merging.get_taxlotstate_attrs(data_set_buildings)
+
+ +
+
+seed.lib.merging.merging.merge_state(merged_state, state1, state2, priorities, ignore_merge_protection=False)
+

Set attributes on our Canonical model, saving differences.

+
+
Parameters:
+
    +
  • merged_state – PropertyState/TaxLotState model inst.

  • +
  • state1 – PropertyState/TaxLotState model inst. Left parent.

  • +
  • state2 – PropertyState/TaxLotState model inst. Right parent.

  • +
  • priorities – dict, column names with favor new or existing

  • +
+
+
Returns:
+

inst(merged_state), updated.

+
+
+
+ +
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.management.html b/docs/code_documentation/3.0.0/modules/seed.management.html new file mode 100644 index 00000000..a3f79fec --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.management.html @@ -0,0 +1,176 @@ + + + + + + + Management Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Management Package

+
+

Subpackages

+
+
+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.managers.html b/docs/code_documentation/3.0.0/modules/seed.managers.html new file mode 100644 index 00000000..0c8b71fa --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.managers.html @@ -0,0 +1,174 @@ + + + + + + + Managers Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Managers Package

+
+

Subpackages

+ +
+
+

Submodules

+
+
+

JSON

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.managers.tests.html b/docs/code_documentation/3.0.0/modules/seed.managers.tests.html new file mode 100644 index 00000000..2a6b82ef --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.managers.tests.html @@ -0,0 +1,162 @@ + + + + + + + Manager Tests Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Manager Tests Package

+
+

Submodules

+
+
+

Test JSON Manager

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.mappings.html b/docs/code_documentation/3.0.0/modules/seed.mappings.html new file mode 100644 index 00000000..d63349b3 --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.mappings.html @@ -0,0 +1,183 @@ + + + + + + + Mapping Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.models.html b/docs/code_documentation/3.0.0/modules/seed.models.html new file mode 100644 index 00000000..e43474fb --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.models.html @@ -0,0 +1,4529 @@ + + + + + + + Models — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Models

+
+

Submodules

+
+
+

AuditLog

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Columns

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.columns.Column(*args, **kwargs)
+

Bases: Model

+

The name of a column for a given organization.

+
+
+COLUMN_EXCLUDE_FIELDS = ['bounding_box', 'centroid', 'created', 'data_state', 'extra_data', 'geocoding_confidence', 'id', 'import_file', 'long_lat', 'merge_state', 'raw_access_level_instance_error', 'raw_access_level_instance_id', 'source_type', 'updated', 'hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+COLUMN_MERGE_FAVOR_EXISTING = 1
+
+ +
+
+COLUMN_MERGE_FAVOR_NEW = 0
+
+ +
+
+COLUMN_MERGE_PROTECTION = [(0, 'Favor New'), (1, 'Favor Existing')]
+
+ +
+
+DATABASE_COLUMNS = [{'column_description': 'PM Property ID', 'column_name': 'pm_property_id', 'data_type': 'string', 'display_name': 'PM Property ID', 'table_name': 'PropertyState'}, {'column_description': 'PM Parent Property ID', 'column_name': 'pm_parent_property_id', 'data_type': 'string', 'display_name': 'PM Parent Property ID', 'table_name': 'PropertyState'}, {'column_description': 'Jurisdiction Tax Lot ID', 'column_name': 'jurisdiction_tax_lot_id', 'data_type': 'string', 'display_name': 'Jurisdiction Tax Lot ID', 'table_name': 'TaxLotState'}, {'column_description': 'Jurisdiction Property ID', 'column_name': 'jurisdiction_property_id', 'data_type': 'string', 'display_name': 'Jurisdiction Property ID', 'table_name': 'PropertyState'}, {'column_description': 'UBID', 'column_name': 'ubid', 'data_type': 'string', 'display_name': 'UBID', 'table_name': 'TaxLotState'}, {'column_description': 'UBID', 'column_name': 'ubid', 'data_type': 'string', 'display_name': 'UBID', 'table_name': 'PropertyState'}, {'column_description': 'Custom ID 1', 'column_name': 'custom_id_1', 'data_type': 'string', 'display_name': 'Custom ID 1', 'table_name': 'PropertyState'}, {'column_description': 'Custom ID 1', 'column_name': 'custom_id_1', 'data_type': 'string', 'display_name': 'Custom ID 1', 'table_name': 'TaxLotState'}, {'column_description': 'Audit Template Building ID', 'column_name': 'audit_template_building_id', 'data_type': 'string', 'display_name': 'Audit Template Building ID', 'table_name': 'PropertyState'}, {'column_description': 'Address Line 1', 'column_name': 'address_line_1', 'data_type': 'string', 'display_name': 'Address Line 1', 'table_name': 'PropertyState'}, {'column_description': 'Address Line 1', 'column_name': 'address_line_1', 'data_type': 'string', 'display_name': 'Address Line 1', 'table_name': 'TaxLotState'}, {'column_description': 'Address Line 2', 'column_name': 'address_line_2', 'data_type': 'string', 'display_name': 'Address Line 2', 'table_name': 'PropertyState'}, {'column_description': 'Address Line 2', 'column_name': 'address_line_2', 'data_type': 'string', 'display_name': 'Address Line 2', 'table_name': 'TaxLotState'}, {'column_description': 'City', 'column_name': 'city', 'data_type': 'string', 'display_name': 'City', 'table_name': 'PropertyState'}, {'column_description': 'City', 'column_name': 'city', 'data_type': 'string', 'display_name': 'City', 'table_name': 'TaxLotState'}, {'column_description': 'State', 'column_name': 'state', 'data_type': 'string', 'display_name': 'State', 'table_name': 'PropertyState'}, {'column_description': 'State', 'column_name': 'state', 'data_type': 'string', 'display_name': 'State', 'table_name': 'TaxLotState'}, {'column_description': 'Normalized Address', 'column_name': 'normalized_address', 'data_type': 'string', 'display_name': 'Normalized Address', 'table_name': 'PropertyState'}, {'column_description': 'Normalized Address', 'column_name': 'normalized_address', 'data_type': 'string', 'display_name': 'Normalized Address', 'table_name': 'TaxLotState'}, {'column_description': 'Postal Code', 'column_name': 'postal_code', 'data_type': 'string', 'display_name': 'Postal Code', 'table_name': 'PropertyState'}, {'column_description': 'Postal Code', 'column_name': 'postal_code', 'data_type': 'string', 'display_name': 'Postal Code', 'table_name': 'TaxLotState'}, {'column_description': 'Associated Tax Lot ID', 'column_name': 'lot_number', 'data_type': 'string', 'display_name': 'Associated Tax Lot ID', 'table_name': 'PropertyState'}, {'column_description': 'Property Name', 'column_name': 'property_name', 'data_type': 'string', 'display_name': 'Property Name', 'table_name': 'PropertyState'}, {'column_description': 'Latitude', 'column_name': 'latitude', 'data_type': 'number', 'display_name': 'Latitude', 'table_name': 'PropertyState'}, {'column_description': 'Longitude', 'column_name': 'longitude', 'data_type': 'number', 'display_name': 'Longitude', 'table_name': 'PropertyState'}, {'column_description': 'Latitude', 'column_name': 'latitude', 'data_type': 'number', 'display_name': 'Latitude', 'table_name': 'TaxLotState'}, {'column_description': 'Longitude', 'column_name': 'longitude', 'data_type': 'number', 'display_name': 'Longitude', 'table_name': 'TaxLotState'}, {'column_description': 'Geocoding Confidence', 'column_name': 'geocoding_confidence', 'data_type': 'string', 'display_name': 'Geocoding Confidence', 'table_name': 'PropertyState'}, {'column_description': 'Geocoding Confidence', 'column_name': 'geocoding_confidence', 'data_type': 'string', 'display_name': 'Geocoding Confidence', 'table_name': 'TaxLotState'}, {'column_description': 'Property Footprint', 'column_name': 'property_footprint', 'data_type': 'geometry', 'display_name': 'Property Footprint', 'table_name': 'PropertyState'}, {'column_description': 'Tax Lot Footprint', 'column_name': 'taxlot_footprint', 'data_type': 'geometry', 'display_name': 'Tax Lot Footprint', 'table_name': 'TaxLotState'}, {'column_description': 'Updated', 'column_name': 'updated', 'data_type': 'datetime', 'display_name': 'Updated', 'table_name': 'PropertyState'}, {'column_description': 'Created', 'column_name': 'created', 'data_type': 'datetime', 'display_name': 'Created', 'table_name': 'PropertyState'}, {'column_description': 'Updated', 'column_name': 'updated', 'data_type': 'datetime', 'display_name': 'Updated', 'table_name': 'TaxLotState'}, {'column_description': 'Created', 'column_name': 'created', 'data_type': 'datetime', 'display_name': 'Created', 'table_name': 'TaxLotState'}, {'column_description': 'Gross Floor Area', 'column_name': 'gross_floor_area', 'data_type': 'area', 'display_name': 'Gross Floor Area', 'table_name': 'PropertyState'}, {'column_description': 'Use Description', 'column_name': 'use_description', 'data_type': 'string', 'display_name': 'Use Description', 'table_name': 'PropertyState'}, {'column_description': 'ENERGY STAR Score', 'column_name': 'energy_score', 'data_type': 'integer', 'display_name': 'ENERGY STAR Score', 'table_name': 'PropertyState'}, {'column_description': 'Property Notes', 'column_name': 'property_notes', 'data_type': 'string', 'display_name': 'Property Notes', 'table_name': 'PropertyState'}, {'column_description': 'Property Type', 'column_name': 'property_type', 'data_type': 'string', 'display_name': 'Property Type', 'table_name': 'PropertyState'}, {'column_description': 'Year Ending', 'column_name': 'year_ending', 'data_type': 'date', 'display_name': 'Year Ending', 'table_name': 'PropertyState'}, {'column_description': 'Owner', 'column_name': 'owner', 'data_type': 'string', 'display_name': 'Owner', 'table_name': 'PropertyState'}, {'column_description': 'Owner Email', 'column_name': 'owner_email', 'data_type': 'string', 'display_name': 'Owner Email', 'table_name': 'PropertyState'}, {'column_description': 'Owner Telephone', 'column_name': 'owner_telephone', 'data_type': 'string', 'display_name': 'Owner Telephone', 'table_name': 'PropertyState'}, {'column_description': 'Building Count', 'column_name': 'building_count', 'data_type': 'integer', 'display_name': 'Building Count', 'table_name': 'PropertyState'}, {'column_description': 'Year Built', 'column_name': 'year_built', 'data_type': 'integer', 'display_name': 'Year Built', 'table_name': 'PropertyState'}, {'column_description': 'Recent Sale Date', 'column_name': 'recent_sale_date', 'data_type': 'datetime', 'display_name': 'Recent Sale Date', 'table_name': 'PropertyState'}, {'column_description': 'Conditioned Floor Area', 'column_name': 'conditioned_floor_area', 'data_type': 'area', 'display_name': 'Conditioned Floor Area', 'table_name': 'PropertyState'}, {'column_description': 'Occupied Floor Area', 'column_name': 'occupied_floor_area', 'data_type': 'area', 'display_name': 'Occupied Floor Area', 'table_name': 'PropertyState'}, {'column_description': 'Owner Address', 'column_name': 'owner_address', 'data_type': 'string', 'display_name': 'Owner Address', 'table_name': 'PropertyState'}, {'column_description': 'Owner City/State', 'column_name': 'owner_city_state', 'data_type': 'string', 'display_name': 'Owner City/State', 'table_name': 'PropertyState'}, {'column_description': 'Owner Postal Code', 'column_name': 'owner_postal_code', 'data_type': 'string', 'display_name': 'Owner Postal Code', 'table_name': 'PropertyState'}, {'column_description': 'Home Energy Score ID', 'column_name': 'home_energy_score_id', 'data_type': 'string', 'display_name': 'Home Energy Score ID', 'table_name': 'PropertyState'}, {'column_description': 'PM Generation Date', 'column_name': 'generation_date', 'data_type': 'datetime', 'display_name': 'PM Generation Date', 'table_name': 'PropertyState'}, {'column_description': 'PM Release Date', 'column_name': 'release_date', 'data_type': 'datetime', 'display_name': 'PM Release Date', 'table_name': 'PropertyState'}, {'column_description': 'Site EUI', 'column_name': 'site_eui', 'data_type': 'eui', 'display_name': 'Site EUI', 'table_name': 'PropertyState'}, {'column_description': 'Site EUI Weather Normalized', 'column_name': 'site_eui_weather_normalized', 'data_type': 'eui', 'display_name': 'Site EUI Weather Normalized', 'table_name': 'PropertyState'}, {'column_description': 'Site EUI Modeled', 'column_name': 'site_eui_modeled', 'data_type': 'eui', 'display_name': 'Site EUI Modeled', 'table_name': 'PropertyState'}, {'column_description': 'Source EUI', 'column_name': 'source_eui', 'data_type': 'eui', 'display_name': 'Source EUI', 'table_name': 'PropertyState'}, {'column_description': 'Source EUI Weather Normalized', 'column_name': 'source_eui_weather_normalized', 'data_type': 'eui', 'display_name': 'Source EUI Weather Normalized', 'table_name': 'PropertyState'}, {'column_description': 'Source EUI Modeled', 'column_name': 'source_eui_modeled', 'data_type': 'eui', 'display_name': 'Source EUI Modeled', 'table_name': 'PropertyState'}, {'column_description': 'Energy Alerts', 'column_name': 'energy_alerts', 'data_type': 'string', 'display_name': 'Energy Alerts', 'table_name': 'PropertyState'}, {'column_description': 'Space Alerts', 'column_name': 'space_alerts', 'data_type': 'string', 'display_name': 'Space Alerts', 'table_name': 'PropertyState'}, {'column_description': 'Building Certification', 'column_name': 'building_certification', 'data_type': 'string', 'display_name': 'Building Certification', 'table_name': 'PropertyState'}, {'column_description': 'Number Properties', 'column_name': 'number_properties', 'data_type': 'integer', 'display_name': 'Number Properties', 'table_name': 'TaxLotState'}, {'column_description': 'Block Number', 'column_name': 'block_number', 'data_type': 'string', 'display_name': 'Block Number', 'table_name': 'TaxLotState'}, {'column_description': 'District', 'column_name': 'district', 'data_type': 'string', 'display_name': 'District', 'table_name': 'TaxLotState'}, {'column_description': 'eGRID Subregion Code', 'column_name': 'egrid_subregion_code', 'data_type': 'string', 'display_name': 'eGRID Subregion Code', 'table_name': 'PropertyState'}, {'column_description': 'Total GHG Emissions', 'column_name': 'total_ghg_emissions', 'data_type': 'ghg', 'display_name': 'Total GHG Emissions', 'table_name': 'PropertyState'}, {'column_description': 'Total Marginal GHG Emissions', 'column_name': 'total_marginal_ghg_emissions', 'data_type': 'ghg', 'display_name': 'Total Marginal GHG Emissions', 'table_name': 'PropertyState'}, {'column_description': 'Total GHG Emissions Intensity', 'column_name': 'total_ghg_emissions_intensity', 'data_type': 'ghg_intensity', 'display_name': 'Total GHG Emissions Intensity', 'table_name': 'PropertyState'}, {'column_description': 'Total Marginal GHG Emissions Intensity', 'column_name': 'total_marginal_ghg_emissions_intensity', 'data_type': 'ghg_intensity', 'display_name': 'Total Marginal GHG Emissions Intensity', 'table_name': 'PropertyState'}, {'column_description': 'Time zone of the property', 'column_name': 'property_timezone', 'data_type': 'string', 'display_name': 'Property Time Zone', 'table_name': 'PropertyState'}]
+
+ +
+
+DATA_TYPE_PARSERS: dict[str, Callable] = {'area': <function Column.<lambda>>, 'boolean': <function Column.<lambda>>, 'date': <function Column.<lambda>>, 'datetime': <built-in method fromisoformat of type object>, 'eui': <function Column.<lambda>>, 'float': <function Column.<lambda>>, 'geometry': <class 'str'>, 'ghg': <function Column.<lambda>>, 'ghg_intensity': <function Column.<lambda>>, 'integer': <function Column.<lambda>>, 'number': <function Column.<lambda>>, 'string': <class 'str'>}
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+EXCLUDED_COLUMN_RETURN_FIELDS = ['hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+EXCLUDED_MAPPING_FIELDS = ['created', 'extra_data', 'lot_number', 'normalized_address', 'geocoded_address', 'geocoded_postal_code', 'geocoded_side_of_street', 'geocoded_country', 'geocoded_state', 'geocoded_county', 'geocoded_city', 'geocoded_neighborhood', 'updated']
+
+ +
+
+EXCLUDED_RENAME_FROM_FIELDS = ['lot_number', 'year_built', 'property_footprint', 'taxlot_footprint', 'bounding_box', 'centroid', 'created', 'data_state', 'extra_data', 'geocoding_confidence', 'id', 'import_file', 'long_lat', 'merge_state', 'raw_access_level_instance_error', 'raw_access_level_instance_id', 'source_type', 'updated', 'hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+EXCLUDED_RENAME_TO_FIELDS = ['lot_number', 'latitude', 'longitude', 'year_built', 'property_footprint', 'created', 'updated', 'bounding_box', 'centroid', 'created', 'data_state', 'extra_data', 'geocoding_confidence', 'id', 'import_file', 'long_lat', 'merge_state', 'raw_access_level_instance_error', 'raw_access_level_instance_id', 'source_type', 'updated', 'hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+INTERNAL_TYPE_TO_DATA_TYPE = {'BooleanField': 'boolean', 'CharField': 'string', 'DateField': 'date', 'DateTimeField': 'datetime', 'FloatField': 'double', 'IntegerField': 'integer', 'JSONField': 'string', 'PointField': 'geometry', 'PolygonField': 'geometry', 'TextField': 'string'}
+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+PINNED_COLUMNS = [('PropertyState', 'pm_property_id'), ('TaxLotState', 'jurisdiction_tax_lot_id')]
+
+ +
+
+QUANTITY_UNIT_COLUMNS = [('PropertyState', 'gross_floor_area'), ('PropertyState', 'occupied_floor_area'), ('PropertyState', 'conditioned_floor_area'), ('PropertyState', 'site_eui'), ('PropertyState', 'site_eui_modeled'), ('PropertyState', 'site_eui_weather_normalized'), ('PropertyState', 'source_eui'), ('PropertyState', 'source_eui_modeled'), ('PropertyState', 'source_eui_weather_normalized'), ('PropertyState', 'total_ghg_emissions'), ('PropertyState', 'total_marginal_ghg_emissions'), ('PropertyState', 'total_ghg_emissions_intensity'), ('PropertyState', 'total_marginal_ghg_emissions_intensity')]
+
+ +
+
+SHARED_FIELD_TYPES = ((0, 'None'), (1, 'Public'))
+
+ +
+
+SHARED_NONE = 0
+
+ +
+
+SHARED_PUBLIC = 1
+
+ +
+
+UNMAPPABLE_PROPERTY_FIELDS = ['created', 'geocoding_confidence', 'lot_number', 'updated']
+
+ +
+
+UNMAPPABLE_TAXLOT_FIELDS = ['created', 'geocoding_confidence', 'updated']
+
+ +
+
+account_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+actual_emission_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+actual_energy_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+benchmark_id_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+cast(value: Any) Any
+

Cast the value to the correct type for the column.

+
+
Args:

value (Any): Value to cast, typically a string.

+
+
+
+ +
+
+static cast_column_value(column_data_type: str, value: Any, allow_none: bool = True) Any
+

cast a single value from the column data type

+
+
Args:

column_data_type (str): The data type as defined in the column object +value (Any): value to cast. Note the value may already be cast correctly.

+
+
Raises:

Exception: CastException if the value cannot be cast to the correct type

+
+
Returns:

Any: Resulting casted value

+
+
+
+ +
+
+clean()
+

Hook for doing any extra model-wide validation after clean() has been +called on every field by self.clean_fields. Any ValidationError raised +by this method will not be associated with a particular field; it will +have a special-case association with the field defined by NON_FIELD_ERRORS.

+
+ +
+
+column_description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+column_list_profiles
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+column_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+columnlistprofilecolumn_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+comstock_mapping
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+contact_email_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+contact_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+static create_mappings(mappings, organization, user, import_file_id=None)
+

Create the mappings for an organization and a user based on a simple +array of array object.

+
+
Parameters:
+
    +
  • mappings – dict, dictionary containing mapping information

  • +
  • organization – inst, organization object

  • +
  • user – inst, User object

  • +
  • import_file_id – integer, If passed, will cache the column mappings data into the +import_file_id object.

  • +
+
+
+

:return Boolean, True is data are saved in the ColumnMapping table in the database

+
+ +
+
+static create_mappings_from_file(filename, organization, user, import_file_id=None)
+

Load the mappings in from a file in a very specific file format. The columns in the file +must be:

+
+
    +
  1. raw field

  2. +
  3. table name

  4. +
  5. field name

  6. +
  7. field display name

  8. +
  9. field data type

  10. +
  11. field unit type

  12. +
+
+
+
Parameters:
+
    +
  • filename – string, absolute path and name of file to load

  • +
  • organization – id, organization id

  • +
  • user – id, user id

  • +
  • import_file_id – Integer, If passed, will cache the column mappings data into +the import_file_id object.

  • +
+
+
Returns:
+

ColumnMapping, True

+
+
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_admin_account_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+data_admin_email_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+data_admin_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+data_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+dataviewparameter_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+static delete_all(organization)
+

Delete all the columns for an organization. Note that this will invalidate all the +data that is in the extra_data fields of the inventory and is irreversible.

+
+
Parameters:
+

organization – instance, Organization

+
+
Returns:
+

[int, int] Number of columns, column_mappings records that were deleted

+
+
+
+ +
+
+derived_column
+

Accessor to the related object on the forward side of a one-to-one relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Restaurant.place is a ForwardOneToOneDescriptor instance.

+
+ +
+
+derived_column_id
+
+ +
+
+derivedcolumn_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+derivedcolumnparameter_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+display_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+geocoding_order
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_merge_protection_display(*, field=<django.db.models.fields.IntegerField: merge_protection>)
+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_modified(*, field=<django.db.models.fields.DateTimeField: modified>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_modified(*, field=<django.db.models.fields.DateTimeField: modified>, is_next=False, **kwargs)
+
+ +
+
+get_shared_field_type_display(*, field=<django.db.models.fields.IntegerField: shared_field_type>)
+
+ +
+
+goal_area_columns
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+goal_eui_column1s
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+goal_eui_column2s
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+goal_eui_column3s
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_file
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+import_file_id
+
+ +
+
+is_extra_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+is_matching_criteria
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+mapped_mappings
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+merge_protection
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+modified
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+raw_mappings
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+recognize_empty
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+rename_column(new_column_name, force=False)
+

Rename the column and move all the data to the new column. This can move the +data from a canonical field to an extra data field or vice versa. By default the +column.

+
+
Parameters:
+
    +
  • new_column_name – string new name of column

  • +
  • force – boolean force the overwrite of data in the column?

  • +
+
+
Returns:
+

+
+
+
+ +
+
+static retrieve_all(org_id: int, inventory_type: Literal['property', 'taxlot'] | None = None, only_used: bool = False, include_related: bool = True, exclude_derived: bool = False, column_ids: list[int] | None = None) list[dict]
+

Retrieve all the columns for an organization. This method will query for all the columns in the +database assigned to the organization. It will then go through and cleanup the names to ensure that +there are no duplicates. The name column is used for uniquely labeling the columns for UI Grid purposes.

+
+
Parameters:
+
    +
  • org_id – Organization ID

  • +
  • inventory_type – Inventory Type (property|taxlot) from the requester. This sets the related columns if requested.

  • +
  • only_used – View only the used columns that exist in the Column’s table

  • +
  • include_related – Include related columns (e.g., if inventory type is Property, include Taxlot columns)

  • +
  • exclude_derived – Exclude derived columns.

  • +
  • column_ids – List of Column ids.

  • +
+
+
+
+ +
+
+static retrieve_all_by_tuple(org_id)
+

Return list of all columns for an organization as a tuple.

+
[
+    ("PropertyState", "address_line_1"),
+    ("PropertyState", "address_line_2"),
+    ("PropertyState", "building_certification"),
+    ("PropertyState", "building_count"),
+    ("TaxLotState", "address_line_1"),
+    ("TaxLotState", "address_line_2"),
+    ("TaxLotState", "block_number"),
+    ("TaxLotState", "city"),
+    ("TaxLotState", "jurisdiction_tax_lot_id"),
+]
+
+
+
+
Parameters:
+

org_id – int, Organization ID

+
+
Returns:
+

list of tuples

+
+
+
+ +
+
+static retrieve_db_field_name_for_hash_comparison()
+

Names only of the columns in the database (fields only, not extra data), independent of inventory type. +These fields are used for generating an MD5 hash to quickly check if the data are the same across +multiple records. Note that this ignores extra_data. The result is a superset of all the fields that are used +in the database across all of the inventory types of interest.

+
+
Returns:
+

list, names of columns, independent of inventory type.

+
+
+
+ +
+
+static retrieve_db_field_table_and_names_from_db_tables()
+

Similar to keys, except it returns a list of tuples of the columns that are in the database

+
[
+    ("PropertyState", "address_line_1"),
+    ("PropertyState", "address_line_2"),
+    ("PropertyState", "building_certification"),
+    ("PropertyState", "building_count"),
+    ("TaxLotState", "address_line_1"),
+    ("TaxLotState", "address_line_2"),
+    ("TaxLotState", "block_number"),
+    ("TaxLotState", "city"),
+    ("TaxLotState", "jurisdiction_tax_lot_id"),
+]
+
+
+

:return:list of tuples

+
+ +
+
+static retrieve_db_fields(org_id)
+

return the fields in the database regardless of properties or taxlots. For example, there is an address_line_1 +in both the TaxLotState and the PropertyState. The command below will take the set to remove the duplicates.

+

[ “address_line_1”, “gross_floor_area”, … ] +:param org_id: int, Organization ID +:return: list

+
+ +
+
+static retrieve_db_fields_from_db_tables()
+

Return the list of database fields that are in the models. This is independent of what are in the +Columns table.

+
+
Returns:
+

+
+
+
+ +
+
+static retrieve_db_types()
+

Return the data types for the database columns in the format of:

+
{
+  "field_name": "data_type",
+  "field_name_2": "data_type_2",
+  "address_line_1": "string",
+}
+
+
+
+
Returns:
+

dict

+
+
+
+ +
+
+static retrieve_mapping_columns(org_id, inventory_type=None)
+

Retrieve all the columns that are for mapping for an organization in a dictionary.

+
+
Parameters:
+
    +
  • org_id – org_id, Organization ID

  • +
  • inventory_type – Inventory Type (property|taxlot) from the requester. This sets the related columns if requested.

  • +
+
+
Returns:
+

list, list of dict

+
+
+
+ +
+
+static retrieve_priorities(org_id)
+

Return the list of priorities for the columns. Result will be in the form of:

+
{
+    'PropertyState': {
+        'lot_number': 'Favor New',
+        'owner_address': 'Favor New',
+        'extra_data': {
+            'data_007': 'Favor New'
+        }
+    'TaxLotState': {
+        'custom_id_1': 'Favor New',
+        'block_number': 'Favor New',
+        'extra_data': {
+            'data_008': 'Favor New'
+        }
+}
+
+
+
+
Parameters:
+

org_id – organization with the columns

+
+
Returns:
+

dict

+
+
+
+ +
+
+salesforce_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+save(*args, **kwargs)
+

Save the current instance. Override this in a subclass if you want to +control the saving process.

+

The ‘force_insert’ and ‘force_update’ parameters can be used to insist +that the “save” must be an SQL insert or update (or equivalent for +non-SQL backends), respectively. Normally, they should not be set.

+
+ +
+
+static save_column_names(model_obj)
+

Save unique column names for extra_data in this organization.

+

This is a record of all the extra_data keys we have ever seen +for a particular organization.

+
+
Parameters:
+

model_obj – model_obj instance (either PropertyState or TaxLotState).

+
+
+
+ +
+
+shared_field_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+table_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+target_emission_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+target_energy_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+unit
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+unit_id
+
+ +
+
+units_pint
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+x_axis_columns
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+exception seed.models.columns.ColumnCastError
+

Bases: Exception

+
+ +
+
+seed.models.columns.validate_model(sender, **kwargs)
+
+ +
+
+

Cycles

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.cycles.Cycle(id, organization, user, name, start, end, created)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+analysispropertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+cycles
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+dataview_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+end
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+event_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_end(*, field=<django.db.models.fields.DateField: end>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_start(*, field=<django.db.models.fields.DateField: start>, is_next=True, **kwargs)
+
+ +
+
+classmethod get_or_create_default(organization)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_end(*, field=<django.db.models.fields.DateField: end>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_start(*, field=<django.db.models.fields.DateField: start>, is_next=False, **kwargs)
+
+ +
+
+goal_baseline_cycles
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+goal_current_cycles
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+importfile_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+propertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+start
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+taxlotproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+user
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+user_id
+
+ +
+ +
+
+

Joins

+
+
+

Generic Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.models.StatusLabel(id, created, modified, name, color, super_organization, show_in_list)
+

Bases: TimeStampedModel

+
+
+BLUE_CHOICE = 'blue'
+
+ +
+
+COLOR_CHOICES = (('red', 'red'), ('blue', 'blue'), ('light blue', 'light blue'), ('green', 'green'), ('white', 'white'), ('orange', 'orange'), ('gray', 'gray'))
+
+ +
+
+DEFAULT_LABELS = ['Residential', 'Non-Residential', 'Violation', 'Compliant', 'Missing Data', 'Questionable Report', 'Update Bldg Info', 'Call', 'Email', 'High EUI', 'Low EUI', 'Exempted', 'Extension', 'Change of Ownership']
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+GRAY_CHOICE = 'gray'
+
+ +
+
+GREEN_CHOICE = 'green'
+
+ +
+
+LIGHT_BLUE_CHOICE = 'light blue'
+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+ORANGE_CHOICE = 'orange'
+
+ +
+
+RED_CHOICE = 'red'
+
+ +
+
+WHITE_CHOICE = 'white'
+
+ +
+
+and_filter_groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+color
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+compliance_label
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+exclude_filter_groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_color_display(*, field=<django.db.models.fields.CharField: color>)
+
+ +
+
+get_next_by_created(*, field=<django_extensions.db.fields.CreationDateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_modified(*, field=<django_extensions.db.fields.ModificationDateTimeField: modified>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django_extensions.db.fields.CreationDateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_modified(*, field=<django_extensions.db.fields.ModificationDateTimeField: modified>, is_next=False, **kwargs)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+indication_label
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+or_filter_groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyview_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+rule_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+show_in_list
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+super_organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+super_organization_id
+
+ +
+
+taxlotview_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+to_dict()
+
+ +
+
+violation_label
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.models.Unit(*args, **kwargs)
+

Bases: Model

+

Unit of measure for a Column Value.

+
+
+DATE = 4
+
+ +
+
+DATETIME = 5
+
+ +
+
+DECIMAL = 2
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+FLOAT = 3
+
+ +
+
+INTEGER = 6
+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+STRING = 1
+
+ +
+
+UNIT_TYPES = ((1, 'String'), (6, 'Integer'), (3, 'Float'), (4, 'Date'), (5, 'Datetime'))
+
+ +
+
+column_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_unit_type_display(*, field=<django.db.models.fields.IntegerField: unit_type>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+unit_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+unit_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+

Properties

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.properties.Property(*args, **kwargs)
+

Bases: Model

+

The Property is the parent property that ties together all the views of the property. +For example, if a building has multiple changes overtime, then this Property will always +remain the same. The PropertyView will point to the unchanged property as the PropertyState +and Property view are updated.

+

The property can also reference a parent property.

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+access_level_instance
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+access_level_instance_id
+
+ +
+
+analysispropertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+copy_meters(source_property_id, source_persists=True)
+

Copies meters from a source Property to the current Property.

+

It’s most efficient if the persistence of the source Property’s readings +aren’t needed as bulk reassignments can then be used.

+

The cases and logic are described in comments throughout.

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_loggers
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+events
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+goalnote_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+historical_note
+

Accessor to the related object on the reverse side of a one-to-one +relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Place.restaurant is a ReverseOneToOneDescriptor instance.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+inventory_documents
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+meters
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+parent_property
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_property_id
+
+ +
+
+property_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+views
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.properties.PropertyAuditLog(id, organization, parent1, parent2, parent_state1, parent_state2, state, view, name, description, import_filename, record_type, created)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_record_type_display(*, field=<django.db.models.fields.IntegerField: record_type>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_filename
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+parent1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent1_id
+
+ +
+
+parent2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent2_id
+
+ +
+
+parent_state1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state1_id
+
+ +
+
+parent_state2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state2_id
+
+ +
+
+propertyauditlog_parent1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyauditlog_parent2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+record_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+view
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+view_id
+
+ +
+ +
+
+class seed.models.properties.PropertyState(*args, **kwargs)
+

Bases: Model

+

Store a single property. This contains all the state information about the property

+

For property_timezone, use the pytz timezone strings. The US has the following and a full +list can be created by calling pytz.all_timezones in Python:

+
+
    +
  • US/Alaska

  • +
  • US/Aleutian

  • +
  • US/Arizona

  • +
  • US/Central

  • +
  • US/East-Indiana

  • +
  • US/Eastern

  • +
  • US/Hawaii

  • +
  • US/Indiana-Starke

  • +
  • US/Michigan

  • +
  • US/Mountain

  • +
  • US/Pacific

  • +
  • US/Samoa

  • +
+
+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+address_line_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+address_line_2
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+analysispropertyview
+

Accessor to the related object on the reverse side of a one-to-one +relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Place.restaurant is a ReverseOneToOneDescriptor instance.

+
+ +
+
+audit_template_building_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+bounding_box
+
+ +
+
+building_certification
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+building_count
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+building_files
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+centroid
+
+ +
+
+city
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+clean()
+

Hook for doing any extra model-wide validation after clean() has been +called on every field by self.clean_fields. Any ValidationError raised +by this method will not be associated with a particular field; it will +have a special-case association with the field defined by NON_FIELD_ERRORS.

+
+ +
+
+conditioned_floor_area
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+conditioned_floor_area_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+classmethod coparent(state_id)
+

Return the coparent of the PropertyState. This will query the PropertyAuditLog table to +determine if there is a coparent and return it if it is found. The state_id needs to be +the base ID of when the original record was imported

+
+
Parameters:
+

state_id – integer, state id to find coparent.

+
+
Returns:
+

dict

+
+
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+custom_id_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+egrid_subregion_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+energy_alerts
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+energy_score
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+extra_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+generation_date
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+geocoding_confidence
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_data_state_display(*, field=<django.db.models.fields.IntegerField: data_state>)
+
+ +
+
+get_merge_state_display(*, field=<django.db.models.fields.IntegerField: merge_state>)
+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+get_source_type_display(*, field=<django.db.models.fields.IntegerField: source_type>)
+
+ +
+
+gross_floor_area
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+gross_floor_area_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+hash_object
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+history()
+

Return the history of the property state by parsing through the auditlog. Returns only the ids +of the parent states and some descriptions.

+
+

main +/ / parent1 parent2

+
+

In the records, parent2 is most recent, so make sure to navigate parent two first since we +are returning the data in reverse over (that is most recent changes first)

+
+
Returns:
+

list, history as a list, and the main record

+
+
+
+ +
+
+home_energy_score_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_file
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+import_file_id
+
+ +
+
+jurisdiction_property_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+latitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+long_lat
+
+ +
+
+longitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+lot_number
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+measure_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+measures
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+classmethod merge_relationships(merged_state, state1, state2)
+

Merge together the old relationships with the new.

+
+
Parameters:
+
    +
  • merged_state – empty state to fill with merged state

  • +
  • state1*State

  • +
  • state2*State - given priority over state1

  • +
+
+
+
+ +
+
+merge_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+normalized_address
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+occupied_floor_area
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+occupied_floor_area_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+owner
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_address
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_city_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_email
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_postal_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_telephone
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+parent_state1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+parent_state2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+pm_parent_property_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+pm_property_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+postal_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+promote(cycle, property_id=None)
+

Promote the PropertyState to the view table for the given cycle

+
+
Args:

cycle: Cycle to assign the view +property_id: Optional ID of a canonical property model object +to retain instead of creating a new property

+
+
Returns:

The resulting PropertyView (note that it is not returning the +PropertyState)

+
+
+
+ +
+
+property_footprint
+
+ +
+
+property_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property_notes
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property_timezone
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+propertyauditlog_state
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertymeasure_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+raw_access_level_instance
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+raw_access_level_instance_error
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+raw_access_level_instance_id
+
+ +
+
+recent_sale_date
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+release_date
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+save(*args, **kwargs)
+

Save the current instance. Override this in a subclass if you want to +control the saving process.

+

The ‘force_insert’ and ‘force_update’ parameters can be used to insist +that the “save” must be an SQL insert or update (or equivalent for +non-SQL backends), respectively. Normally, they should not be set.

+
+ +
+
+scenarios
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+simulation
+

Accessor to the related object on the reverse side of a one-to-one +relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Place.restaurant is a ReverseOneToOneDescriptor instance.

+
+ +
+
+site_eui
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_modeled
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_modeled_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_weather_normalized
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_weather_normalized_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_modeled
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_modeled_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_weather_normalized
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_weather_normalized_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+space_alerts
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+to_dict(fields=None, include_related_data=True)
+

Returns a dict version of the PropertyState, either with all fields +or masked to just those requested.

+
+ +
+
+total_ghg_emissions
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+total_ghg_emissions_intensity
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+total_marginal_ghg_emissions
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+total_marginal_ghg_emissions_intensity
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+ubid
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+ubidmodel_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+use_description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+year_built
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+year_ending
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+class seed.models.properties.PropertyView(*args, **kwargs)
+

Bases: Model

+

Similar to the old world of canonical building.

+

A PropertyView contains a reference to a property (which should not change) and to a +cycle (time period), and a state (characteristics).

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+cycle
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+cycle_id
+
+ +
+
+gapauditlog_view
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+greenassessmentproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property import_filename
+

Get the import file name form the audit logs

+
+ +
+
+initialize_audit_logs(**kwargs)
+
+ +
+
+labels
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+notes
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+property
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+property_id
+
+ +
+
+propertyauditlog_view
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+tax_lot_states()
+

Return a list of TaxLotStates associated with this PropertyView and Cycle

+
+
Returns:
+

list of TaxLotStates

+
+
+
+ +
+
+tax_lot_views()
+

Return a list of TaxLotViews that are associated with this PropertyView and Cycle

+
+
Returns:
+

list of TaxLotViews

+
+
+
+ +
+
+taxlotproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+seed.models.properties.post_save_property(sender, instance, created, **kwargs)
+
+ +
+
+seed.models.properties.post_save_property_state(sender, **kwargs)
+

Generate UbidModels for a PropertyState if the ubid field is present

+
+ +
+
+seed.models.properties.post_save_property_view(sender, **kwargs)
+

When changing/saving the PropertyView, go ahead and touch the Property (if linked) so that the +record receives an updated datetime

+
+ +
+
+seed.models.properties.pre_delete_state(sender, **kwargs)
+
+ +
+
+seed.models.properties.set_default_access_level_instance(sender, instance, **kwargs)
+

If ALI not set, put this Property as the root.

+
+ +
+
+seed.models.properties.sync_latitude_longitude_and_long_lat(sender, instance, **kwargs)
+
+ +
+
+

TaxLots

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.tax_lots.TaxLot(id, organization, access_level_instance, created, updated)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+access_level_instance
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+access_level_instance_id
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+views
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.tax_lots.TaxLotAuditLog(id, organization, parent1, parent2, parent_state1, parent_state2, state, view, name, description, import_filename, record_type, created)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_record_type_display(*, field=<django.db.models.fields.IntegerField: record_type>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_filename
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+parent1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent1_id
+
+ +
+
+parent2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent2_id
+
+ +
+
+parent_state1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state1_id
+
+ +
+
+parent_state2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state2_id
+
+ +
+
+record_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+taxlotauditlog_parent1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotauditlog_parent2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+view
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+view_id
+
+ +
+ +
+
+class seed.models.tax_lots.TaxLotState(id, import_file, organization, data_state, merge_state, raw_access_level_instance, raw_access_level_instance_error, custom_id_1, jurisdiction_tax_lot_id, block_number, district, address_line_1, address_line_2, normalized_address, city, state, postal_code, number_properties, extra_data, hash_object, latitude, longitude, long_lat, centroid, bounding_box, taxlot_footprint, ubid, geocoding_confidence, created, updated)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+address_line_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+address_line_2
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+block_number
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+bounding_box
+
+ +
+
+centroid
+
+ +
+
+city
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+classmethod coparent(state_id)
+

Return the coparent of the TaxLotState. This will query the TaxLotAuditLog table to +determine if there is a coparent and return it if it is found. The state_id needs to be +the base ID of when the original record was imported

+
+
Parameters:
+

state_id – integer, state id to find coparent.

+
+
Returns:
+

dict

+
+
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+custom_id_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+district
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+extra_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+geocoding_confidence
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_data_state_display(*, field=<django.db.models.fields.IntegerField: data_state>)
+
+ +
+
+get_merge_state_display(*, field=<django.db.models.fields.IntegerField: merge_state>)
+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+hash_object
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+history()
+

Return the history of the taxlot state by parsing through the auditlog. Returns only the ids +of the parent states and some descriptions.

+
+
+

main

+
+

/ / parent1 parent2

+
+

In the records, parent2 is most recent, so make sure to navigate parent two first since we +are returning the data in reverse over (that is most recent changes first)

+
+
Returns:
+

list, history as a list, and the main record

+
+
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_file
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+import_file_id
+
+ +
+
+jurisdiction_tax_lot_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+latitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+long_lat
+
+ +
+
+longitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+classmethod merge_relationships(merged_state, state1, state2)
+

Stub to implement if merging TaxLotState relationships is needed

+
+ +
+
+merge_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+normalized_address
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+number_properties
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+postal_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+promote(cycle)
+

Promote the TaxLotState to the view table for the given cycle

+
+
Args:

cycle: Cycle to assign the view

+
+
Returns:

The resulting TaxLotView (note that it is not returning the +TaxLotState)

+
+
+
+ +
+
+raw_access_level_instance
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+raw_access_level_instance_error
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+raw_access_level_instance_id
+
+ +
+
+save(*args, **kwargs)
+

Save the current instance. Override this in a subclass if you want to +control the saving process.

+

The ‘force_insert’ and ‘force_update’ parameters can be used to insist +that the “save” must be an SQL insert or update (or equivalent for +non-SQL backends), respectively. Normally, they should not be set.

+
+ +
+
+state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+taxlot_footprint
+
+ +
+
+taxlotauditlog_parent_state1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotauditlog_parent_state2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotauditlog_state
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+to_dict(fields=None, include_related_data=True)
+

Returns a dict version of the TaxLotState, either with all fields +or masked to just those requested.

+
+ +
+
+ubid
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+ubidmodel_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+class seed.models.tax_lots.TaxLotView(id, taxlot, state, cycle)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+cycle
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+cycle_id
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property import_filename
+

Get the import file name form the audit logs

+
+ +
+
+initialize_audit_logs(**kwargs)
+
+ +
+
+labels
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+notes
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+property_states()
+

Return a list of PropertyStates associated with this TaxLotView and Cycle

+
+
Returns:
+

list of PropertyStates

+
+
+
+ +
+
+property_views()
+

Return a list of PropertyViews that are associated with this TaxLotView and Cycle

+
+
Returns:
+

list of PropertyViews

+
+
+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+taxlot
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+taxlot_id
+
+ +
+
+taxlotauditlog_view
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+seed.models.tax_lots.post_save_taxlot_state(sender, **kwargs)
+

Generate UbidModels for a TaxLotState if the ubid field is present

+
+ +
+
+seed.models.tax_lots.post_save_taxlot_view(sender, **kwargs)
+

When changing/saving the TaxLotView, go ahead and touch the TaxLot (if linked) so that the record +receives an updated datetime

+
+ +
+
+seed.models.tax_lots.set_default_access_level_instance(sender, instance, **kwargs)
+

If ALI not set, put this TaxLot as the root.

+
+ +
+
+seed.models.tax_lots.sync_latitude_longitude_and_long_lat(sender, instance, **kwargs)
+
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.public.html b/docs/code_documentation/3.0.0/modules/seed.public.html new file mode 100644 index 00000000..ecfcd934 --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.public.html @@ -0,0 +1,159 @@ + + + + + + + Public Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Public Package

+
+

Submodules

+
+
+

Models

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.serializers.html b/docs/code_documentation/3.0.0/modules/seed.serializers.html new file mode 100644 index 00000000..5a03244a --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.serializers.html @@ -0,0 +1,254 @@ + + + + + + + Serializers Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Serializers Package

+
+

Submodules

+
+
+

Serializers

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.serializers.celery.CeleryDatetimeSerializer(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)
+

Bases: JSONEncoder

+
+
+default(obj)
+

Implement this method in a subclass such that it returns +a serializable object for o, or calls the base implementation +(to raise a TypeError).

+

For example, to support arbitrary iterators, you could +implement default like this:

+
def default(self, o):
+    try:
+        iterable = iter(o)
+    except TypeError:
+        pass
+    else:
+        return list(iterable)
+    # Let the base class default method raise the TypeError
+    return JSONEncoder.default(self, o)
+
+
+
+ +
+
+static seed_decoder(obj)
+
+ +
+
+static seed_dumps(obj)
+
+ +
+
+static seed_loads(obj)
+
+ +
+ +
+
+

Labels

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.serializers.labels.LabelSerializer(*args, **kwargs)
+

Bases: ModelSerializer

+
+
+class Meta
+

Bases: object

+
+
+extra_kwargs = {'super_organization': {'write_only': True}}
+
+ +
+
+fields = ('id', 'name', 'color', 'organization_id', 'super_organization', 'is_applied', 'show_in_list')
+
+ +
+
+model
+

alias of StatusLabel

+
+ +
+ +
+
+get_is_applied(obj)
+
+ +
+
+to_representation(instance)
+

Object instance -> Dict of primitive datatypes.

+
+ +
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.templatetags.html b/docs/code_documentation/3.0.0/modules/seed.templatetags.html new file mode 100644 index 00000000..50359cfd --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.templatetags.html @@ -0,0 +1,277 @@ + + + + + + + Templatetags Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Templatetags Package

+
+

Submodules

+
+
+

Breadcrumbs

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

breadcrumbs.py, https://bitbucket.org/Mathiasdm/django-simple-breadcrumbs/

+
+
+class seed.templatetags.breadcrumbs.BreadcrumbNode(variables, render_func=<function create_crumb>)
+

Bases: Node

+
+
+render(context)
+

Return the node rendered as a string.

+
+ +
+ +
+
+class seed.templatetags.breadcrumbs.UrlBreadcrumbNode(title, url_node, render_func=<function create_crumb>)
+

Bases: Node

+
+
+render(context)
+

Return the node rendered as a string.

+
+ +
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb(parser, token)
+

Section author: Andriy Drozdyuk

+

Renders the breadcrumb.

+

Example:

+
{% breadcrumb "Title of breadcrumb" url_var %}
+{% breadcrumb context_var  url_var %}
+{% breadcrumb "Just the title" %}
+{% breadcrumb just_context_var %}
+
+
+

Parameters:

+
First parameter is the title of the crumb
+Second (optional) parameter is the url variable to link to, produced by url tag, i.e.:
+    {% url "person_detail" object.id as person_url %}
+    then:
+    {% breadcrumb person.name person_url %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb_root(parser, token)
+

Section author: Andriy Drozdyuk

+

Renders the breadcrumb.

+

Examples:

+
{% breadcrumb "Title of breadcrumb" url_var %}
+{% breadcrumb context_var  url_var %}
+{% breadcrumb "Just the title" %}
+{% breadcrumb just_context_var %}
+
+
+

Parameters:

+
First parameter is the title of the crumb,
+Second (optional) parameter is the url variable to link to, produced by url tag, i.e.:
+    {% url "person_detail/" object.id as person_url %}
+    then:
+    {% breadcrumb person.name person_url %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb_url(parser, token)
+

Same as breadcrumb but instead of url context variable takes in all the +arguments URL tag takes.

+
{% breadcrumb "Title of breadcrumb" person_detail person.id %}
+{% breadcrumb person.name person_detail person.id %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb_url_root(parser, token)
+

Same as breadcrumb but instead of url context variable takes in all the +arguments URL tag takes.

+
{% breadcrumb "Title of breadcrumb" person_detail person.id %}
+{% breadcrumb person.name person_detail person.id %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.create_crumb(title, url=None)
+

Helper function

+
+ +
+
+seed.templatetags.breadcrumbs.create_crumb_first(title, url=None)
+

Helper function

+
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.test_helpers.factory.html b/docs/code_documentation/3.0.0/modules/seed.test_helpers.factory.html new file mode 100644 index 00000000..a9b44386 --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.test_helpers.factory.html @@ -0,0 +1,298 @@ + + + + + + + Test Helper Factor Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Test Helper Factor Package

+
+

Subpackages

+ +
+
+

Submodules

+
+
+

Helpers

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.test_helpers.factory.helpers.DjangoFunctionalFactory
+

Bases: object

+
+
+classmethod invalid_test_cc_number()
+
+ +
+
+classmethod rand_bool()
+
+ +
+
+classmethod rand_city()
+
+ +
+
+classmethod rand_city_suffix()
+
+ +
+
+classmethod rand_currency(start=0, end=100)
+
+ +
+
+classmethod rand_date(start_year=1900, end_year=2011)
+
+ +
+
+classmethod rand_domain()
+
+ +
+
+classmethod rand_email()
+
+ +
+
+classmethod rand_float(start=0, end=100)
+
+ +
+
+classmethod rand_int(start=0, end=100)
+
+ +
+
+classmethod rand_name()
+
+ +
+
+classmethod rand_phone()
+
+ +
+
+classmethod rand_plant_name()
+
+ +
+
+classmethod rand_str(length=None)
+
+ +
+
+classmethod rand_street_address()
+
+ +
+
+classmethod rand_street_suffix()
+
+ +
+
+classmethod test_cc_number(valid=True)
+
+ +
+
+classmethod valid_test_cc_number()
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.test_helpers.factory.lib.html b/docs/code_documentation/3.0.0/modules/seed.test_helpers.factory.lib.html new file mode 100644 index 00000000..ae33b173 --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.test_helpers.factory.lib.html @@ -0,0 +1,189 @@ + + + + + + + Test Helper Factory Lib Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.test_helpers.html b/docs/code_documentation/3.0.0/modules/seed.test_helpers.html new file mode 100644 index 00000000..5a821014 --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.test_helpers.html @@ -0,0 +1,229 @@ + + + + + + + Test Helpers Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.tests.functional.html b/docs/code_documentation/3.0.0/modules/seed.tests.functional.html new file mode 100644 index 00000000..6393152a --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.tests.functional.html @@ -0,0 +1,194 @@ + + + + + + + Tests (Functional) Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.tests.html b/docs/code_documentation/3.0.0/modules/seed.tests.html new file mode 100644 index 00000000..52ac0e10 --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.tests.html @@ -0,0 +1,965 @@ + + + + + + + Tests Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tests Package

+
+

Submodules

+ +
+
+

Admin Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.test_admin_views.AdminViewsTest(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_add_org()
+

Happy path test for creating a new org.

+
+ +
+
+test_add_org_dupe()
+

Trying to create an org with a dupe name fails.

+
+ +
+
+test_add_owner_existing_org_to_non_root()
+
+ +
+
+test_add_user_existing_org()
+

Test creating a new user, adding them to an existing org +in the process.

+
+ +
+
+test_add_user_new_org()
+

Create a new user and a new org at the same time.

+
+ +
+
+test_add_user_no_org()
+

Should not be able to create a new user without either +selecting or creating an org at the same time.

+
+ +
+
+test_signup_process()
+

Simulates the entire new user signup process, from initial +account creation by an admin to receiving the signup email +to confirming the account and setting a password.

+
+ +
+
+test_signup_process_force_lowercase_email()
+

Simulates the signup and login forcing login username to lowercase

+
+ +
+ +
+
+

Decorators

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.test_decorators.ClassDecoratorTests(methodName='runTest')
+

Bases: TestCase

+
+
+test_ajax_request_class_dict()
+
+ +
+
+test_ajax_request_class_dict_status_error()
+
+ +
+
+test_ajax_request_class_dict_status_false()
+
+ +
+
+test_ajax_request_class_format_type()
+
+ +
+
+test_require_organization_id_class_no_org_id()
+
+ +
+
+test_require_organization_id_class_org_id()
+
+ +
+
+test_require_organization_id_class_org_id_not_int()
+
+ +
+ +
+
+class seed.tests.test_decorators.RequireOrganizationIDTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_require_organization_id_fail_no_key()
+
+ +
+
+test_require_organization_id_fail_not_numeric()
+
+ +
+
+test_require_organization_id_success_integer()
+
+ +
+
+test_require_organization_id_success_string()
+
+ +
+ +
+
+class seed.tests.test_decorators.TestDecorators(methodName='runTest')
+

Bases: TestCase

+

Tests for locking tasks and reporting progress.

+
+
+locked = 1
+
+ +
+
+pk = 34
+
+ +
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_get_prog_key()
+

We format our cache key properly.

+
+ +
+
+test_increment_cache()
+

Sum our progress by increments properly.

+
+ +
+
+test_locking()
+

Make sure we indicate we’re locked if and only if we’re inside the function.

+
+ +
+
+test_locking_w_exception()
+

Make sure we release our lock if we have had an exception.

+
+ +
+
+test_progress()
+

When a task finishes, it increments the progress counter properly.

+
+ +
+
+unlocked = 0
+
+ +
+ +
+
+exception seed.tests.test_decorators.TestError
+

Bases: Exception

+
+ +
+
+

Exporters

+
+
+

Models

+
+
+

Tasks

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.test_tasks.TestTasks(methodName='runTest')
+

Bases: TestCase

+

Tests for dealing with SEED related tasks.

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_delete_organization()
+
+ +
+ +
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.test_views.DatasetPermissionsTests(methodName='runTest')
+

Bases: AccessLevelBaseTestCase

+
+
+setUp()
+

SUPERUSER

+
+ +
+
+test_dataset_count()
+
+ +
+
+test_dataset_create()
+
+ +
+
+test_dataset_destroy()
+
+ +
+
+test_dataset_list()
+
+ +
+
+test_dataset_retrieve()
+
+ +
+
+test_dataset_update()
+
+ +
+ +
+
+class seed.tests.test_views.GetDatasetsViewsTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_delete_dataset()
+
+ +
+
+test_get_dataset()
+
+ +
+
+test_get_datasets()
+
+ +
+
+test_get_datasets_count()
+
+ +
+
+test_get_datasets_count_invalid()
+
+ +
+
+test_update_dataset()
+
+ +
+ +
+
+class seed.tests.test_views.ImportFileViewsTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_delete_file()
+
+ +
+
+test_get_import_file()
+
+ +
+
+test_get_matching_and_geocoding_results()
+
+ +
+ +
+
+class seed.tests.test_views.InventoryViewTests(methodName='runTest')
+

Bases: AssertDictSubsetMixin, DeleteModelsTestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_get_cycles()
+
+ +
+
+test_get_properties()
+
+ +
+
+test_get_properties_cycle_id()
+
+ +
+
+test_get_properties_empty_page()
+
+ +
+
+test_get_properties_page_not_an_integer()
+
+ +
+
+test_get_properties_pint_fields()
+
+ +
+
+test_get_properties_profile_id()
+
+ +
+
+test_get_properties_property_extra_data()
+
+ +
+
+test_get_properties_select_all()
+
+ +
+
+test_get_properties_taxlot_extra_data()
+
+ +
+
+test_get_properties_with_taxlots()
+
+ +
+
+test_get_properties_with_taxlots_with_footprints()
+
+ +
+
+test_get_properties_wrong_query_params()
+
+ +
+
+test_get_property()
+
+ +
+
+test_get_property_columns()
+
+ +
+
+test_get_property_multiple_taxlots()
+
+ +
+
+test_get_taxlot()
+
+ +
+
+test_get_taxlot_columns()
+
+ +
+
+test_get_taxlots()
+
+ +
+
+test_get_taxlots_empty_page()
+
+ +
+
+test_get_taxlots_extra_data()
+
+ +
+
+test_get_taxlots_multiple_taxlots()
+
+ +
+
+test_get_taxlots_no_cycle_id()
+
+ +
+
+test_get_taxlots_page_not_an_integer()
+
+ +
+
+test_get_taxlots_profile_id()
+
+ +
+
+test_postoffice()
+
+ +
+
+test_update_pint_fields_with_modified_display_settings()
+
+ +
+ +
+
+class seed.tests.test_views.MainViewTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_home()
+
+ +
+ +
+
+class seed.tests.test_views.TestMCMViews(methodName='runTest')
+

Bases: TestCase

+
+
+assert_expected_mappings(actual, expected)
+

For each k,v pair of form column_name: [dest_col, confidence] +in actual, assert that expected contains the same column_name +and dest_col mapping.

+
+ +
+
+expected_mappings = {'address': ['owner_address', 70], 'building id': ['Building air leakage', 64], 'name': ['Name of Audit Certification Holder', 47], 'year built': ['year_built', 50]}
+
+ +
+
+raw_columns_expected = {'raw_columns': ['name', 'address', 'year built', 'building id'], 'status': 'success'}
+
+ +
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_create_dataset()
+

tests the create_dataset view, allows duplicate dataset names

+
+ +
+
+test_get_column_mapping_suggestions()
+
+ +
+
+test_get_column_mapping_suggestions_pm_file()
+
+ +
+
+test_get_column_mapping_suggestions_with_columns()
+
+ +
+
+test_get_raw_column_names()
+

Good case for get_raw_column_names.

+
+ +
+
+test_progress()
+

Make sure we retrieve data from cache properly.

+
+ +
+
+test_save_column_mappings()
+
+ +
+
+test_save_column_mappings_idempotent()
+

We need to make successive calls to save_column_mappings.

+
+ +
+ +
+
+

Tests

+
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.util.AccessLevelBaseTestCase(methodName='runTest')
+

Bases: TestCase

+

Base Test Case Class to handle Access Levels +Creates a root owner user, a root member user, +and a child member user +Useful for testing “setup” API endpoints +as well as “data” endpoints +Provides methods for logging in as different +users +Sets up the factories

+
+
+login_as_child_member()
+

Login to client as Child-Level member user

+
+ +
+
+login_as_root_member()
+

Login to client as Root-Level member user

+
+ +
+
+login_as_root_owner()
+

Login to client as Root-Level owner user

+
+ +
+
+setUp()
+

SUPERUSER

+
+ +
+ +
+
+class seed.tests.util.AssertDictSubsetMixin
+

Bases: object

+
+
+assertDictContainsSubset(subset, dictionary)
+

Checks whether dictionary is a superset of subset

+

This is a necessary polyfill b/c assertDictContainsSubset was deprecated +and I believe it’s much more readable compared to the implementation below

+
+ +
+ +
+
+class seed.tests.util.DataMappingBaseTestCase(methodName='runTest')
+

Bases: DeleteModelsTestCase

+

Base Test Case Class to handle data import

+
+
+create_import_file(user, org, cycle, source_type=0, data_state=1)
+
+ +
+
+set_up(import_file_source_type, user_name='test_user@demo.com', user_password='test_pass')
+
+ +
+ +
+
+class seed.tests.util.DeleteModelsTestCase(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+tearDown()
+

Hook method for deconstructing the test fixture after testing it.

+
+ +
+ +
+
+class seed.tests.util.FakeClient
+

Bases: object

+

An extremely light-weight test client.

+
+
+get(view_func, data, headers=None, **kwargs)
+
+ +
+
+post(view_func, data, headers=None, **kwargs)
+
+ +
+ +
+
+class seed.tests.util.FakeRequest(data=None, headers=None, user=None, method='POST', **kwargs)
+

Bases: object

+

A simple request stub.

+
+
+GET: Dict[str, Any] = {}
+
+ +
+
+META = {'REMOTE_ADDR': '127.0.0.1'}
+
+ +
+
+POST: Dict[str, Any] = {}
+
+ +
+
+body = None
+
+ +
+
+path = 'fake_login_path'
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.urls.html b/docs/code_documentation/3.0.0/modules/seed.urls.html new file mode 100644 index 00000000..fef00c53 --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.urls.html @@ -0,0 +1,161 @@ + + + + + + + URLs Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

URLs Package

+
+

Submodules

+
+
+

Accounts

+
+
+

APIs

+
+
+

Main

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.utils.html b/docs/code_documentation/3.0.0/modules/seed.utils.html new file mode 100644 index 00000000..af0a8b4d --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.utils.html @@ -0,0 +1,563 @@ + + + + + + + Utilities Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Utilities Package

+
+

Submodules

+
+
+

APIs

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.utils.api.APIBypassCSRFMiddleware(get_response)
+

Bases: object

+

This middleware turns off CSRF protection for API clients.

+

It must come before CsrfViewMiddleware in settings.MIDDLEWARE.

+
+ +
+
+class seed.utils.api.OrgCreateMixin
+

Bases: OrgMixin

+

Mixin to add organization when creating model instance

+
+
+perform_create(serializer)
+

Override to add org

+
+ +
+ +
+
+class seed.utils.api.OrgCreateUpdateMixin
+

Bases: OrgCreateMixin, OrgUpdateMixin

+

Mixin to add organization when creating/updating model instance

+
+ +
+
+class seed.utils.api.OrgMixin
+

Bases: object

+

Provides get_organization and get_parent_org method

+
+
+get_organization(request, return_obj=False)
+

Get org from query param or request.user.

+
+
Parameters:
+
    +
  • request – request object.

  • +
  • return_obj – bool. Set to True if obj vs pk is desired.

  • +
+
+
Returns:
+

int representing a valid organization pk or organization object.

+
+
+
+ +
+
+get_parent_org(request)
+

Gets parent organization of org from query param or request. +:param request: Request object. +:return: organization object.

+
+ +
+ +
+
+class seed.utils.api.OrgQuerySetMixin
+

Bases: OrgMixin

+

Mixin proving a get_queryset method that filters on organization.

+

In order to use this mixin you must specify the model attributes on the +View[Set] class. By default it assumes there is an organization field +on the model. You can override this by setting the orgfilter attribute +to the appropriate fieldname. This also allows nested fields e.g. +foreign_key.organization +By default this retrieves organization from query string param OR the +default_organization or first returned organization of the logged in user. +You can force it to return the appropriate “parent” organization by setting +the force_parent attribute to True.

+
+
+get_queryset()
+

get_queryset filtered on organization

+
+ +
+ +
+
+class seed.utils.api.OrgUpdateMixin
+

Bases: OrgMixin

+

Mixin to add organization when updating model instance

+
+
+perform_update(serializer)
+

Override to add org

+
+ +
+ +
+
+class seed.utils.api.OrgValidateMixin
+

Bases: object

+

Mixin to provide a validate() method organization to ensure users belongs +to the same org as the instance referenced by a foreign key..

+

You must set org_validators on the Serializer that uses this Mixin. +This is a list of OrgValidator named tuples (where key is the key +on request data representing the foreign key, and field the foreign key +that represents the organization on the corresponding model.

+

my_validator = OrgValidator(key=’foreign_key, field=’organization_id’)

+

..example:

+
+
+
class MySerializer(OrgValidateMixin, serializers.ModelSerializer):
+
foreign_key= serializers.PrimaryKeyRelatedField(

query_set=MyModel.objects.all()

+
+
+

) +org_validators = [my_validator]

+
+
+
+

This ensures request.user belongs to the org MyModel.organization

+

You can traverse foreign key relationships by using a double underscore +in validator.field

+

In the example above setting validator field to be ‘property__org_id’ +is equivalent to MyModel.property.org_id

+

If you use this Mixin and write a validate method, you must call super +to ensure validation takes place.

+
+
+validate(data)
+

Object level validation.

+

Checks for self.org_validators on Serializers and +ensures users belongs to org corresponding to the foreign key +being set.

+
+ +
+
+validate_org(instance, user, validator)
+

Raise error if orgs do not match.

+
+
Parameters:
+
    +
  • instance (model instance) – value in request.data.get(key) to check against

  • +
  • validator – validator to user

  • +
+
+
Param:
+

org_id of user, from get_org_id(request)

+
+
Type:
+

OrgValidator named tuple

+
+
+
+ +
+ +
+
+class seed.utils.api.OrgValidator(key, field)
+

Bases: tuple

+
+
+field
+

Alias for field number 1

+
+ +
+
+key
+

Alias for field number 0

+
+ +
+ +
+
+class seed.utils.api.ProfileIdMixin
+

Bases: object

+

Provides methods to get the columns to show based on a profile ID

+
+
+get_show_columns(org_id, profile_id)
+

Get list of columns from the profile_id. The result will be in the form of

+
+
show_columns = {

‘fields’: [‘field_1’, ‘field_2’, …] +‘extra_data’: [‘extra_data_field_1’, ‘extra_data_field_2’, …]

+
+
+

}

+
+
Parameters:
+
    +
  • org_id – str, id of organization

  • +
  • profile_id – str, id of profile to retrieve

  • +
+
+
Returns:
+

dist of lists

+
+
+
+ +
+ +
+
+seed.utils.api.api_endpoint(fn)
+

Decorator function to mark a view as allowed to authenticate via API key.

+

Decorator must be used before login_required or has_perm to set +request.user for those decorators.

+
+ +
+
+seed.utils.api.api_endpoint_class(fn)
+

Decorator function to mark a view as allowed to authenticate via API key.

+

Decorator must be used before login_required or has_perm to set +request.user for those decorators.

+
+ +
+
+seed.utils.api.clean_api_regex(url)
+

Given a django-style url regex pattern, strip it down to a human-readable +url.

+

TODO: If pks ever appear in the url, this will need to account for that.

+
+ +
+
+seed.utils.api.drf_api_endpoint(fn)
+

Decorator to register a Django Rest Framework view with the list of API +endpoints. Marks it with is_api_endpoint = True as well as appending it +to the global endpoints list.

+
+ +
+
+seed.utils.api.format_api_docstring(docstring)
+

Cleans up a python method docstring for human consumption.

+
+ +
+
+seed.utils.api.get_all_urls(urllist, prefix='')
+

Recursive generator that traverses entire tree of URLs, starting with +urllist, yielding a tuple of (url_pattern, view_function) for each +one.

+
+ +
+
+seed.utils.api.get_api_endpoints()
+

Examines all views and returns those with is_api_endpoint set +to true (done by the @api_endpoint decorator).

+
+ +
+
+seed.utils.api.get_api_request_user(request)
+

Determines if this is an API request and returns the corresponding user if so.

+
+ +
+
+seed.utils.api.get_org_id_from_validator(instance, field)
+

For querysets Django enables you to do things like:

+

note double underscore. However you can’t do:

+

This presents an issue as getattr only works 1 level deep:

+
+

getattr(obj, ‘org.id’) does not work either.

+
+

This can be worked around using rgetattr (above). +This functions mimics getattr(obj, ‘org__id’) by +splitting field on __ and calling rgetattr on the result.

+
+ +
+
+seed.utils.api.rgetattr(obj, lst)
+

This enables recursive getattr look ups. +given obj, [‘a’, ‘b’, ‘c’] as params it will look up: +obj.a, a.b, b.c returning b.c unless one of the previous +values was None, in which case it returns None immediately.

+
+
Parameters:
+
    +
  • obj (object) – initial object to examine

  • +
  • lst (list) – list of successive attributes to look up

  • +
+
+
+
+ +
+
+

Buildings

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.utils.buildings.get_source_type(import_file, source_type='')
+

Used for converting ImportFile source_type into an int.

+
+ +
+
+

Organizations

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.utils.organizations.create_organization(user=None, org_name='test_org', *args, **kwargs)
+

Helper script to create a user/org relationship from scratch. This is heavily used and +creates the default labels, columns, and data quality rules when a new organization is created

+
+
Parameters:
+
    +
  • user – user inst.

  • +
  • org_name – str, name of Organization we’d like to create.

  • +
  • kwargs ((optional)) – ‘role’, int; ‘status’, str.

  • +
+
+
+
+ +
+
+seed.utils.organizations.create_suborganization(user, current_org, suborg_name='', user_role=10)
+
+ +
+
+seed.utils.organizations.default_pm_mappings()
+
+ +
+
+

Time

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.utils.time.convert_datestr(datestr, make_tz_aware=False)
+

Converts dates like 12/31/2010 into datetime objects. Dates are returned in UTC time

+

TODO: reconcile this with seed/lib/mcm/cleaners.py#L85-L85

+
+
Parameters:
+
    +
  • datestr – string, value to convert

  • +
  • make_tz_aware – bool, if set to true, then will convert the timezone into UTC time

  • +
+
+
Returns:
+

datetime or None

+
+
+
+ +
+
+seed.utils.time.convert_to_js_timestamp(timestamp)
+

converts a django/python datetime object to milliseconds since epoch

+
+ +
+
+seed.utils.time.parse_datetime(maybe_datetime)
+

Process a datetime value that may be None, timestamp, strftime.

+
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/modules/seed.views.html b/docs/code_documentation/3.0.0/modules/seed.views.html new file mode 100644 index 00000000..bdafb204 --- /dev/null +++ b/docs/code_documentation/3.0.0/modules/seed.views.html @@ -0,0 +1,228 @@ + + + + + + + Views Package — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Views Package

+
+

Submodules

+
+
+

Accounts

+
+
+

APIs

+
+
+

Main

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.views.main.angular_js_tests(request)
+

Jasmine JS unit test code covering AngularJS unit tests

+
+ +
+
+seed.views.main.celery_queue(self, request, *args, **kwargs)
+

Returns the number of running and queued celery tasks. This action can only be performed by superusers

+

Returns:

+
{
+    'active': {'total': n, 'tasks': []}, // Tasks that are currently being executed
+    'reserved': {'total': n, 'tasks': []}, // Tasks waiting to be executed
+    'scheduled': {'total': n, 'tasks': []}, // Tasks reserved by the worker when they have an eta or countdown
+    'maxConcurrency': The maximum number of active tasks
+}
+
+
+
+ +
+
+seed.views.main.error404(request, exception)
+
+ +
+
+seed.views.main.error410(request)
+
+ +
+
+seed.views.main.error500(request)
+
+ +
+
+seed.views.main.health_check(request)
+

Perform a health check without requiring authentication

+
+ +
+
+seed.views.main.home(request)
+

the main view for the app +Sets in the context for the django template:

+
+ +
+
+seed.views.main.version(self, request, *args, **kwargs)
+

Returns the SEED version and current git sha

+
+ +
+
+

Meters

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/objects.inv b/docs/code_documentation/3.0.0/objects.inv new file mode 100644 index 00000000..224bdc08 Binary files /dev/null and b/docs/code_documentation/3.0.0/objects.inv differ diff --git a/docs/code_documentation/3.0.0/postgres_upgrade.html b/docs/code_documentation/3.0.0/postgres_upgrade.html new file mode 100644 index 00000000..a9a2bdfd --- /dev/null +++ b/docs/code_documentation/3.0.0/postgres_upgrade.html @@ -0,0 +1,162 @@ + + + + + + + Upgrade a SEED database from Postgres 12 to Postgres 16 — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Upgrade a SEED database from Postgres 12 to Postgres 16

+
+

Assumptions

+
    +
  • This process assumes that you’re currently using Postgres 12.7 with TimescaleDB 2.3.0 from timescale/timescaledb-postgis:2.3.0-pg12 or timescale/timescaledb-postgis:latest-pg12

  • +
  • This also assumes that you have a directory in the host filesystem, e.g. ~/share, that is bind mounted to /share in your existing database container

  • +
+
    +
  1. Create a dump of the current database

  2. +
+
docker exec seed_postgres pg_dump -d seed -U seeduser -Fc -f /share/seed-pg12.dump
+
+
+
    +
  1. Create a temporary Postgres 13 container using the Docker image timescale/timescaledb-ha:pg13.14-ts2.14.2-oss

  2. +
+
docker run --rm --name=seed-pg13 -e POSTGRES_DB=seed -e POSTGRES_USER=seeduser -e POSTGRES_PASSWORD=password -v ~/share:/share timescale/timescaledb-ha:pg13.14-ts2.14.2-oss
+
+
+

Once the container has finished initializing, open a separate shell

+
docker exec -it seed-pg13 bash
+psql -d seed -U seeduser -c "CREATE EXTENSION postgis;"
+psql -d seed -U seeduser -c "DROP EXTENSION timescaledb;"
+psql -d seed -U seeduser -c "CREATE EXTENSION timescaledb WITH VERSION '2.3.0';"
+psql -d seed -U seeduser -c "SELECT timescaledb_pre_restore();"
+pg_restore -d seed -U seeduser /share/seed-pg12.dump
+psql -d seed -U seeduser -c "SELECT timescaledb_post_restore();"
+psql -d seed -U seeduser -c "ALTER EXTENSION timescaledb UPDATE;"
+pg_dump -d seed -U seeduser -Fc -f /share/seed-pg13.dump
+
+
+
    +
  1. Start the new, permanent Postgres 16 container using the Docker image timescale/timescaledb-ha:pg16.2-ts2.14.2-oss

  2. +
+
docker run -d --name=seed-pg16 -e POSTGRES_DB=seed -e POSTGRES_USER=seeduser -e POSTGRES_PASSWORD=password -v ~/share:/share timescale/timescaledb-ha:pg16.2-ts2.14.2-oss
+
+
+

Once the container has finished initializing, open a separate shell

+
docker exec -it seed-pg16 bash
+psql -d seed -U seeduser -c "CREATE EXTENSION postgis;"
+psql -d seed -U seeduser -c "SELECT timescaledb_pre_restore();"
+pg_restore -d seed -U seeduser /share/seed-pg13.dump
+psql -d seed -U seeduser -c "SELECT timescaledb_post_restore();"
+pg_dump -d seed -U seeduser -Fc -f /share/seed-pg16.dump
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/py-modindex.html b/docs/code_documentation/3.0.0/py-modindex.html new file mode 100644 index 00000000..5865882f --- /dev/null +++ b/docs/code_documentation/3.0.0/py-modindex.html @@ -0,0 +1,408 @@ + + + + + + Python Module Index — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ c | + s +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ c
+ config +
    + config.template_context +
    + config.tests +
    + config.utils +
    + config.views +
    + config.wsgi +
 
+ s
+ seed +
    + seed.data_importer +
    + seed.data_importer.managers +
    + seed.data_importer.utils +
    + seed.decorators +
    + seed.landing +
    + seed.landing.forms +
    + seed.landing.management +
    + seed.landing.management.commands +
    + seed.landing.models +
    + seed.landing.tests +
    + seed.landing.urls +
    + seed.landing.views +
    + seed.lib +
    + seed.lib.mappings +
    + seed.lib.mappings.mapper +
    + seed.lib.mappings.mapping_columns +
    + seed.lib.merging +
    + seed.lib.merging.merging +
    + seed.management +
    + seed.models +
    + seed.models.auditlog +
    + seed.models.columns +
    + seed.models.cycles +
    + seed.models.data_quality +
    + seed.models.models +
    + seed.models.properties +
    + seed.models.tax_lots +
    + seed.public +
    + seed.search +
    + seed.serializers +
    + seed.serializers.celery +
    + seed.serializers.labels +
    + seed.tasks +
    + seed.templatetags.breadcrumbs +
    + seed.test_helpers +
    + seed.test_helpers.factory.helpers +
    + seed.tests.test_admin_views +
    + seed.tests.test_decorators +
    + seed.tests.test_tasks +
    + seed.tests.test_views +
    + seed.tests.util +
    + seed.token_generators +
    + seed.utils +
    + seed.utils.api +
    + seed.utils.buildings +
    + seed.utils.organizations +
    + seed.utils.time +
    + seed.views +
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/search.html b/docs/code_documentation/3.0.0/search.html new file mode 100644 index 00000000..761a6877 --- /dev/null +++ b/docs/code_documentation/3.0.0/search.html @@ -0,0 +1,133 @@ + + + + + + Search — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/searchindex.js b/docs/code_documentation/3.0.0/searchindex.js new file mode 100644 index 00000000..a6576d50 --- /dev/null +++ b/docs/code_documentation/3.0.0/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "aws", "data_model", "data_quality", "deployment", "developer_resources", "docker", "faq", "getting_started", "help", "index", "kubernetes_deployment", "license", "linux", "mapping", "matching", "migrations", "modules", "modules/config", "modules/seed", "modules/seed.cleansing", "modules/seed.data", "modules/seed.data_importer", "modules/seed.features", "modules/seed.landing", "modules/seed.landing.management", "modules/seed.landing.management.commands", "modules/seed.lib", "modules/seed.lib.mappings", "modules/seed.lib.merging", "modules/seed.management", "modules/seed.managers", "modules/seed.managers.tests", "modules/seed.mappings", "modules/seed.models", "modules/seed.public", "modules/seed.serializers", "modules/seed.templatetags", "modules/seed.test_helpers", "modules/seed.test_helpers.factory", "modules/seed.test_helpers.factory.lib", "modules/seed.tests", "modules/seed.tests.functional", "modules/seed.urls", "modules/seed.utils", "modules/seed.views", "postgres_upgrade", "setup_docker", "setup_osx", "translation"], "filenames": ["api.rst", "aws.rst", "data_model.rst", "data_quality.rst", "deployment.rst", "developer_resources.rst", "docker.rst", "faq.rst", "getting_started.rst", "help.rst", "index.rst", "kubernetes_deployment.rst", "license.rst", "linux.rst", "mapping.rst", "matching.rst", "migrations.rst", "modules.rst", "modules/config.rst", "modules/seed.rst", "modules/seed.cleansing.rst", "modules/seed.data.rst", "modules/seed.data_importer.rst", "modules/seed.features.rst", "modules/seed.landing.rst", "modules/seed.landing.management.rst", "modules/seed.landing.management.commands.rst", "modules/seed.lib.rst", "modules/seed.lib.mappings.rst", "modules/seed.lib.merging.rst", "modules/seed.management.rst", "modules/seed.managers.rst", "modules/seed.managers.tests.rst", "modules/seed.mappings.rst", "modules/seed.models.rst", "modules/seed.public.rst", "modules/seed.serializers.rst", "modules/seed.templatetags.rst", "modules/seed.test_helpers.rst", "modules/seed.test_helpers.factory.rst", "modules/seed.test_helpers.factory.lib.rst", "modules/seed.tests.rst", "modules/seed.tests.functional.rst", "modules/seed.urls.rst", "modules/seed.utils.rst", "modules/seed.views.rst", "postgres_upgrade.rst", "setup_docker.rst", "setup_osx.rst", "translation.rst"], "titles": ["API", "AWS Setup", "Data Model", "Data Quality", "Deployment Guide", "Developer Resources", "Docker Deployment on AWS", "Frequently Asked Questions", "Getting Started", "Help", "Standard Energy Efficiency Data (SEED) Platform", "Kubernetes Deployment Guide with Helm", "License", "General Linux Setup", "Mapping", "Matching", "Migrations", "Modules", "Configuration", "SEED Package", "Data Quality Package", "Data Package", "Data Importer Package", "Features Package", "Landing Package", "seed.landing.management package", "Landing Management Package", "Library Packages", "seed.lib.mappings package", "seed.lib.merging package", "Management Package", "Managers Package", "Manager Tests Package", "Mapping Package", "Models", "Public Package", "Serializers Package", "Templatetags Package", "Test Helpers Package", "Test Helper Factor Package", "Test Helper Factory Lib Package", "Tests Package", "Tests (Functional) Package", "URLs Package", "Utilities Package", "Views Package", "Upgrade a SEED database from Postgres 12 to Postgres 16", "Installation using Docker", "Installation on OSX", "Translating SEED"], "terms": {"i": [0, 1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 16, 19, 20, 22, 24, 28, 34, 37, 41, 44, 46, 47, 48, 49], "handl": [0, 2, 4, 5, 16, 28, 41], "via": [0, 5, 15, 18, 20, 24, 34, 44], "an": [0, 1, 2, 3, 5, 6, 7, 10, 11, 13, 14, 15, 16, 18, 19, 24, 34, 41, 44, 45, 47, 48, 49], "encod": 0, "author": [0, 19, 24, 28, 29, 37], "token": [0, 11, 17, 24, 37, 49], "set": [0, 1, 2, 4, 6, 10, 11, 13, 14, 15, 16, 18, 19, 20, 24, 28, 29, 34, 41, 44, 45, 47, 48], "http": [0, 4, 5, 6, 9, 11, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "header": [0, 5, 14, 19, 24, 41, 49], "To": [0, 1, 2, 3, 4, 5, 11, 47, 48], "request": [0, 2, 9, 11, 13, 14, 18, 19, 24, 34, 41, 44, 45], "go": [0, 5, 34, 47], "app": [0, 1, 5, 7, 10, 11, 13, 22, 45, 48], "profil": [0, 1, 5, 6, 13, 14, 44, 48], "develop": [0, 4, 7, 10, 18, 48], "click": [0, 2, 3], "get": [0, 1, 2, 5, 6, 10, 11, 13, 15, 19, 20, 28, 34, 41, 44, 48, 49], "new": [0, 2, 11, 15, 16, 19, 20, 22, 29, 34, 41, 44, 46, 48, 49], "kei": [0, 2, 4, 5, 6, 8, 11, 16, 19, 20, 24, 28, 29, 34, 41, 44, 49], "everi": [0, 1, 2, 5, 13, 34], "your": [0, 1, 4, 5, 6, 7, 11, 13, 16, 46, 47, 48], "usernam": [0, 1, 5, 11, 13, 24, 41, 47, 48], "email": [0, 5, 6, 7, 11, 13, 19, 24, 34, 41], "all": [0, 2, 5, 7, 11, 12, 13, 15, 16, 19, 20, 22, 24, 34, 37, 44, 48, 49], "lowercas": [0, 14, 41], "basic": [0, 49], "auth": [0, 4, 24], "The": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 19, 20, 28, 34, 44, 45, 47, 48, 49], "sent": [0, 7], "form": [0, 2, 12, 17, 34, 41, 44], "credenti": [0, 11], "where": [0, 2, 3, 5, 9, 15, 20, 22, 44, 48, 49], "base64": 0, "join": [0, 9, 17], "singl": [0, 16, 19, 34, 48], "colon": 0, "us": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19, 20, 22, 28, 34, 41, 44, 46, 48, 49], "python": [0, 4, 7, 8, 9, 10, 19, 34, 44], "librari": [0, 7, 10, 17], "import": [0, 3, 4, 5, 7, 10, 15, 16, 17, 20, 28, 34, 41, 47], "result": [0, 2, 5, 15, 16, 20, 28, 34, 44], "seed": [0, 1, 4, 5, 6, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 27, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "platform": [0, 1, 4, 5, 6, 11, 12, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "org": [0, 5, 6, 7, 9, 11, 13, 16, 19, 22, 24, 37, 41, 44, 47, 48], "version": [0, 4, 5, 6, 7, 11, 28, 34, 45, 46, 47, 48], "user_email": 0, "api_kei": [0, 24, 48], "print": [0, 5], "json": [0, 1, 2, 5, 11, 13, 14, 17, 19, 28, 49], "curl": [0, 1, 6, 13], "pass": [0, 5, 6, 13, 19, 34, 36, 47], "follow": [0, 1, 2, 4, 5, 6, 11, 12, 13, 15, 16, 34, 47, 48], "u": [0, 5, 6, 7, 10, 11, 12, 13, 22, 34, 46], "If": [0, 1, 2, 4, 5, 6, 7, 11, 15, 16, 19, 20, 28, 34, 44, 47, 48, 49], "fail": [0, 5, 6, 16, 41, 47], "": [0, 1, 2, 5, 6, 7, 9, 10, 12, 13, 15, 18, 19, 20, 22, 24, 34, 41, 47, 48, 49], "statu": [0, 19, 41, 44], "code": [0, 5, 9, 11, 12, 16, 19, 34, 45, 47, 48], "302": 0, "redirect": 0, "user": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 15, 16, 19, 24, 34, 41, 44, 47, 49], "login": [0, 5, 8, 11, 13, 24, 41, 47], "mani": [0, 2, 13, 20, 24, 34, 49], "requir": [0, 1, 5, 6, 7, 10, 11, 12, 13, 16, 20, 24, 45, 48, 49], "paramet": [0, 16, 19, 20, 24, 28, 29, 34, 37, 44, 47], "queri": [0, 5, 16, 19, 20, 24, 34, 44], "string": [0, 16, 19, 20, 22, 24, 28, 34, 37, 44, 49], "url": [0, 5, 10, 11, 13, 16, 17, 19, 37, 44], "A": [0, 1, 5, 12, 13, 14, 15, 20, 24, 34, 41, 48], "frequent": [0, 10], "includ": [0, 1, 5, 12, 13, 15, 16, 20, 22, 29, 34, 47], "organization_id": [0, 2, 5, 16, 19, 20, 34, 36, 44], "you": [0, 1, 4, 5, 7, 9, 11, 13, 16, 18, 34, 36, 44, 46, 47, 48, 49], "belong": [0, 2, 44], "For": [0, 1, 2, 5, 6, 10, 11, 15, 18, 34, 36, 41, 44, 47, 48], "exampl": [0, 1, 2, 5, 6, 9, 15, 16, 18, 19, 20, 24, 28, 34, 36, 37, 44, 47, 48, 49], "v2": [0, 11], "organ": [0, 1, 5, 7, 9, 10, 11, 13, 15, 16, 17, 19, 20, 22, 34, 48], "12": [0, 2, 5, 44, 49], "Or": [0, 15], "d": [0, 5, 6, 44, 46, 48], "6": [0, 5, 34], "role": [0, 2, 44, 48], "viewer": 0, "update_rol": 0, "param": [0, 19, 20, 34, 44], "post": [0, 19, 41, 48], "data": [0, 1, 4, 5, 7, 9, 11, 12, 13, 14, 15, 16, 17, 24, 28, 29, 34, 41, 44, 49], "dump": [0, 10, 46, 48], "from": [0, 1, 2, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 19, 20, 24, 28, 29, 34, 41, 44, 47, 48, 49], "object": [0, 5, 7, 14, 16, 19, 20, 22, 24, 28, 34, 36, 37, 39, 41, 44], "specifi": [0, 5, 14, 15, 20, 44, 47], "each": [0, 2, 5, 11, 15, 16, 22, 29, 41, 44], "document": [0, 1, 2, 6, 9, 10, 12, 13, 14, 16], "In": [0, 1, 2, 5, 13, 16, 20, 22, 24, 34, 44, 47, 48], "case": [0, 2, 3, 5, 15, 16, 28, 34, 41, 44, 48], "error": [0, 4, 5, 16, 19, 20, 44, 47], "most": [0, 2, 3, 5, 6, 15, 20, 24, 34], "return": [0, 2, 5, 16, 19, 20, 22, 24, 28, 29, 34, 36, 37, 44, 45], "thi": [0, 1, 2, 3, 4, 5, 6, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 22, 24, 28, 29, 34, 36, 41, 44, 45, 46, 47, 48, 49], "instead": [0, 2, 5, 34, 37, 48], "expect": [0, 5, 13, 16, 22, 41], "messag": [0, 4, 5, 24, 48], "explan": 0, "here": [0, 2, 5, 7, 11, 13, 15, 18, 22, 47], "list": [0, 2, 5, 6, 9, 11, 12, 15, 19, 20, 28, 29, 34, 36, 44], "interact": 0, "ar": [0, 1, 2, 3, 4, 5, 7, 11, 12, 13, 14, 15, 16, 19, 20, 22, 24, 28, 34, 44, 45, 47, 48, 49], "avail": [0, 1, 7, 9, 10, 13, 28, 49], "access": [0, 1, 5, 7, 10, 11, 13, 15, 41, 48], "menu": 0, "item": [0, 5, 11, 16, 28], "left": [0, 29], "navig": [0, 34, 48], "pane": 0, "within": [0, 1, 5, 13, 15, 19, 48], "account": [0, 4, 11, 15, 17, 22, 41, 44], "instanc": [0, 1, 2, 4, 6, 13, 15, 19, 20, 22, 24, 29, 34, 36, 44, 48], "view": [0, 10, 11, 14, 15, 17, 34, 44], "non": [0, 2, 8, 13, 34], "without": [0, 12, 15, 16, 41, 45], "swagger": 0, "server": [0, 1, 4, 5, 6, 8, 11, 14, 18], "provid": [1, 5, 6, 7, 10, 12, 13, 19, 22, 41, 44, 48, 49], "prefer": [1, 2, 6, 13, 16, 20, 22], "host": [1, 6, 7, 13, 16, 46, 48], "django": [1, 2, 4, 6, 7, 8, 10, 11, 16, 18, 19, 20, 24, 34, 37, 44, 45, 47, 49], "project": [1, 4, 5, 6, 13, 18, 19], "excel": [1, 6, 13], "place": [1, 6, 13, 34, 44, 49], "gener": [1, 4, 6, 9, 10, 11, 17, 44, 48], "understand": [1, 6, 13], "layout": [1, 6, 13, 49], "ubuntu": [1, 5, 6, 8, 13], "18": [1, 5, 6, 13], "04": [1, 6, 13], "lt": 1, "These": [1, 2, 11, 14, 15, 34, 48], "instruct": [1, 8, 10, 11, 13, 47], "have": [1, 2, 3, 4, 5, 6, 7, 11, 13, 15, 16, 18, 19, 22, 34, 41, 45, 46, 47, 48, 49], "been": [1, 2, 5, 15, 19, 20, 34, 48], "updat": [1, 2, 5, 6, 7, 13, 15, 16, 24, 25, 29, 34, 44, 46, 48, 49], "It": [1, 2, 6, 9, 11, 18, 34, 44, 47, 49], "recommend": [1, 4, 5, 9, 13, 48], "docker": [1, 4, 5, 8, 10, 11, 13, 46], "base": [1, 2, 5, 7, 10, 13, 19, 20, 22, 24, 28, 29, 34, 36, 37, 39, 41, 44, 47, 48, 49], "deploy": [1, 5, 10, 15, 18], "sudo": [1, 6, 13, 16, 48], "apt": [1, 6, 13, 16], "upgrad": [1, 6, 13, 16, 48], "instal": [1, 4, 5, 8, 11, 13, 16, 19, 49], "y": [1, 6], "libpq": [1, 13], "dev": [1, 11, 13, 47, 48], "pip": [1, 13, 16, 48], "libatla": [1, 13], "gfortran": [1, 13], "build": [1, 2, 7, 8, 9, 10, 13, 15, 17, 19, 20, 34, 41, 48], "essenti": [1, 13], "g": [1, 2, 4, 5, 9, 11, 13, 16, 34, 44, 46, 48, 49], "npm": [1, 5, 8, 13, 16], "libxml2": [1, 13], "libxslt1": [1, 13], "git": [1, 6, 13, 45, 48], "mercuri": [1, 13], "libssl": [1, 13], "libffi": [1, 13], "uwsgi": [1, 13, 48], "core": [1, 13, 16, 19], "plugin": [1, 13], "postgresql": [1, 2, 4, 7, 8, 10, 16], "redi": [1, 8, 13, 16, 20], "abov": [1, 2, 5, 6, 12, 13, 15, 20, 44], "command": [1, 5, 6, 11, 13, 16, 18, 34, 47, 48], "quick": [1, 8, 11, 13], "okai": [1, 6], "local": [1, 4, 5, 6, 13, 16, 48, 49], "more": [1, 2, 4, 5, 11, 13, 15, 16, 41, 49], "perman": [1, 46], "scalabl": 1, "solut": 1, "elasticach": [1, 13], "9": [1, 2, 5, 11, 13], "4": [1, 2, 5, 6, 12, 13, 15, 20, 34, 48], "support": [1, 4, 13, 16, 19, 36], "type": [1, 2, 11, 13, 20, 22, 29, 34, 44], "contrib": [1, 4, 5, 7, 13, 16, 24, 48], "can": [1, 2, 3, 4, 5, 7, 9, 10, 11, 13, 14, 15, 16, 19, 22, 28, 34, 44, 45, 47, 48, 49], "rd": [1, 13], "se": [1, 6], "clone": [1, 6, 13, 48], "repositori": [1, 5, 6, 9, 13, 16, 48], "github": [1, 5, 6, 9, 11, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "com": [1, 5, 6, 9, 11, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "enter": [1, 2, 11, 13], "repo": [1, 11, 13], "cd": [1, 5, 6, 13, 48], "r": [1, 5, 13, 16, 48], "txt": [1, 13, 16, 48], "j": [1, 5, 45, 48, 49], "copi": [1, 5, 13, 16, 19, 34, 48, 49], "local_untrack": [1, 4, 5, 7, 16, 47, 48], "py": [1, 4, 5, 7, 11, 16, 19, 24, 37, 44, 47, 48], "dist": [1, 13, 44, 48], "file": [1, 2, 4, 5, 6, 7, 11, 13, 14, 16, 20, 24, 28, 34, 47, 48, 49], "config": [1, 5, 11, 13, 16, 18, 47, 48], "directori": [1, 5, 6, 11, 13, 16, 46, 47, 48], "add": [1, 4, 5, 6, 13, 14, 16, 20, 28, 44, 47, 48, 49], "password": [1, 5, 11, 13, 16, 19, 24, 41, 46, 47, 48], "port": [1, 13, 16, 47, 48], "point": [1, 2, 5, 13, 14, 15, 22, 34, 47, 48], "manual": [1, 5, 10, 13, 14, 15, 16, 48, 49], "infrastructur": [1, 13], "default": [1, 2, 3, 5, 6, 11, 13, 16, 19, 20, 34, 36, 44, 47, 48], "engin": [1, 6, 13, 16, 48], "db": [1, 5, 6, 11, 13, 16, 20, 24, 34, 48], "backend": [1, 4, 13, 16, 34, 48], "postgresql_psycopg2": [1, 13], "name": [1, 2, 5, 6, 7, 11, 12, 13, 16, 18, 19, 20, 24, 28, 29, 34, 36, 37, 41, 44, 46, 47, 48], "arbitrari": [1, 2, 13, 36], "ani": [1, 2, 3, 4, 5, 6, 12, 13, 14, 15, 16, 18, 20, 22, 28, 29, 34, 41, 47, 48, 49], "valid": [1, 6, 7, 10, 13, 19, 20, 24, 34, 39, 44], "long": [1, 2, 13, 16, 28], "exist": [1, 2, 4, 5, 6, 10, 13, 16, 19, 20, 28, 29, 34, 41, 46, 47, 48], "creat": [1, 2, 4, 5, 6, 11, 14, 15, 16, 19, 20, 22, 24, 28, 34, 41, 44, 46, 47, 48, 49], "postgr": [1, 2, 5, 6, 11, 13, 16, 47, 48], "psql": [1, 5, 13, 46, 48], "shell": [1, 5, 7, 16, 46, 47, 48], "line": [1, 2, 5, 11, 16, 34, 48, 49], "createdb": [1, 13, 48], "tabl": [1, 5, 13, 16, 28, 34, 48], "migrat": [1, 8, 10, 13, 20], "manag": [1, 4, 7, 10, 13, 14, 16, 17, 19, 20, 24, 28, 34, 47, 48, 49], "syncdb": 1, "superus": [1, 5, 13, 41, 45, 48], "system": [1, 2, 5, 11, 13, 15, 48], "create_default_us": [1, 5, 11, 13, 48], "demo": [1, 5, 41, 48], "demo123": [1, 48], "must": [1, 5, 11, 12, 13, 14, 15, 16, 34, 44, 47, 48], "ti": [1, 13, 34], "visit": [1, 9, 13, 48], "admin": [1, 6, 8, 11, 13, 17, 19, 24], "parent": [1, 10, 13, 19, 20, 24, 29, 34, 44], "them": [1, 5, 13, 16, 41, 49], "reli": [1, 13], "both": [1, 2, 5, 7, 10, 13, 15, 19, 20, 34, 48], "should": [1, 2, 5, 11, 13, 15, 16, 18, 22, 34, 41, 47, 48, 49], "celery_broker_url": [1, 13, 16, 48], "ntmprk": 1, "0001": 1, "usw2": 1, "amazonaw": [1, 6, 11], "6379": [1, 13, 16, 48], "1": [1, 2, 4, 5, 6, 8, 11, 12, 13, 15, 20, 22, 34, 41, 44, 47], "django_redi": [1, 13, 16, 48], "rediscach": [1, 13, 16, 48], "locat": [1, 5, 13, 16, 20, 48], "save": [1, 5, 7, 10, 13, 14, 20, 22, 24, 29, 34, 48], "match": [1, 5, 10, 11, 13, 16, 19, 20, 22, 28, 44], "qualiti": [1, 7, 10, 13, 17, 44], "check": [1, 3, 13, 16, 19, 20, 28, 34, 41, 44, 45, 49], "etc": [1, 2, 5, 6, 13, 14, 15, 19, 47, 49], "connect": [1, 9, 11, 13, 15, 16, 47], "queue": [1, 13, 16], "start": [1, 2, 5, 10, 11, 13, 34, 39, 44, 46, 47], "l": [1, 6, 13, 48], "info": [1, 5, 11, 13, 34, 48], "c": [1, 5, 6, 12, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 48], "2": [1, 2, 5, 6, 8, 11, 12, 13, 15, 20, 34, 46, 49], "max": [1, 5, 11, 13, 20, 48], "per": [1, 13, 15, 19, 20, 48, 49], "child": [1, 2, 13, 20, 24, 34, 41, 48], "1000": [1, 13, 20, 48], "eb": [1, 13, 48], "django_celery_beat": [1, 5, 13, 48], "schedul": [1, 13, 19, 45, 48], "databaseschedul": [1, 13, 48], "below": [2, 5, 6, 11, 16, 20, 22, 24, 28, 34, 41, 47, 48, 49], "out": [2, 5, 6, 7, 9, 12, 13, 20, 48, 49], "state": [2, 5, 12, 29, 34], "need": [2, 5, 7, 9, 11, 13, 14, 15, 16, 19, 22, 34, 41, 44, 47, 48, 49], "our": [2, 9, 13, 29, 41], "primari": [2, 19, 20], "tree": [2, 44, 49], "structur": [2, 20, 28], "node": [2, 11, 37, 48], "tip": 2, "referenc": [2, 44], "take": [2, 11, 16, 28, 34, 37, 44], "ha": [2, 5, 13, 14, 15, 19, 20, 34, 46, 47], "load": [2, 13, 20, 24, 34], "csv": [2, 28], "contain": [2, 6, 8, 9, 11, 12, 16, 18, 34, 41, 46, 49], "inform": [2, 4, 5, 7, 9, 10, 11, 14, 34], "about": [2, 5, 34], "one": [2, 3, 4, 5, 7, 11, 15, 16, 18, 20, 24, 28, 34, 44, 49], "first": [2, 5, 6, 11, 15, 16, 19, 20, 24, 28, 34, 37, 44, 47, 48], "bs0": 2, "At": [2, 4, 14, 15, 48, 49], "time": [2, 5, 6, 15, 16, 17, 20, 24, 34, 41, 47, 48, 49], "link": [2, 11, 16, 34, 37], "cb0": 2, "also": [2, 5, 9, 11, 12, 13, 15, 16, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 47, 48], "relat": [2, 5, 16, 20, 24, 34, 41], "repres": [2, 5, 15, 19, 44], "databas": [2, 4, 6, 7, 8, 10, 14, 16, 20, 22, 29, 34, 47], "foreign": [2, 16, 44], "come": [2, 11, 20, 44], "fruition": 2, "sai": [2, 15], "bs1": 2, "wa": [2, 5, 15, 20, 22, 28, 34, 41, 44], "occur": [2, 5, 14, 15, 16], "bs2": 2, "merg": [2, 5, 10, 14, 16, 17, 34], "togeth": [2, 34], "given": [2, 3, 5, 15, 19, 22, 28, 34, 44], "record": [2, 3, 5, 14, 15, 19, 34], "b3": 2, "snapshot": [2, 15], "becaus": [2, 16, 19, 20, 49], "newer": [2, 5, 6, 13], "two": [2, 4, 5, 11, 15, 16, 22, 28, 34], "perspect": 2, "By": [2, 13, 34, 44, 48], "recent": [2, 15, 34], "allow": [2, 15, 18, 41, 44], "evolv": 2, "over": [2, 15, 34, 48, 49], "canon": [2, 29, 34, 49], "site": [2, 5, 7, 11, 34], "eui": [2, 16, 20, 34], "valu": [2, 4, 11, 13, 15, 20, 22, 24, 28, 34, 44, 47, 48, 49], "75": 2, "some": [2, 5, 7, 11, 15, 16, 34, 47, 48, 49], "chang": [2, 5, 15, 16, 34, 47, 48, 49], "caus": [2, 12, 16, 49], "80": [2, 11, 13], "submit": [2, 5, 9], "linkag": 2, "other": [2, 4, 5, 7, 9, 10, 12, 13, 15, 16, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 48, 49], "order": [2, 5, 11, 14, 15, 16, 44, 47, 49], "keep": [2, 16], "track": [2, 49], "addit": [2, 5, 14, 15, 16], "seed_buildingsnapshot_children": 2, "would": [2, 13, 15, 19, 28], "throughout": [2, 34], "applic": [2, 5, 7, 9, 10, 11, 15, 18], "search_build": 2, "endpoint": [2, 5, 10, 28, 41, 44], "search": [2, 10, 17], "activ": [2, 7, 10, 17, 24, 45, 48], "search_mapping_result": 2, "regardless": [2, 34], "whether": [2, 3, 12, 14, 19, 28, 41], "dure": [2, 3, 5, 15, 19], "map": [2, 5, 10, 16, 17, 19, 22, 29, 34, 41, 49], "preview": [2, 15], "section": [2, 7, 11, 37, 48], "illustr": 2, "purpos": [2, 5, 12, 34], "let": [2, 36], "suppos": 2, "bs3": 2, "bs4": 2, "And": 2, "correspond": [2, 14, 44], "look": [2, 6, 11, 16, 44, 48, 49], "like": [2, 5, 6, 11, 16, 36, 44, 47, 48, 49], "process": [2, 5, 14, 15, 19, 24, 28, 34, 41, 44, 46, 48, 49], "raw": [2, 28, 34], "b0": 2, "c0": 2, "id1": 2, "11": [2, 5, 8], "id2": 2, "id3": 2, "13": [2, 5, 46], "id4": 2, "14": [2, 5, 46], "15": [2, 5], "sinc": [2, 5, 13, 15, 16, 34, 44, 48], "choos": [2, 15, 47, 49], "move": [2, 5, 13, 34], "onli": [2, 6, 15, 19, 20, 34, 41, 44, 45, 48], "deactiv": 2, "secondari": 2, "true": [2, 4, 5, 13, 19, 20, 22, 24, 28, 34, 36, 39, 44], "bs5": 2, "cb1": 2, "decid": [2, 13, 14, 28], "fals": [2, 5, 13, 18, 19, 20, 24, 28, 29, 34, 36, 44], "after": [2, 3, 4, 5, 6, 11, 15, 16, 19, 34, 41, 47], "bs6": 2, "even": [2, 12, 15, 22, 48], "though": [2, 15, 22, 48], "normal": [2, 5, 15, 16, 22, 28, 34, 48], "its": [2, 11, 12, 15], "anytim": 2, "unmatch": 2, "leaf": 2, "conceptu": 2, "sometim": 2, "devil": 2, "detail": [2, 6, 15], "ad": [2, 15, 20, 22, 28, 41], "least": [2, 15, 49], "consid": [2, 15], "simpl": [2, 6, 11, 13, 15, 20, 34, 37, 41], "properti": [2, 3, 5, 6, 15, 16, 17, 19, 20, 22, 24, 28, 44], "id": [2, 5, 11, 16, 19, 20, 22, 24, 34, 36, 37, 41, 44, 48], "year": [2, 15, 20, 34, 41], "end": [2, 7, 10, 14, 34, 39], "floor": [2, 34], "area": [2, 20, 34], "address": [2, 5, 13, 16, 19, 20, 34, 41], "releas": [2, 6, 10, 11, 16, 34, 41], "date": [2, 20, 34, 44], "499045": 2, "2000": 2, "1234": [2, 5], "fake": [2, 16], "st": 2, "thing": [2, 44, 48], "upload": [2, 7, 10, 14], "see": [2, 4, 5, 7, 11, 13, 16, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 49], "success": [2, 11, 19, 41, 44], "dialog": 2, "73700": 2, "modifi": [2, 11, 16, 34], "timestamp": [2, 44], "Then": [2, 15, 48], "lot": [2, 15, 20, 34], "empti": [2, 5, 11, 34], "source_typ": [2, 34, 41, 44], "0": [2, 4, 5, 7, 8, 13, 20, 28, 34, 39, 41, 44, 46, 47], "column": [2, 10, 14, 16, 17, 28, 29, 44], "which": [2, 5, 11, 13, 15, 16, 22, 28, 34, 44, 47, 48, 49], "content": [2, 6, 17, 41], "extra_data_sourc": 2, "popul": [2, 5], "e": [2, 4, 5, 11, 13, 16, 28, 34, 37, 44, 46, 47, 48, 49], "owner_postal_code_source_id": 2, "interest": [2, 34], "import_file_id": [2, 34], "refer": [2, 15, 16, 34], "data_importer_importfil": 2, "befor": [2, 6, 11, 15, 16, 20, 24, 41, 44, 47, 48], "hit": [2, 11], "continu": 2, "button": [2, 3, 49], "second": [2, 37], "73701": 2, "screen": [2, 16], "pm_property_id": [2, 20, 34], "year_end": [2, 20, 34], "gross_floor_area": [2, 20, 34], "address_line_1": [2, 20, 34], "release_d": [2, 20, 34], "That": [2, 15], "now": [2, 11, 19, 28, 48, 49], "same": [2, 5, 7, 10, 11, 15, 16, 28, 34, 37, 41, 44, 48], "next": [2, 15, 28], "2001": 2, "As": [2, 15, 49], "73702": 2, "pattern": [2, 44], "similarli": 2, "73703": 2, "appear": [2, 5, 44, 47], "howev": [2, 4, 5, 12, 16, 20, 44], "abl": [2, 11, 41], "make": [2, 5, 6, 7, 11, 15, 16, 18, 34, 41, 47, 48, 49], "confirm": [2, 41], "73704": 2, "ident": 2, "term": 2, "except": [2, 20, 24, 34, 36, 41, 45], "differ": [2, 5, 9, 11, 13, 15, 20, 22, 28, 29, 41, 47, 48, 49], "confid": [2, 5, 28, 34, 41], "canonical_building_id": 2, "null": 2, "last_modified_by_id": 2, "landing_seedus": [2, 48], "address_line_1_source_id": 2, "gross_floor_area_source_id": 2, "pm_property_id_source_id": 2, "release_date_source_id": 2, "year_ending_source_id": 2, "summar": 2, "5": [2, 5, 8, 12, 20, 34], "were": [2, 5, 15, 16, 22, 34], "twice": [2, 15], "row": [2, 3, 16, 20], "step": [2, 5, 11, 13, 15, 16, 48, 49], "20505": 2, "There": [2, 5, 11, 16, 49], "still": [2, 5, 48], "orgs_organ": 2, "filter": [2, 5, 19, 44], "get_build": 2, "membership": 2, "sourc": [2, 5, 7, 9, 10, 12, 16, 34, 47, 48, 49], "extend": [2, 19], "note": [2, 4, 6, 10, 13, 16, 19, 24, 34, 44, 47, 48, 49], "made": [2, 28], "input": 2, "none": [2, 5, 11, 19, 20, 24, 28, 34, 36, 37, 39, 41, 44], "itself": [2, 5], "so": [2, 5, 7, 14, 15, 16, 22, 28, 34, 44, 47, 49], "block": [2, 11, 34, 48], "number": [2, 5, 11, 15, 16, 19, 20, 34, 44, 45, 48], "block_number_source_id": 2, "unlik": [2, 11], "who": [2, 48], "block_numb": [2, 34], "nevertheless": 2, "year_built": [2, 20, 34, 41], "those": [2, 11, 15, 28, 34, 44], "street": 2, "usual": [2, 18, 48], "cannot": [2, 20, 34], "serv": 2, "storag": [2, 13, 16, 20], "an_unknown_field": 2, "something_els": [2, 19], "some_buildingsnapshot_id": 2, "another_buildingsnapshot_id": 2, "truncat": 2, "too": [2, 49], "255": 2, "charact": 2, "jurisdiction_tax_lot_id": [2, 20, 34], "custom_id_1": [2, 20, 34], "ubid": [2, 34], "lot_numb": [2, 34], "district": [2, 34], "owner": [2, 12, 13, 15, 34, 41, 48], "owner_email": [2, 34], "owner_telephon": [2, 34], "owner_address": [2, 34, 41], "owner_city_st": [2, 34], "owner_postal_cod": [2, 34], "property_nam": [2, 34], "address_line_2": [2, 34], "citi": [2, 34], "postal_cod": [2, 34], "state_provinc": 2, "building_certif": [2, 34], "No": [2, 16], "store": [2, 5, 11, 20, 34, 47], "run": [3, 4, 5, 6, 8, 11, 15, 16, 19, 45, 46, 49], "pair": [3, 10, 15, 16, 41], "taxlot": [3, 5, 15, 16, 17, 19, 20, 49], "demand": 3, "select": [3, 5, 9, 11, 15, 28, 41, 46], "inventori": [3, 29, 34], "page": [3, 4, 5, 10, 15, 19, 41, 48], "action": [3, 4, 5, 11, 15, 45], "defin": [3, 5, 14, 20, 24, 28, 34], "rule": [3, 15, 17, 20, 44], "broken": 3, "satisfi": 3, "notabl": 3, "when": [3, 5, 10, 11, 13, 14, 16, 19, 20, 24, 34, 41, 44, 45, 47, 48], "label": [3, 5, 15, 17, 20, 34, 44], "appli": [3, 5, 14, 20], "elabor": 3, "attach": [3, 48], "break": [3, 47], "doe": [3, 4, 5, 7, 10, 20, 29, 44, 48], "happen": [3, 10, 14, 15, 16], "due": [3, 5, 13, 47], "perform": [3, 4, 5, 7, 10, 16, 19, 45], "reason": [3, 15], "intend": [4, 48], "linux": [4, 6, 10, 47], "cloud": [4, 11], "aw": [4, 10, 48], "hardwar": 4, "offici": 4, "window": [4, 5, 8, 11], "product": [4, 5, 6, 12, 18, 47], "desir": [4, 5, 11, 13, 44, 48], "setup": [4, 5, 10, 19, 24, 41, 48], "prerequisit": [4, 8], "depend": [4, 5, 8, 11, 16], "javascript": [4, 5, 7, 8, 10], "configur": [4, 5, 8, 10, 16, 17, 20, 47], "cach": [4, 16, 19, 20, 34, 41, 48], "broker": [4, 48], "celeri": [4, 5, 16, 20, 36, 45, 47, 48], "background": 4, "task": [4, 17, 20, 22, 45, 48], "worker": [4, 45, 48], "initi": [4, 5, 15, 20, 24, 28, 41, 44, 46, 48], "web": [4, 5, 6, 7, 10, 14, 47], "environ": [4, 5, 11, 47, 48], "variabl": [4, 5, 11, 18, 37, 47, 48], "mail": 4, "servic": [4, 6, 11, 12, 16, 49], "deploi": [4, 5, 11, 16], "kubernet": [4, 10], "helm": [4, 10], "cluster": 4, "resourc": [4, 10], "through": [4, 5, 11, 12, 34, 49], "variou": [4, 5, 9, 16], "custom": [4, 5, 6, 16, 18, 20, 22, 28, 34], "webserv": [4, 47], "issu": [4, 5, 9, 10, 13, 16, 44, 47], "enabl": [4, 5, 9, 11, 20, 44, 48], "up": [4, 5, 11, 13, 15, 16, 20, 24, 41, 44, 47, 48, 49], "io": [4, 5, 6], "raven_config": 4, "sentry_js_dsn": [4, 11], "frontend": 4, "moment": [4, 13], "sentry_sdk": 4, "integr": [4, 10], "djangointegr": 4, "celeryintegr": 4, "init": [4, 48], "dsn": [4, 11], "ingest": 4, "job": 4, "traces_sample_r": 4, "captur": [4, 5, 15], "100": [4, 11, 20, 39], "transact": 4, "we": [4, 5, 11, 13, 14, 19, 34, 41, 44, 49], "adjust": [4, 49], "wish": 4, "associ": [4, 15, 20, 34], "assum": [4, 11, 44, 46, 48], "mai": [4, 12, 15, 16, 34, 44, 47, 48], "send": [4, 11, 13, 19, 20, 24], "pii": 4, "send_default_pii": 4, "job_id": 4, "3": [5, 11, 12, 13, 15, 20, 34, 46, 47, 48], "beta": 5, "22": 5, "21": [5, 11], "20": 5, "19": 5, "17": 5, "16": [5, 13], "10": [5, 11, 13, 20, 44, 47], "7": [5, 46], "osx": [5, 8], "translat": [5, 10], "philosophi": 5, "style": [5, 44], "don": [5, 47], "t": [5, 15, 16, 34, 44, 47, 48], "crazi": 5, "indirect": [5, 12], "interpol": 5, "precommit": 5, "format": [5, 11, 16, 19, 20, 28, 34, 41, 49], "static": [5, 13, 16, 20, 34, 36], "verifi": [5, 6, 13, 49], "syntax": 5, "call": [5, 11, 14, 20, 28, 34, 36, 41, 44, 48], "tox": 5, "begin": 5, "codebas": [5, 22], "benefit": [5, 7, 10], "elimin": 5, "accident": [5, 15], "mistak": 5, "prevent": [5, 15], "bug": 5, "well": [5, 7, 10, 16, 41, 44], "better": [5, 48, 49], "experi": 5, "exhaust": 5, "annot": 5, "function": [5, 7, 10, 11, 17, 19, 34, 37, 41, 44], "refactor": 5, "might": [5, 15, 18], "benefici": 5, "ambigu": [5, 15], "determin": [5, 34, 44], "ton": 5, "effort": 5, "built": [5, 20, 24, 34, 41], "collect": 5, "dict": [5, 19, 20, 28, 29, 34, 36, 41], "tupl": [5, 28, 34, 44], "capit": 5, "modul": [5, 10, 18, 41], "typeddict": 5, "notrequir": 5, "typing_extens": 5, "packag": [5, 8, 10, 11, 13, 17], "option": [5, 13, 19, 24, 34, 37, 44], "dictionari": [5, 20, 29, 34, 41], "common": [5, 6, 11], "gotcha": 5, "try": [5, 15, 28, 36, 41, 47], "class": [5, 19, 20, 22, 24, 28, 34, 36, 37, 39, 41, 44], "method": [5, 7, 10, 16, 19, 20, 22, 24, 28, 34, 36, 41, 44], "__future__": 5, "re": [5, 11, 15, 41, 46, 48, 49], "warn": [5, 20], "runtim": 5, "sure": [5, 6, 7, 11, 16, 34, 41, 47, 48], "wast": 5, "pleas": [5, 9], "checker": 5, "feel": 5, "free": 5, "throw": 5, "ignor": [5, 15, 34], "problemat": 5, "top": [5, 24, 34, 49], "ci": 5, "current": [5, 19, 34, 45, 46, 49], "mypi": 5, "own": [5, 13, 15], "extens": [5, 16, 34, 46, 48], "vscode": 5, "pylanc": 5, "microsoft": 5, "pyright": 5, "typecheck": 5, "complic": 5, "mix": 5, "extra": [5, 29, 34], "propertyst": [5, 16, 17, 20, 29, 34], "taxlotst": [5, 16, 17, 20, 29, 34], "model": [5, 7, 10, 14, 16, 17, 29, 36, 44], "yet": 5, "database_column": [5, 34], "copar": [5, 34], "sql": [5, 34], "keep_field": 5, "makemigr": 5, "script": [5, 6, 16, 44, 48, 49], "new_db_field": 5, "def": [5, 19, 36], "forward": [5, 11, 20, 24, 34], "schema_editor": 5, "get_model": 5, "column_nam": [5, 16, 34, 41], "geocoding_confid": [5, 34], "table_nam": [5, 16, 20, 34], "display_nam": [5, 20, 34], "geocod": [5, 16, 34, 48], "column_descript": [5, 34], "data_typ": [5, 20, 34], "is_extra_data": [5, 16, 34], "count": [5, 34], "elif": 5, "col": [5, 28], "els": [5, 36], "than": [5, 11, 12, 15, 20, 28, 49], "0090_auto_20180425_1154": 5, "oper": 5, "runpython": 5, "unit": [5, 12, 16, 17, 20, 22, 34, 45], "fix": [5, 16], "failur": 5, "test_mapping_data": [5, 17], "test_kei": 5, "test_column": 5, "test_column_retrieve_schema": 5, "test_column_retrieve_db_field": 5, "workflow": [5, 9, 28], "toggl": 5, "mainten": 5, "mode": [5, 47, 48], "displai": [5, 15, 16, 34, 47], "api": [5, 7, 8, 9, 10, 14, 16, 17, 19, 24, 28, 41, 49], "exec": [5, 11, 16, 46, 47], "seed_web": [5, 47], "sh": [5, 6, 16, 48, 49], "off": [5, 44, 47], "angular": [5, 49], "delimit": 5, "thu": 5, "renam": [5, 34], "BE": [5, 12], "interpolateprovid": 5, "startsymbol": 5, "endsymbol": 5, "eas": [5, 11], "automat": [5, 15, 16, 49], "readthedoc": 5, "en": 5, "latest": [5, 11, 15, 46], "html": [5, 11, 13, 49], "xmlhttprequest": 5, "cooki": 5, "x": [5, 6], "csrftoken": 5, "seed_app": 5, "statehelperprovid": 5, "urlrouterprovid": 5, "locationprovid": 5, "home": [5, 6, 34, 45], "templateurl": 5, "static_url": [5, 13], "control": [5, 16, 34, 49], "profile_control": 5, "resolv": [5, 6, 15], "auth_payload": 5, "auth_servic": 5, "q": [5, 13, 19], "user_servic": 5, "var": [5, 48], "get_organ": [5, 44], "is_author": 5, "requires_superus": 5, "user_profile_payload": 5, "get_user_profil": 5, "found": [5, 11, 15, 34, 48], "doc": [5, 11, 48], "djangoproject": 5, "topic": [5, 9], "standard": [5, 7, 12, 18], "logger": 5, "level": [5, 15, 18, 20, 41, 44], "describ": [5, 14, 15, 34, 47], "sever": [5, 16, 20], "debug": [5, 13], "low": [5, 16, 34], "minor": 5, "problem": [5, 9], "major": [5, 49], "critic": 5, "written": [5, 7, 10, 12, 19], "do": [5, 11, 15, 16, 19, 28, 34, 44, 47, 48, 49], "hardcod": 5, "goal": [5, 15], "dynam": [5, 20, 24, 34], "espm": 5, "blob": [5, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "lib": [5, 10, 16, 17, 19, 38, 39, 44, 48], "pm": [5, 22, 28, 34], "brief": 5, "descript": [5, 18, 20, 34], "how": [5, 9, 10, 49], "drop": [5, 46], "distribut": [5, 12], "part": [5, 16, 28], "third": [5, 11, 13], "last": [5, 15], "span": 5, "multipl": [5, 7, 10, 15, 16, 34], "createus": [5, 13, 48], "seedus": [5, 9, 11, 13, 16, 17, 24, 46, 48], "IF": [5, 12], "NOT": [5, 12], "postgi": [5, 8, 13, 16, 46], "timescaledb": [5, 8, 13, 16, 46], "testorg": 5, "timescaledb_pre_restor": [5, 46], "previou": [5, 44], "pg_restor": [5, 46], "backup": [5, 6, 16, 47], "prod": [5, 11, 13], "prod_20191203_000002": 5, "installed_vers": 5, "being": [5, 15, 19, 44, 45, 47, 48], "default_vers": 5, "pg_available_extens": 5, "timescaledb_post_restor": [5, 46], "disabl": 5, "celerybeat": 5, "salesforc": [5, 19], "domain": [5, 19], "dev1": 5, "salesforce_en": 5, "periodictask": 5, "name__startswith": 5, "salesforce_sync_org": 5, "update_chang": 5, "jasmin": [5, 45], "angular_js_test": [5, 45], "vcr": 5, "cassett": 5, "reus": 5, "respons": [5, 6, 10, 19], "unless": [5, 44, 47], "want": [5, 11, 16, 34, 47, 48], "refresh": 5, "isn": 5, "anyth": [5, 7], "logic": [5, 34], "mapquest": [5, 8, 16], "work": [5, 6, 7, 10, 11, 12, 13, 16, 44, 47, 48], "ll": [5, 47, 49], "small": [5, 19], "testing_mapquest_api_kei": 5, "actual": [5, 15, 41], "just": [5, 11, 15, 34, 37, 47, 48, 49], "delet": [5, 16, 20, 22, 34], "old": [5, 6, 15, 16, 34], "ones": [5, 16, 22], "vcr_cassett": 5, "hidden": 5, "push": [5, 49], "coverag": 5, "report": [5, 9, 34, 41], "under": [5, 48, 49], "83": 5, "eslint": 5, "scss": 5, "stylelint": 5, "prettier": 5, "lint": 5, "older": [5, 16, 47], "websit": [5, 9, 11, 13, 48, 49], "rm": [5, 6, 16, 46], "rf": [5, 16], "htmlout": 5, "sphinx": 5, "b": [5, 15, 28, 41, 44], "code_document": 5, "new_vers": 5, "developer_resourc": 5, "md": [5, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "outsid": 5, "nation": [5, 7, 10, 12], "lab": 5, "review": [5, 9, 49], "fill": [5, 6, 9, 34, 49], "agreement": 5, "fork": 5, "otherwis": [5, 6, 12], "ensur": [5, 11, 20, 24, 34, 44], "ticket": 5, "assign": [5, 19, 34], "board": 5, "progress": [5, 19, 20, 41, 49], "tracker": 5, "branch": [5, 19], "hotfix": 5, "appropri": [5, 6, 44, 47], "convent": 5, "issue_id": 5, "short": [5, 6, 24], "write": [5, 15, 44], "upon": [5, 16], "complet": [5, 15, 16], "pull": [5, 11, 49], "pr": [5, 16], "against": [5, 19, 20, 44], "auto": [5, 10, 49], "featur": [5, 9, 10, 15, 17, 19, 24, 49], "donotpublish": 5, "present": [5, 34, 44], "enhanc": 5, "improv": [5, 7, 10], "publish": [5, 11], "onc": [5, 11, 13, 14, 15, 19, 46, 47, 49], "approv": [5, 12], "readi": [5, 11, 13, 48], "prepar": [5, 16], "prep": 5, "root": [5, 11, 16, 34, 41, 48], "alwai": [5, 15, 34], "rst": 5, "draft": 5, "changelog": 5, "cleanup": [5, 22, 34], "spell": 5, "correct": [5, 11, 16, 19, 34], "letter": 5, "miss": [5, 34], "ui": [5, 11, 14, 34, 49], "lokalis": [5, 49], "main": [5, 9, 11, 14, 17, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 48], "hub": 5, "seedplatform": [5, 6, 11], "amazon": [6, 11, 13], "m5ad": 6, "xlarg": 6, "launch": [6, 11], "remov": [6, 11, 16, 20, 28, 34, 47], "containerd": 6, "runc": 6, "commun": [6, 9, 16], "edit": [6, 15, 48], "transport": 6, "ca": 6, "certif": [6, 34, 41], "gnupg": 6, "agent": 6, "softwar": [6, 7, 10, 12], "fssl": 6, "download": [6, 11, 48], "gpg": 6, "deb": 6, "arch": 6, "amd64": 6, "lsb_releas": 6, "stabl": 6, "ce": 6, "cli": [6, 49], "group": [6, 7, 10, 15, 24], "groupadd": 6, "usermod": 6, "ag": [6, 16], "newgrp": 6, "dn": [6, 13], "correctli": [6, 20, 34], "ip": 6, "v6": 6, "getent": 6, "tutum": 6, "dnsutil": 6, "nslookup": 6, "west": [6, 11], "compos": [6, 16, 47], "25": 6, "unam": 6, "m": 6, "o": [6, 36], "usr": [6, 13, 16, 48], "bin": [6, 13, 16, 48], "chmod": 6, "checkout": [6, 16, 48], "export": [6, 13, 17, 19, 48], "postgres_us": [6, 11, 46], "postgres_db": [6, 11, 46], "postgres_password": [6, 11, 46], "gdeus3fasd1askj89qkaldjfx": 6, "postgres_port": [6, 11], "5432": [6, 11, 13, 16, 48], "secret_kei": [6, 11], "96": 6, "7jg": 6, "_": 6, "z9c9qwwu2": 6, "w": 6, "hb3r322yf3lz": 6, "ekw": 6, "ly": 6, "until": [6, 11, 47], "restor": [6, 10, 48], "seed_admin_us": [6, 11], "seed_admin_password": [6, 11], "7febwal38": 6, "k3jlfa92lakj8ih4": 6, "seed_admin_org": [6, 11], "aws_access_key_id": [6, 11], "aws_access_kei": 6, "aws_secret_access_kei": [6, 11], "aws_secret_kei": 6, "aws_ses_region_nam": [6, 11], "aws_ses_region_endpoint": [6, 11], "server_email": [6, 11], "persist": [6, 15, 34], "volum": [6, 11, 47], "seed_pgdata": [6, 47], "seed_media": [6, 47], "mkdir": [6, 48], "p": [6, 13, 48], "path": [6, 19, 24, 34, 41, 48], "dir": 6, "wai": [6, 11, 12, 13, 48, 49], "swarm": 6, "stack": 6, "implement": [6, 7, 10, 20, 24, 34, 36, 41], "simpli": [6, 16, 20], "yml": [6, 11, 16, 47, 49], "filenam": [6, 34], "bash": [6, 11, 46], "replac": [6, 11, 13, 16, 18, 48], "energi": [7, 9, 12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "effici": [7, 12, 34], "help": [7, 10, 16, 47, 48], "easili": [7, 10, 16, 19, 28], "larg": [7, 10, 11], "combin": [7, 10, 15, 18, 48], "clean": [7, 10, 16, 34, 44], "share": [7, 10, 16, 19, 46], "easi": [7, 10, 11, 13, 48], "flexibl": [7, 10], "cost": [7, 10], "effect": [7, 10, 16], "demonstr": [7, 10], "econom": [7, 10], "environment": [7, 10], "program": [7, 10, 12, 15], "target": [7, 10, 15, 48], "invest": [7, 10], "angularj": [7, 10, 45], "bootstrap": [7, 10, 48], "front": [7, 10], "back": [7, 10, 14, 48], "browser": [7, 10, 48, 49], "interfac": [7, 10, 11], "full": [7, 10, 22, 34], "renew": [7, 10], "laboratori": [7, 10, 12], "fund": [7, 10], "depart": [7, 10, 12], "newdomain": 7, "staticfiles_storag": [7, 16], "comment": [7, 34, 48], "redeploi": 7, "recollect": 7, "compress": 7, "nodej": [8, 13], "nativ": [8, 11, 16, 49], "tutori": 9, "learn": 9, "forum": 9, "announc": 9, "question": [9, 10, 34], "buildingenergytool": 9, "inquiri": 9, "specif": [9, 12, 13, 15, 20, 22, 34], "tool": [9, 11, 49], "desk": 9, "relev": 9, "buildingdata": 9, "gov": [9, 28, 29], "open": [9, 16, 46, 47, 48], "compon": 9, "client": [9, 14, 41, 44], "dataset": [9, 41], "encourag": 9, "seeddevelop": 9, "guid": 10, "monitor": [10, 11], "authent": [10, 13, 44, 45], "payload": 10, "children": [10, 20, 24, 34], "v": [10, 41, 44, 46], "what": [10, 11, 13, 34, 47, 48], "realli": [10, 15], "buildingsnapshot": 10, "canonicalbuild": 10, "_source_id": 10, "field": [10, 15, 16, 19, 20, 24, 28, 29, 34, 36, 44, 48], "extra_data": [10, 20, 34, 44], "possibl": [10, 12, 15, 22, 29], "loss": [10, 12], "why": 10, "depth": 10, "land": [10, 17, 19], "public": [10, 17, 34], "serial": [10, 17, 44], "test": [10, 13, 16, 17, 19, 22, 31, 45, 48], "util": [10, 16, 17, 24], "nginx": [10, 13], "log": [10, 19, 34, 41, 44, 47, 48, 49], "bede": [10, 17], "complianc": 10, "reset": [10, 19, 20, 47], "contribut": 10, "best": [10, 15], "practic": 10, "licens": [10, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "ask": 10, "index": [10, 13], "robust": 11, "orchestr": 11, "further": 11, "choic": 11, "slightli": 11, "provis": 11, "googl": [11, 49], "gcp": 11, "azur": 11, "ak": 11, "userguid": 11, "cliv2": 11, "insert": [11, 34, 47], "secret": [11, 47, 48], "region": [11, 13], "east": [11, 13, 34], "output": [11, 47], "mac": [11, 47, 48], "homebrew": [11, 48], "brew": [11, 16, 48, 49], "did": [11, 20], "properli": [11, 41], "pod": 11, "replicaset": 11, "unfamiliar": 11, "gui": 11, "One": 11, "dashboard": 11, "parti": [11, 12, 13], "octant": 11, "eksctl": 11, "elast": 11, "disregard": 11, "eksct": 11, "termin": [11, 48], "adequ": 11, "permiss": [11, 12, 24], "bracket": 11, "m5": 11, "min": [11, 20, 28], "tag": [11, 37, 49], "env": [11, 47, 48], "persistentvolum": 11, "media": [11, 24, 47], "access_key_id": 11, "secret_access_kei": 11, "django_settings_modul": [11, 13, 48], "super": [11, 44, 47, 48], "yaml": [11, 19], "bsyncr": 11, "analysi": [11, 15], "bsyncr_server_port": 11, "5000": [11, 16], "bsyncr_server_host": 11, "sentri": 11, "sentry_raven_dsn": 11, "self": [11, 19, 28, 34, 36, 44, 45], "registr": 11, "secur": 11, "google_recaptcha_site_kei": 11, "recaptcha": 11, "google_recaptcha_secret_kei": 11, "imag": [11, 46, 47], "noaa": 11, "noaa_token": 11, "context": [11, 17, 37, 45], "onlin": 11, "status": 11, "extern": 11, "ingress": 11, "someth": [11, 47, 48], "loadbalanc": 11, "154": 11, "227": 11, "my": [11, 13, 48], "uniqu": [11, 16, 34], "32291": 11, "tcp": 11, "dedeploi": 11, "find": [11, 15, 20, 34, 48], "talk": 11, "kubeconfig": 11, "yourself": [11, 47, 48], "seedorg": [11, 48], "badpass": [11, 13, 48], "restart": [11, 13, 16, 47, 48], "rollout": 11, "copyright": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "2017": 12, "2024": [12, 20], "allianc": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "sustain": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "llc": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "contributor": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "right": [12, 29, 49], "reserv": [12, 45], "redistribut": 12, "binari": 12, "modif": [12, 19], "permit": 12, "condit": [12, 20, 34], "met": 12, "retain": [12, 34], "notic": 12, "disclaim": 12, "reproduc": 12, "materi": 12, "neither": 12, "holder": [12, 41], "nor": 12, "endors": 12, "promot": [12, 34], "deriv": [12, 34], "prior": 12, "claus": 12, "trademark": 12, "confusingli": 12, "similar": [12, 13, 34], "design": 12, "govern": 12, "employe": 12, "respect": [12, 34], "BY": 12, "THE": 12, "AND": 12, "AS": 12, "express": [12, 49], "OR": [12, 44], "impli": 12, "warranti": 12, "BUT": 12, "limit": 12, "TO": [12, 13, 48], "OF": 12, "merchant": 12, "fit": 12, "FOR": 12, "particular": [12, 14, 15, 34], "IN": 12, "NO": 12, "event": [12, 15, 34], "shall": 12, "THEIR": 12, "liabl": 12, "direct": 12, "incident": 12, "special": [12, 16, 34], "exemplari": 12, "consequenti": 12, "damag": 12, "procur": 12, "substitut": 12, "good": [12, 41], "profit": 12, "busi": 12, "interrupt": 12, "ON": [12, 13, 48], "theori": 12, "liabil": 12, "contract": 12, "strict": 12, "tort": 12, "neglig": 12, "aris": 12, "advis": 12, "SUCH": 12, "2014": 12, "regent": 12, "univers": 12, "california": 12, "lawrenc": 12, "berkelei": 12, "subject": [12, 24], "receipt": 12, "dept": 12, "thereof": 12, "while": [13, 15, 47], "bare": 13, "bone": 13, "counterpart": 13, "desktop": [13, 47], "ppa": [13, 16], "timescal": [13, 16, 46, 48], "python3": [13, 48], "gdal": 13, "seeddb": [13, 16, 48], "seedpass": [13, 16, 48], "prompt": [13, 48], "tune": [13, 16], "su": [13, 48], "grant": [13, 48], "privileg": [13, 48], "alter": [13, 46, 48], "createrol": 13, "exit": [13, 48], "pip3": [13, 16], "gi": [13, 16, 48], "localhost": [13, 16, 48], "could": [13, 16, 18, 28, 36, 47, 48], "mysql": 13, "dbshell": 13, "127": [13, 16, 41, 47, 48], "lbnl": 13, "Of": [13, 48], "cours": [13, 48], "somewher": [13, 48], "8000": [13, 48], "runserv": [13, 18, 48], "sit": 13, "behind": [13, 16], "dj": 13, "collectstat": 13, "lock": [13, 19, 41], "node_modul": 13, "openlay": 13, "ext": 13, "static_root": 13, "collected_stat": 13, "dedic": 13, "receiv": [13, 34, 41], "bashrc": [13, 48], "overrid": [13, 22, 34, 44], "sentry_dsn": 13, "xyz": 13, "getsentri": 13, "123": 13, "only_http": 13, "email_backend": 13, "django_s": 13, "sesbackend": 13, "consol": [13, 49], "quickstart": 13, "sandbox": 13, "sender": [13, 34], "recipi": 13, "notif": 13, "sn": 13, "notifi": 13, "bounc": 13, "dkim": 13, "spf": 13, "put": [13, 34, 48, 49], "compat": [13, 20], "gmail": 13, "emailbackend": 13, "domain_urlconf": 13, "down": [14, 44, 47], "overview": 14, "batch": 14, "invok": 14, "save_raw_data": 14, "done": [14, 19, 44, 48, 49], "know": [14, 15], "portfolio": [14, 22, 28], "metadata": 14, "data_import": [14, 22], "dataimportbackend": 14, "upload_complet": 14, "attribut": [14, 29, 44], "importfil": [14, 22, 44], "subsequ": [14, 15], "exactli": 14, "space": [14, 24, 34], "uppercas": 14, "relationship": [15, 34, 44], "between": [15, 24, 47, 48], "tax": [15, 20, 34], "thei": [15, 20, 28, 34, 45, 48], "criteria": 15, "customiz": 15, "high": [15, 20, 34], "identifi": [15, 16, 20], "represent": [15, 19], "discard": 15, "phone": 15, "shouldn": [15, 16], "much": [15, 41, 48], "whenev": 15, "execut": [15, 20, 24, 34, 45], "few": [15, 49], "unrel": 15, "scope": 15, "scenario": [15, 34], "exclud": [15, 19, 20, 22, 34], "overlap": 15, "prioriti": [15, 29, 34], "final": [15, 16, 28], "give": [15, 48], "protect": [15, 44], "period": [15, 34], "meter": [15, 16, 17, 22, 34], "mean": 15, "aggreg": 15, "altern": 15, "themselv": [15, 49], "mention": 15, "earlier": 15, "assumpt": 15, "avoid": [15, 48, 49], "unresolv": 15, "situat": [15, 47], "wouldn": 15, "cross": 15, "alreadi": [15, 16, 34, 48], "individu": 15, "explicit": 15, "trigger": [15, 47], "explicitli": 15, "chosen": 15, "incom": 15, "whole": [15, 18, 49], "round": 15, "origin": [15, 34], "establish": 15, "reestablish": 15, "commit": [15, 49], "affect": 15, "difficult": 15, "revers": [15, 20, 24, 34], "tri": 15, "unmerg": 15, "unlink": 15, "intervent": 15, "accomplish": 15, "veri": [15, 16, 34], "fact": 15, "lead": 15, "carri": 15, "consider": [15, 22], "taken": [15, 19], "entri": [15, 19], "anoth": [15, 18], "oppos": 15, "amongst": 15, "duplic": [15, 16, 28, 34, 41, 48, 49], "flag": 15, "doesn": [15, 47], "bit": 16, "celery_result_backend": 16, "celery_task_default_queu": 16, "celery_task_queu": 16, "exchang": 16, "routing_kei": 16, "notat": 16, "protocol": 16, "censu": 16, "tract": 16, "disadvantag": 16, "around": [16, 44], "minut": 16, "across": [16, 19, 34], "gaug": 16, "impact": 16, "deprec": [16, 41], "often": 16, "aros": 16, "upsert": 16, "typic": [16, 20, 34], "seed_column": 16, "300": 16, "kbtu": [16, 20], "ft2": 16, "units_pint": [16, 34], "complex": 16, "column_id": [16, 34], "seed_columnmapping_": 16, "constraint": 16, "seed_columnmapping_column_raw": 16, "old_id": 16, "seed_columnmapping_column_map": 16, "encount": [16, 19], "0118_match_merge_link_all_org": 16, "reorder": 16, "118": 16, "recogn": 16, "cycl": [16, 17, 41], "fulli": [16, 24], "superperm": 16, "whole_org_match_merge_link": 16, "insid": [16, 41, 47], "seri": 16, "tap": [16, 49], "timescaledb_mov": 16, "awhil": 16, "recalcul": 16, "pars": [16, 19, 34], "bldg": [16, 34], "cast": [16, 34], "bytestr": 16, "On": 16, "indic": [16, 41], "postgres_container_id": 16, "operationalerror": 16, "bower": 16, "vendor": 16, "css": 16, "default_file_storag": 16, "filesystemstorag": 16, "sign": 16, "submodul": [17, 25, 38], "templat": [17, 34, 45, 48], "sentry_j": [17, 18], "session_kei": [17, 18], "de_camel_cas": [17, 18], "robots_txt": [17, 18], "wsgi": [17, 19], "inherit": 17, "comparisonerror": [17, 20], "dataqualitycheck": [17, 20], "dataqualitytypecasterror": [17, 20], "unitmismatcherror": [17, 20], "format_pint_viol": [17, 20], "notdeletedmanag": [17, 22], "kbtu_thermal_conversion_factor": [17, 22], "usage_point_id": [17, 22], "subpackag": [17, 41], "customcreateuserform": [17, 24], "loginform": [17, 24], "userlogintest": [17, 24], "account_activation_s": [17, 24], "create_account": [17, 24], "landing_pag": [17, 24], "password_reset": [17, 24], "password_reset_complet": [17, 24], "password_reset_confirm": [17, 24], "password_reset_don": [17, 24], "password_set": [17, 24], "signup": [17, 19, 24, 41], "mapper": [17, 19], "create_column_regex": [17, 28], "get_pm_map": [17, 28], "mapping_column": 17, "mappingcolumn": [17, 28], "sort_dupl": [17, 28], "mapping_data": 17, "test_mapp": 17, "test_mapping_column": 17, "get_attrs_with_map": [17, 29], "get_propertystate_attr": [17, 29], "get_state_attr": [17, 29], "get_state_to_state_tupl": [17, 29], "get_taxlotstate_attr": [17, 29], "merge_st": [17, 29, 34], "seed_map": [17, 19], "auditlog": 17, "columncasterror": [17, 34], "validate_model": [17, 34], "statuslabel": [17, 20, 34, 36], "propertyauditlog": [17, 34], "propertyview": [17, 20, 34], "post_save_properti": [17, 34], "post_save_property_st": [17, 34], "post_save_property_view": [17, 34], "pre_delete_st": [17, 34], "set_default_access_level_inst": [17, 34], "sync_latitude_longitude_and_long_lat": [17, 34], "taxlotauditlog": [17, 34], "taxlotview": [17, 20, 34], "post_save_taxlot_st": [17, 34], "post_save_taxlot_view": [17, 34], "templatetag": [17, 19], "helper": [17, 19, 28, 37, 41, 44], "decor": [17, 44], "drfendpointmixin": [17, 19], "ajax_request": [17, 19], "ajax_request_class": [17, 19], "decorator_to_mixin": [17, 19], "get_prog_kei": [17, 19], "lock_and_track": [17, 19], "require_organization_id": [17, 19], "require_organization_id_class": [17, 19], "require_organization_membership": [17, 19], "factori": [17, 38, 39, 41], "build_shared_buildings_org": [17, 19], "create_inventory_queryset": [17, 19], "get_inventory_fieldnam": [17, 19], "get_orgs_w_public_field": [17, 19], "inventory_search_filter_sort": [17, 19], "parse_bodi": [17, 19], "process_search_param": [17, 19], "search_inventori": [17, 19], "search_properti": [17, 19], "search_taxlot": [17, 19], "delete_organ": [17, 19], "invite_new_user_to_se": [17, 19], "send_salesforce_error_log": [17, 19], "signuptokengener": [17, 19], "celerydatetimeseri": [17, 36], "labelseri": [17, 36], "adminviewstest": [17, 19, 41], "classdecoratortest": [17, 19, 41], "requireorganizationidtest": [17, 19, 41], "testdecor": [17, 19, 41], "testerror": [17, 19, 41], "testtask": [17, 19, 41], "datasetpermissionstest": [17, 19, 41], "getdatasetsviewstest": [17, 19, 41], "importfileviewstest": [17, 19, 41], "inventoryviewtest": [17, 19, 41], "mainviewtest": [17, 19, 41], "testmcmview": [17, 19, 41], "accesslevelbasetestcas": [17, 19, 41], "assertdictsubsetmixin": [17, 19, 41], "datamappingbasetestcas": [17, 19, 41], "deletemodelstestcas": [17, 19, 41], "fakecli": [17, 19, 41], "fakerequest": [17, 19, 41], "apibypasscsrfmiddlewar": [17, 44], "orgcreatemixin": [17, 44], "orgcreateupdatemixin": [17, 44], "orgmixin": [17, 44], "orgquerysetmixin": [17, 44], "orgupdatemixin": [17, 44], "orgvalidatemixin": [17, 44], "orgvalid": [17, 44], "profileidmixin": [17, 44], "api_endpoint": [17, 44], "api_endpoint_class": [17, 44], "clean_api_regex": [17, 44], "drf_api_endpoint": [17, 44], "format_api_docstr": [17, 44], "get_all_url": [17, 44], "get_api_endpoint": [17, 44], "get_api_request_us": [17, 44], "get_org_id_from_valid": [17, 44], "rgetattr": [17, 44], "get_source_typ": [17, 44], "create_organ": [17, 44], "create_suborgan": [17, 44], "default_pm_map": [17, 44], "convert_datestr": [17, 44], "convert_to_js_timestamp": [17, 44], "parse_datetim": [17, 44], "tm": [18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "template_context": 18, "expos": 18, "runfcgi": 18, "discov": 18, "wsgi_appl": 18, "sens": 18, "later": [18, 28, 47], "deleg": [18, 20, 24, 34], "introduc": 18, "middlewar": [18, 44], "framework": [18, 44], "breadcrumb": 19, "breadcrumbnod": [19, 37], "render": [19, 24, 37, 49], "urlbreadcrumbnod": [19, 37], "breadcrumb_root": [19, 37], "breadcrumb_url": [19, 37], "breadcrumb_url_root": [19, 37], "create_crumb": [19, 37], "create_crumb_first": [19, 37], "factor": [19, 22, 38], "chomski": [19, 38, 39], "djangofunctionalfactori": [19, 38, 39], "invalid_test_cc_numb": [19, 38, 39], "rand_bool": [19, 38, 39], "rand_citi": [19, 38, 39], "rand_city_suffix": [19, 38, 39], "rand_curr": [19, 38, 39], "rand_dat": [19, 38, 39], "rand_domain": [19, 38, 39], "rand_email": [19, 38, 39], "rand_float": [19, 38, 39], "rand_int": [19, 38, 39], "rand_nam": [19, 38, 39], "rand_phon": [19, 38, 39], "rand_plant_nam": [19, 38, 39], "rand_str": [19, 38, 39], "rand_street_address": [19, 38, 39], "rand_street_suffix": [19, 38, 39], "test_cc_numb": [19, 38, 39], "valid_test_cc_numb": [19, 38, 39], "test_add_org": [19, 41], "test_add_org_dup": [19, 41], "test_add_owner_existing_org_to_non_root": [19, 41], "test_add_user_existing_org": [19, 41], "test_add_user_new_org": [19, 41], "test_add_user_no_org": [19, 41], "test_signup_process": [19, 41], "test_signup_process_force_lowercase_email": [19, 41], "test_ajax_request_class_dict": [19, 41], "test_ajax_request_class_dict_status_error": [19, 41], "test_ajax_request_class_dict_status_fals": [19, 41], "test_ajax_request_class_format_typ": [19, 41], "test_require_organization_id_class_no_org_id": [19, 41], "test_require_organization_id_class_org_id": [19, 41], "test_require_organization_id_class_org_id_not_int": [19, 41], "test_require_organization_id_fail_no_kei": [19, 41], "test_require_organization_id_fail_not_numer": [19, 41], "test_require_organization_id_success_integ": [19, 41], "test_require_organization_id_success_str": [19, 41], "pk": [19, 41, 44], "test_get_prog_kei": [19, 41], "test_increment_cach": [19, 41], "test_lock": [19, 41], "test_locking_w_except": [19, 41], "test_progress": [19, 41], "unlock": [19, 41], "test_delete_organ": [19, 41], "test_dataset_count": [19, 41], "test_dataset_cr": [19, 41], "test_dataset_destroi": [19, 41], "test_dataset_list": [19, 41], "test_dataset_retriev": [19, 41], "test_dataset_upd": [19, 41], "test_delete_dataset": [19, 41], "test_get_dataset": [19, 41], "test_get_datasets_count": [19, 41], "test_get_datasets_count_invalid": [19, 41], "test_update_dataset": [19, 41], "test_delete_fil": [19, 41], "test_get_import_fil": [19, 41], "test_get_matching_and_geocoding_result": [19, 41], "test_get_cycl": [19, 41], "test_get_properti": [19, 41], "test_get_properties_cycle_id": [19, 41], "test_get_properties_empty_pag": [19, 41], "test_get_properties_page_not_an_integ": [19, 41], "test_get_properties_pint_field": [19, 41], "test_get_properties_profile_id": [19, 41], "test_get_properties_property_extra_data": [19, 41], "test_get_properties_select_al": [19, 41], "test_get_properties_taxlot_extra_data": [19, 41], "test_get_properties_with_taxlot": [19, 41], "test_get_properties_with_taxlots_with_footprint": [19, 41], "test_get_properties_wrong_query_param": [19, 41], "test_get_property_column": [19, 41], "test_get_property_multiple_taxlot": [19, 41], "test_get_taxlot": [19, 41], "test_get_taxlot_column": [19, 41], "test_get_taxlots_empty_pag": [19, 41], "test_get_taxlots_extra_data": [19, 41], "test_get_taxlots_multiple_taxlot": [19, 41], "test_get_taxlots_no_cycle_id": [19, 41], "test_get_taxlots_page_not_an_integ": [19, 41], "test_get_taxlots_profile_id": [19, 41], "test_postoffic": [19, 41], "test_update_pint_fields_with_modified_display_set": [19, 41], "test_hom": [19, 41], "assert_expected_map": [19, 41], "expected_map": [19, 41], "raw_columns_expect": [19, 41], "test_create_dataset": [19, 41], "test_get_column_mapping_suggest": [19, 41], "test_get_column_mapping_suggestions_pm_fil": [19, 41], "test_get_column_mapping_suggestions_with_column": [19, 41], "test_get_raw_column_nam": [19, 41], "test_save_column_map": [19, 41], "test_save_column_mappings_idempot": [19, 41], "login_as_child_memb": [19, 41], "login_as_root_memb": [19, 41], "login_as_root_own": [19, 41], "assertdictcontainssubset": [19, 41], "create_import_fil": [19, 41], "set_up": [19, 41], "teardown": [19, 41], "meta": [19, 24, 36, 41], "bodi": [19, 41], "alia": [19, 24, 36, 44, 48], "mixin": [19, 44], "func": 19, "annoi": 19, "slash": 19, "serializ": [19, 36], "http_accept": 19, "my_view": 19, "news_titl": 19, "titl": [19, 37], "convert": [19, 44], "loginrequiredmixin": 19, "login_requir": [19, 44], "myview": 19, "someview": 19, "some_decor": 19, "func_nam": 19, "import_file_pk": 19, "fn": [19, 44], "arg": [19, 20, 22, 24, 34, 36, 44, 45], "kwarg": [19, 20, 22, 24, 34, 36, 41, 44, 45], "executor": 19, "int": [19, 28, 34, 44], "pertain": [19, 22], "sibl": 19, "inventory_typ": [19, 34, 49], "order_bi": 19, "other_org": 19, "cycle_id": [19, 34], "queryset": [19, 20, 22, 44], "inst": [19, 29, 34, 44], "str": [19, 34, 41, 44], "publicli": 19, "sort": [19, 28], "tax_lot_id": [19, 20], "sort_revers": 19, "bool": [19, 20, 28, 34, 44], "asc": 19, "dsc": 19, "pagin": 19, "number_per_pag": 19, "show_shared_build": [19, 24], "global": [19, 44, 48], "other_search_param": 19, "project_id": 19, "is_api_request": 19, "intern": 19, "boolean": [19, 20, 28, 34], "fieldnam": [19, 20, 44], "unicod": [19, 20], "org_pk": 19, "delete_organization_build": 19, "email_address": 19, "user_pk": 19, "first_nam": [19, 24], "invit": 19, "newli": 19, "default_token_gener": 19, "new_us": 19, "noth": 19, "sync": [19, 24], "aleck": 19, "landgraf": 19, "token_gener": 19, "master": [19, 24], "expir": 19, "three": 19, "dai": 19, "strategi": 19, "mechan": 19, "check_token": 19, "token_expir": 19, "make_token": 19, "data_qu": 20, "doesnotexist": [20, 24, 34], "objectdoesnotexist": [20, 24, 34], "multipleobjectsreturn": [20, 24, 34], "required_field": [20, 24], "add_invalid_geometry_entry_provid": 20, "row_id": 20, "add_result_comparison_error": 20, "rule_check": 20, "add_result_dimension_error": 20, "add_result_is_nul": 20, "add_result_max_error": 20, "rule_max": 20, "add_result_min_error": 20, "rule_min": 20, "add_result_missing_and_non": 20, "add_result_missing_req": 20, "add_result_string_error": 20, "add_result_type_error": 20, "add_rul": 20, "add_rule_if_new": 20, "cache_kei": 20, "check_data": 20, "record_typ": [20, 34], "get_fieldnam": 20, "wrapper": [20, 24, 34], "defer": [20, 24, 34], "read": [20, 22, 24, 34], "initialize_cach": 20, "chunk": 20, "random": 20, "initialize_rul": 20, "accessor": [20, 24, 34], "side": [20, 24, 34, 49], "forwardonetoonedescriptor": [20, 24, 34], "subclass": [20, 22, 24, 34, 36], "foreignkei": [20, 24, 34], "related_nam": [20, 24, 34], "forwardmanytoonedescriptor": [20, 24, 34], "remove_all_rul": 20, "remove_status_label": 20, "label_class": 20, "linked_id": 20, "rang": 20, "either": [20, 34, 41, 44, 47, 48, 49], "reset_all_rul": 20, "reiniti": 20, "reset_default_rul": 20, "reset_result": 20, "classmethod": [20, 24, 34, 39], "retriev": [20, 34, 41, 44], "previous": 20, "backward": 20, "obj": [20, 36, 44], "retrieve_result_by_address": 20, "retrieve_result_by_tax_lot_id": 20, "jurisdict": [20, 34], "reversemanytoonedescriptor": [20, 24, 34], "create_forward_many_to_many_manag": [20, 24, 34], "save_to_cach": 20, "rememb": 20, "update_status_label": 20, "add_to_result": 20, "default_rul": 20, "not_nul": 20, "rule_typ": 20, "conditioned_floor_area": [20, 34], "7000000": 20, "ft": 20, "energy_scor": [20, 34], "generation_d": [20, 34], "20241231": 20, "18890101": 20, "occupied_floor_area": [20, 34], "recent_sale_d": [20, 34], "site_eui": [20, 34], "site_eui_weather_norm": [20, 34], "source_eui": [20, 34], "source_eui_weather_norm": [20, 34], "1700": 20, "rule_exclud": 20, "rule_includ": 20, "rule_not_nul": 20, "rule_rang": 20, "rule_requir": 20, "rule_type_custom": 20, "rule_type_default": 20, "severity_error": 20, "severity_valid": 20, "severity_warn": 20, "type_area": 20, "type_d": 20, "type_eui": 20, "type_numb": 20, "type_str": 20, "type_year": 20, "data_quality_check": 20, "data_quality_check_id": 20, "for_derived_column": 20, "format_str": 20, "get_data_type_displai": 20, "integerfield": [20, 34], "get_rule_type_displai": 20, "get_severity_displai": 20, "maximum_valid": 20, "greater": [20, 28, 48], "maximum": [20, 45], "minimum_valid": 20, "less": 20, "minimum": 20, "status_label": 20, "status_label_id": 20, "str_to_data_typ": 20, "therefor": 20, "definit": 20, "variant": 20, "text_match": 20, "valid_text": 20, "text": 20, "regex": [20, 28, 44], "source_valu": 20, "pint": 20, "violat": [20, 34], "human": [20, 44], "readabl": [20, 41, 44], "quantiti": 20, "formatted_valu": 20, "formatted_min": 20, "formatted_max": 20, "get_al": 22, "filesystem": [22, 46], "get_queryset": [22, 44], "behavior": 22, "use_for_related_field": 22, "countri": 22, "thermal": 22, "convers": 22, "nrel": [22, 28], "deduc": 22, "regard": 22, "align": 22, "thermal_conversion_assumpt": 22, "enum": 22, "concept": 22, "sole": 22, "irrespect": 22, "raw_source_id": 22, "extract": 22, "usag": 22, "greenbutton": 22, "uri": 22, "eula": [24, 25], "usercreationform": 24, "widget": 24, "emailinput": 24, "base_field": 24, "password1": 24, "charfield": [24, 34], "password2": 24, "emailfield": 24, "declared_field": 24, "auto_id": 24, "id_": 24, "prefix": [24, 44], "error_class": 24, "errorlist": 24, "label_suffix": 24, "empty_permit": 24, "field_ord": 24, "use_required_attribut": 24, "abstractbaseus": 24, "permissionsmixin": 24, "abstract": 24, "compliant": [24, 34], "username_field": 24, "analysis_set": 24, "columnmapping_set": 24, "cycle_set": 24, "date_join": 24, "deactivate_us": 24, "default_building_detail_custom_column": 24, "default_custom_column": 24, "default_organ": [24, 44], "default_organization_id": 24, "email_us": 24, "from_email": 24, "generate_kei": 24, "adapt": 24, "tastypi": 24, "toastdriven": 24, "l47": 24, "get_absolute_url": 24, "get_full_nam": 24, "plu": 24, "last_nam": 24, "get_next_by_date_join": 24, "datetimefield": [24, 34], "is_next": [24, 34], "get_previous_by_date_join": 24, "get_short_nam": 24, "greenassessmentpropertyauditlog_set": 24, "pizza": [24, 34], "manytomanyfield": [24, 34], "manytomanydescriptor": [24, 34], "importrecord_set": 24, "is_staff": 24, "logentry_set": 24, "modified_import_record": 24, "oauth2_provider_accesstoken": 24, "oauth2_provider_appl": 24, "oauth2_provider_gr": 24, "oauth2_provider_refreshtoken": 24, "usermanag": 24, "organizationuser_set": 24, "postofficeemail_set": 24, "postofficeemailtemplate_set": 24, "process_header_request": 24, "user_permiss": 24, "methodnam": [24, 41], "runtest": [24, 41], "testcas": [24, 41], "hook": [24, 34, 41], "fixtur": [24, 41], "exercis": [24, 41], "test_simple_login": 24, "happi": [24, 41], "uidb64": 24, "dan": [28, 29], "gunter": [28, 29], "dkgunter": [28, 29], "lbl": [28, 29, 48], "raw_column": [28, 41], "sanit": 28, "raw_data": 28, "resolve_dupl": 28, "xlsx": 28, "attempt": 28, "from_field": 28, "nichola": 28, "dest_column": 28, "previous_map": 28, "map_arg": 28, "default_map": 28, "threshold": 28, "probabilist": 28, "unknown": 28, "mainli": 28, "build_column_map": 28, "add_map": 28, "potenti": 28, "preced": 28, "apply_threshold": 28, "suggest": 28, "meet": 28, "forc": [28, 34, 41, 44], "separ": [28, 36, 46, 47], "equal": 28, "final_map": 28, "downstream": 28, "raw_column_1": 28, "db_column_1": 28, "raw_column_2": 28, "first_suggested_map": 28, "grab": 28, "dup_map_field": 28, "highest": 28, "win": 28, "battl": 28, "set_initial_mapping_cmp": 28, "initial_mapping_cmp": 28, "hash": [28, 34], "detect": 28, "cmp": 28, "data_set_build": 29, "attr": 29, "state_list": 29, "merged_st": [29, 34], "state1": [29, 34], "state2": [29, 34], "ignore_merge_protect": 29, "favor": [29, 34], "column_exclude_field": 34, "bounding_box": 34, "centroid": 34, "data_st": [34, 41], "import_fil": [34, 44], "long_lat": 34, "raw_access_level_instance_error": 34, "raw_access_level_instance_id": 34, "hash_object": 34, "normalized_address": 34, "source_eui_modeled_orig": 34, "site_eui_orig": 34, "occupied_floor_area_orig": 34, "site_eui_weather_normalized_orig": 34, "site_eui_modeled_orig": 34, "source_eui_orig": 34, "gross_floor_area_orig": 34, "conditioned_floor_area_orig": 34, "source_eui_weather_normalized_orig": 34, "column_merge_favor_exist": 34, "column_merge_favor_new": 34, "column_merge_protect": 34, "pm_parent_property_id": 34, "jurisdiction_property_id": 34, "audit": [34, 41], "audit_template_building_id": 34, "postal": 34, "latitud": 34, "longitud": 34, "footprint": 34, "property_footprint": 34, "geometri": 34, "taxlot_footprint": 34, "datetim": [34, 44], "gross": 34, "use_descript": 34, "star": 34, "score": 34, "integ": 34, "property_not": 34, "property_typ": 34, "telephon": 34, "building_count": 34, "sale": 34, "occupi": 34, "home_energy_score_id": 34, "weather": 34, "site_eui_model": 34, "source_eui_model": 34, "alert": 34, "energy_alert": 34, "space_alert": 34, "number_properti": 34, "egrid": 34, "subregion": 34, "egrid_subregion_cod": 34, "total": [34, 45], "ghg": 34, "emiss": 34, "total_ghg_emiss": 34, "margin": 34, "total_marginal_ghg_emiss": 34, "intens": 34, "total_ghg_emissions_intens": 34, "ghg_intens": 34, "total_marginal_ghg_emissions_intens": 34, "zone": 34, "property_timezon": 34, "data_type_pars": 34, "callabl": 34, "lambda": 34, "fromisoformat": 34, "float": 34, "excluded_column_return_field": 34, "excluded_mapping_field": 34, "geocoded_address": 34, "geocoded_postal_cod": 34, "geocoded_side_of_street": 34, "geocoded_countri": 34, "geocoded_st": 34, "geocoded_counti": 34, "geocoded_c": 34, "geocoded_neighborhood": 34, "excluded_rename_from_field": 34, "excluded_rename_to_field": 34, "internal_type_to_data_typ": 34, "booleanfield": 34, "datefield": 34, "floatfield": 34, "doubl": [34, 44], "jsonfield": 34, "pointfield": 34, "polygonfield": 34, "textfield": 34, "pinned_column": 34, "quantity_unit_column": 34, "shared_field_typ": 34, "shared_non": 34, "shared_publ": 34, "unmappable_property_field": 34, "unmappable_taxlot_field": 34, "account_name_column": 34, "actual_emission_column": 34, "actual_energy_column": 34, "benchmark_id_column": 34, "cast_column_valu": 34, "column_data_typ": 34, "allow_non": 34, "rais": [34, 36, 44], "castexcept": 34, "wide": 34, "clean_field": 34, "validationerror": 34, "non_field_error": 34, "column_list_profil": 34, "columnlistprofilecolumn_set": 34, "comstock_map": 34, "contact_email_column": 34, "contact_name_column": 34, "create_map": 34, "arrai": 34, "columnmap": 34, "create_mappings_from_fil": 34, "absolut": 34, "data_admin_account_name_column": 34, "data_admin_email_column": 34, "data_admin_name_column": 34, "dataviewparameter_set": 34, "delete_al": 34, "invalid": 34, "irrevers": 34, "column_map": 34, "derived_column": 34, "restaur": 34, "onetoonefield": 34, "derived_column_id": 34, "derivedcolumn_set": 34, "derivedcolumnparameter_set": 34, "geocoding_ord": 34, "get_merge_protection_displai": 34, "merge_protect": 34, "get_next_by_cr": 34, "get_next_by_modifi": 34, "get_previous_by_cr": 34, "get_previous_by_modifi": 34, "get_shared_field_type_displai": 34, "goal_area_column": 34, "goal_eui_column1": 34, "goal_eui_column2": 34, "goal_eui_column3": 34, "is_matching_criteria": 34, "mapped_map": 34, "raw_map": 34, "recognize_empti": 34, "rename_column": 34, "new_column_nam": 34, "vice": 34, "versa": 34, "overwrit": [34, 47], "retrieve_al": 34, "org_id": [34, 44], "liter": 34, "only_us": 34, "include_rel": 34, "exclude_deriv": 34, "grid": 34, "retrieve_all_by_tupl": 34, "retrieve_db_field_name_for_hash_comparison": 34, "independ": 34, "md5": 34, "quickli": 34, "superset": [34, 41], "retrieve_db_field_table_and_names_from_db_t": 34, "retrieve_db_field": 34, "retrieve_db_fields_from_db_t": 34, "retrieve_db_typ": 34, "field_nam": 34, "field_name_2": 34, "data_type_2": 34, "retrieve_mapping_column": 34, "retrieve_prior": 34, "data_007": 34, "data_008": 34, "salesforce_column": 34, "force_insert": 34, "force_upd": 34, "insist": 34, "equival": [34, 44], "save_column_nam": 34, "model_obj": 34, "ever": [34, 44], "seen": [34, 47], "target_emission_column": 34, "target_energy_column": 34, "unit_id": 34, "x_axis_column": 34, "analysispropertyview_set": 34, "dataview_set": 34, "event_set": 34, "get_next_by_end": 34, "get_next_by_start": 34, "get_or_create_default": 34, "get_previous_by_end": 34, "get_previous_by_start": 34, "goal_baseline_cycl": 34, "goal_current_cycl": 34, "importfile_set": 34, "propertyview_set": 34, "taxlotproperty_set": 34, "taxlotview_set": 34, "user_id": 34, "color": [34, 36], "super_organ": [34, 36], "show_in_list": [34, 36], "timestampedmodel": 34, "blue_choic": 34, "blue": 34, "color_choic": 34, "red": 34, "light": [34, 41], "green": [34, 48], "white": 34, "orang": 34, "grai": 34, "default_label": 34, "residenti": 34, "exempt": 34, "ownership": 34, "gray_choic": 34, "green_choic": 34, "light_blue_choic": 34, "orange_choic": 34, "red_choic": 34, "white_choic": 34, "and_filter_group": 34, "compliance_label": 34, "exclude_filter_group": 34, "get_color_displai": 34, "django_extens": 34, "creationdatetimefield": 34, "modificationdatetimefield": 34, "indication_label": 34, "or_filter_group": 34, "rule_set": 34, "super_organization_id": 34, "to_dict": 34, "violation_label": 34, "measur": 34, "decim": 34, "unit_typ": 34, "column_set": 34, "get_unit_type_displai": 34, "unit_nam": 34, "overtim": 34, "remain": [34, 48, 49], "unchang": 34, "access_level_inst": 34, "access_level_instance_id": 34, "copy_met": 34, "source_property_id": 34, "source_persist": 34, "aren": 34, "bulk": 34, "reassign": 34, "data_logg": 34, "get_next_by_upd": 34, "get_previous_by_upd": 34, "goalnote_set": 34, "historical_not": 34, "reverseonetoonedescriptor": 34, "inventory_docu": 34, "parent_properti": 34, "parent_property_id": 34, "property_set": 34, "parent1": 34, "parent2": 34, "parent_state1": 34, "parent_state2": 34, "import_filenam": 34, "get_record_type_displai": 34, "parent1_id": 34, "parent2_id": 34, "parent_state1_id": 34, "parent_state2_id": 34, "propertyauditlog_parent1": 34, "propertyauditlog_parent2": 34, "state_id": 34, "view_id": 34, "pytz": 34, "timezon": [34, 44], "all_timezon": 34, "alaska": 34, "aleutian": 34, "arizona": 34, "central": 34, "indiana": 34, "eastern": 34, "hawaii": 34, "stark": 34, "michigan": 34, "mountain": 34, "pacif": 34, "samoa": 34, "analysispropertyview": 34, "building_fil": 34, "get_data_state_displai": 34, "get_merge_state_displai": 34, "get_source_type_displai": 34, "histori": 34, "measure_set": 34, "merge_relationship": 34, "property_id": 34, "propertyauditlog_st": 34, "propertymeasure_set": 34, "raw_access_level_inst": 34, "simul": [34, 41], "include_related_data": 34, "mask": 34, "ubidmodel_set": 34, "world": 34, "characterist": 34, "gapauditlog_view": 34, "greenassessmentproperty_set": 34, "initialize_audit_log": 34, "propertyauditlog_view": 34, "tax_lot_st": 34, "tax_lot_view": 34, "ubidmodel": 34, "ahead": 34, "touch": 34, "ali": 34, "tax_lot": 34, "taxlotauditlog_parent1": 34, "taxlotauditlog_parent2": 34, "stub": [34, 41], "taxlotauditlog_parent_state1": 34, "taxlotauditlog_parent_state2": 34, "taxlotauditlog_st": 34, "property_st": 34, "property_view": 34, "taxlot_id": 34, "taxlotauditlog_view": 34, "skipkei": 36, "ensure_ascii": 36, "check_circular": 36, "allow_nan": 36, "sort_kei": 36, "indent": 36, "jsonencod": 36, "typeerror": 36, "iter": 36, "seed_decod": 36, "seed_dump": 36, "seed_load": 36, "modelseri": [36, 44], "extra_kwarg": 36, "write_onli": 36, "is_appli": 36, "get_is_appli": 36, "to_represent": 36, "primit": 36, "datatyp": 36, "bitbucket": 37, "mathiasdm": 37, "render_func": 37, "url_nod": 37, "parser": 37, "andrii": 37, "drozdyuk": 37, "url_var": 37, "context_var": 37, "just_context_var": 37, "crumb": 37, "produc": 37, "person_detail": 37, "person_url": 37, "person": 37, "argument": 37, "test_help": 39, "start_year": 39, "1900": 39, "end_year": 39, "2011": 39, "length": 39, "test_admin_view": 41, "dupe": 41, "entir": [41, 44], "creation": 41, "test_decor": 41, "34": 41, "sum": 41, "increment": 41, "had": 41, "finish": [41, 46, 47], "counter": 41, "test_task": 41, "deal": 41, "test_view": 41, "k": 41, "dest_col": 41, "assert": 41, "70": 41, "air": 41, "leakag": 41, "64": 41, "47": 41, "50": 41, "create_dataset": 41, "get_raw_column_nam": 41, "save_column_map": 41, "member": 41, "subset": 41, "necessari": [41, 47], "polyfil": 41, "believ": 41, "compar": [41, 49], "import_file_source_typ": 41, "user_nam": 41, "test_us": 41, "user_password": 41, "test_pass": 41, "deconstruct": 41, "extrem": 41, "weight": 41, "view_func": 41, "remote_addr": 41, "fake_login_path": 41, "get_respons": 44, "turn": 44, "csrf": 44, "csrfviewmiddlewar": 44, "perform_cr": 44, "get_parent_org": 44, "return_obj": 44, "prove": 44, "orgfilt": 44, "nest": 44, "foreign_kei": 44, "force_par": 44, "perform_upd": 44, "org_valid": 44, "my_valid": 44, "myseri": 44, "primarykeyrelatedfield": 44, "query_set": 44, "mymodel": 44, "travers": 44, "underscor": 44, "property__org_id": 44, "validate_org": 44, "get_org_id": 44, "show": [44, 48], "get_show_column": 44, "profile_id": 44, "show_column": 44, "field_1": 44, "field_2": 44, "extra_data_field_1": 44, "extra_data_field_2": 44, "mark": 44, "has_perm": 44, "strip": 44, "todo": 44, "regist": [44, 48], "rest": 44, "is_api_endpoint": 44, "append": 44, "docstr": 44, "consumpt": 44, "urllist": 44, "recurs": 44, "yield": 44, "url_pattern": 44, "view_funct": 44, "examin": [44, 48], "getattr": 44, "deep": 44, "mimic": 44, "org__id": 44, "split": 44, "__": 44, "lst": 44, "immedi": 44, "org_nam": 44, "test_org": 44, "scratch": 44, "heavili": 44, "current_org": 44, "suborg_nam": 44, "user_rol": 44, "datestr": 44, "make_tz_awar": 44, "31": 44, "2010": 44, "utc": 44, "reconcil": 44, "mcm": 44, "cleaner": 44, "l85": 44, "millisecond": 44, "epoch": 44, "maybe_datetim": 44, "strftime": 44, "cover": 45, "celery_queu": 45, "queu": 45, "n": 45, "wait": [45, 47], "eta": 45, "countdown": 45, "maxconcurr": 45, "error404": 45, "error410": 45, "error500": 45, "health_check": 45, "health": 45, "sha": 45, "pg12": 46, "bind": 46, "mount": [46, 47], "seed_postgr": 46, "pg_dump": 46, "fc": 46, "f": [46, 47], "temporari": 46, "pg13": 46, "ts2": 46, "oss": 46, "WITH": [46, 48], "pg16": 46, "toolbox": 47, "concours": 47, "6038": 47, "Be": 47, "patient": 47, "successfulli": 47, "coupl": 47, "everyth": 47, "converg": 47, "overridden": 47, "forget": 47, "live": 47, "reload": 47, "docker_dev": 47, "probabl": [47, 49], "unfortun": 47, "seed_db_volum": 47, "seed_media_volum": 47, "folder": [47, 48], "switch": [47, 48], "seed_pgdata_prod": 47, "nocaptur": 47, "stdout": 47, "worth": 47, "_log": 47, "pdb": 47, "remot": 47, "remote_pdb": 47, "set_trac": 47, "breakpoint": 47, "remotepdb": 47, "session": 47, "41653": 47, "netcat": 47, "nc": 47, "machin": 48, "skip": 48, "virtualenv": 48, "conda": 48, "succe": 48, "forg": 48, "crfsuit": 48, "macport": 48, "graphviz": 48, "pyenv": 48, "although": 48, "easiest": 48, "pollut": 48, "easier": 48, "postgresql94": 48, "opt": 48, "defaultdb": 48, "chown": 48, "initdb": 48, "stop": 48, "alias": 48, "postactiv": 48, "pg_start": 48, "pg_ctl": 48, "pg_stop": 48, "launchag": 48, "whoami": 48, "postgis2": 48, "becom": 48, "remaind": 48, "maintain": 48, "compil": 48, "gcc": 48, "clang": 48, "cmake": 48, "openssl": 48, "dopenssl_root_dir": 48, "conf": 48, "uncom": [48, 49], "shared_preload_librari": 48, "config_fil": 48, "virtualenvwrapp": 48, "workon": 48, "cc": 48, "cp": 48, "favorit": 48, "editor": 48, "plan_purchas": 48, "business_edit": 48, "business_edition_fre": 48, "me": 48, "consum": 48, "directli": 48, "deadbeef": 48, "hard": 48, "statement": 48, "encapsul": 48, "stand": 48, "alon": 48, "foreground": 48, "seem": 48, "lokalise2": 49, "get_python_transl": 49, "get_angular_transl": 49, "usemissingtranslationhandlerlog": 49, "untransl": 49, "lokal": 49, "tl": 49, "dr": 49, "english": 49, "littl": 49, "care": 49, "held": 49, "languag": 49, "mo": 49, "suppli": 49, "sniff": 49, "accept": 49, "swap": 49, "dom": 49, "wherev": 49, "wrinkl": 49, "plural": 49, "flow": 49, "visibl": 49, "smooth": 49, "nice": 49, "speaker": 49, "screenshot": 49, "clarifi": 49, "phrase": 49, "placehold": 49, "fairli": 49, "straightforward": 49, "profession": 49, "mostli": 49, "visual": 49, "ok": 49, "french": 49, "german": 49, "wordi": 49, "rel": 49, "element": 49, "expand": 49, "oddli": 49, "err": 49, "clever": 49, "aim": 49, "compet": 49, "h2": 49, "include_shared_taxlot": 49, "include_shar": 49}, "objects": {"config": [[18, 0, 0, "-", "template_context"], [18, 0, 0, "-", "tests"], [18, 0, 0, "-", "utils"], [18, 0, 0, "-", "views"], [18, 0, 0, "-", "wsgi"]], "config.template_context": [[18, 1, 1, "", "sentry_js"], [18, 1, 1, "", "session_key"]], "config.utils": [[18, 1, 1, "", "de_camel_case"]], "config.views": [[18, 1, 1, "", "robots_txt"]], "": [[19, 0, 0, "-", "seed"]], "seed": [[22, 0, 0, "-", "data_importer"], [19, 0, 0, "-", "decorators"], [24, 0, 0, "-", "landing"], [27, 0, 0, "-", "lib"], [30, 0, 0, "-", "management"], [34, 0, 0, "-", "models"], [35, 0, 0, "-", "public"], [19, 0, 0, "-", "search"], [36, 0, 0, "-", "serializers"], [19, 0, 0, "-", "tasks"], [38, 0, 0, "-", "test_helpers"], [19, 0, 0, "-", "token_generators"], [19, 0, 0, "-", "utils"], [45, 0, 0, "-", "views"]], "seed.data_importer": [[22, 0, 0, "-", "managers"], [22, 0, 0, "-", "utils"]], "seed.data_importer.managers": [[22, 2, 1, "", "NotDeletedManager"]], "seed.data_importer.managers.NotDeletedManager": [[22, 3, 1, "", "get_all"], [22, 3, 1, "", "get_queryset"], [22, 4, 1, "", "use_for_related_fields"]], "seed.data_importer.utils": [[22, 1, 1, "", "kbtu_thermal_conversion_factors"], [22, 1, 1, "", "usage_point_id"]], "seed.decorators": [[19, 4, 1, "", "DRFEndpointMixin"], [19, 1, 1, "", "ajax_request"], [19, 1, 1, "", "ajax_request_class"], [19, 1, 1, "", "decorator_to_mixin"], [19, 1, 1, "", "get_prog_key"], [19, 1, 1, "", "lock_and_track"], [19, 1, 1, "", "require_organization_id"], [19, 1, 1, "", "require_organization_id_class"], [19, 1, 1, "", "require_organization_membership"]], "seed.landing": [[24, 0, 0, "-", "forms"], [25, 0, 0, "-", "management"], [24, 0, 0, "-", "models"], [24, 0, 0, "-", "tests"], [24, 0, 0, "-", "urls"], [24, 0, 0, "-", "views"]], "seed.landing.forms": [[24, 2, 1, "", "CustomCreateUserForm"], [24, 2, 1, "", "LoginForm"]], "seed.landing.forms.CustomCreateUserForm": [[24, 2, 1, "", "Meta"], [24, 4, 1, "", "base_fields"], [24, 4, 1, "", "declared_fields"], [24, 5, 1, "", "media"]], "seed.landing.forms.CustomCreateUserForm.Meta": [[24, 4, 1, "", "fields"], [24, 4, 1, "", "model"], [24, 4, 1, "", "widgets"]], "seed.landing.forms.LoginForm": [[24, 4, 1, "", "base_fields"], [24, 4, 1, "", "declared_fields"], [24, 5, 1, "", "media"]], "seed.landing.management": [[26, 0, 0, "-", "commands"]], "seed.landing.models": [[24, 2, 1, "", "SEEDUser"]], "seed.landing.models.SEEDUser": [[24, 6, 1, "", "DoesNotExist"], [24, 6, 1, "", "MultipleObjectsReturned"], [24, 4, 1, "", "REQUIRED_FIELDS"], [24, 4, 1, "", "USERNAME_FIELD"], [24, 4, 1, "", "analysis_set"], [24, 4, 1, "", "api_key"], [24, 4, 1, "", "columnmapping_set"], [24, 4, 1, "", "cycle_set"], [24, 4, 1, "", "date_joined"], [24, 3, 1, "", "deactivate_user"], [24, 4, 1, "", "default_building_detail_custom_columns"], [24, 4, 1, "", "default_custom_columns"], [24, 4, 1, "", "default_organization"], [24, 4, 1, "", "default_organization_id"], [24, 4, 1, "", "email"], [24, 3, 1, "", "email_user"], [24, 4, 1, "", "first_name"], [24, 3, 1, "", "generate_key"], [24, 3, 1, "", "get_absolute_url"], [24, 3, 1, "", "get_full_name"], [24, 3, 1, "", "get_next_by_date_joined"], [24, 3, 1, "", "get_previous_by_date_joined"], [24, 3, 1, "", "get_short_name"], [24, 4, 1, "", "greenassessmentpropertyauditlog_set"], [24, 4, 1, "", "groups"], [24, 4, 1, "", "id"], [24, 4, 1, "", "importrecord_set"], [24, 4, 1, "", "is_staff"], [24, 4, 1, "", "last_name"], [24, 4, 1, "", "logentry_set"], [24, 4, 1, "", "modified_import_records"], [24, 4, 1, "", "notes"], [24, 4, 1, "", "oauth2_provider_accesstoken"], [24, 4, 1, "", "oauth2_provider_application"], [24, 4, 1, "", "oauth2_provider_grant"], [24, 4, 1, "", "oauth2_provider_refreshtoken"], [24, 4, 1, "", "objects"], [24, 4, 1, "", "organizationuser_set"], [24, 4, 1, "", "orgs"], [24, 4, 1, "", "postofficeemail_set"], [24, 4, 1, "", "postofficeemailtemplate_set"], [24, 3, 1, "", "process_header_request"], [24, 3, 1, "", "save"], [24, 4, 1, "", "show_shared_buildings"], [24, 4, 1, "", "user_permissions"], [24, 4, 1, "", "username"]], "seed.landing.tests": [[24, 2, 1, "", "UserLoginTest"]], "seed.landing.tests.UserLoginTest": [[24, 3, 1, "", "setUp"], [24, 3, 1, "", "test_simple_login"]], "seed.landing.views": [[24, 1, 1, "", "account_activation_sent"], [24, 1, 1, "", "activate"], [24, 1, 1, "", "create_account"], [24, 1, 1, "", "landing_page"], [24, 1, 1, "", "password_reset"], [24, 1, 1, "", "password_reset_complete"], [24, 1, 1, "", "password_reset_confirm"], [24, 1, 1, "", "password_reset_done"], [24, 1, 1, "", "password_set"], [24, 1, 1, "", "signup"]], "seed.lib": [[28, 0, 0, "-", "mappings"], [29, 0, 0, "-", "merging"]], "seed.lib.mappings": [[28, 0, 0, "-", "mapper"], [28, 0, 0, "-", "mapping_columns"]], "seed.lib.mappings.mapper": [[28, 1, 1, "", "create_column_regexes"], [28, 1, 1, "", "get_pm_mapping"]], "seed.lib.mappings.mapping_columns": [[28, 2, 1, "", "MappingColumns"], [28, 1, 1, "", "sort_duplicates"]], "seed.lib.mappings.mapping_columns.MappingColumns": [[28, 3, 1, "", "add_mappings"], [28, 3, 1, "", "apply_threshold"], [28, 5, 1, "", "duplicates"], [28, 5, 1, "", "final_mappings"], [28, 3, 1, "", "first_suggested_mapping"], [28, 3, 1, "", "resolve_duplicate"], [28, 3, 1, "", "set_initial_mapping_cmp"]], "seed.lib.merging": [[29, 0, 0, "-", "merging"]], "seed.lib.merging.merging": [[29, 1, 1, "", "get_attrs_with_mapping"], [29, 1, 1, "", "get_propertystate_attrs"], [29, 1, 1, "", "get_state_attrs"], [29, 1, 1, "", "get_state_to_state_tuple"], [29, 1, 1, "", "get_taxlotstate_attrs"], [29, 1, 1, "", "merge_state"]], "seed.models": [[34, 0, 0, "-", "auditlog"], [34, 0, 0, "-", "columns"], [34, 0, 0, "-", "cycles"], [20, 0, 0, "-", "data_quality"], [34, 0, 0, "-", "models"], [34, 0, 0, "-", "properties"], [34, 0, 0, "-", "tax_lots"]], "seed.models.columns": [[34, 2, 1, "", "Column"], [34, 6, 1, "", "ColumnCastError"], [34, 1, 1, "", "validate_model"]], "seed.models.columns.Column": [[34, 4, 1, "", "COLUMN_EXCLUDE_FIELDS"], [34, 4, 1, "", "COLUMN_MERGE_FAVOR_EXISTING"], [34, 4, 1, "", "COLUMN_MERGE_FAVOR_NEW"], [34, 4, 1, "", "COLUMN_MERGE_PROTECTION"], [34, 4, 1, "", "DATABASE_COLUMNS"], [34, 4, 1, "", "DATA_TYPE_PARSERS"], [34, 6, 1, "", "DoesNotExist"], [34, 4, 1, "", "EXCLUDED_COLUMN_RETURN_FIELDS"], [34, 4, 1, "", "EXCLUDED_MAPPING_FIELDS"], [34, 4, 1, "", "EXCLUDED_RENAME_FROM_FIELDS"], [34, 4, 1, "", "EXCLUDED_RENAME_TO_FIELDS"], [34, 4, 1, "", "INTERNAL_TYPE_TO_DATA_TYPE"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "PINNED_COLUMNS"], [34, 4, 1, "", "QUANTITY_UNIT_COLUMNS"], [34, 4, 1, "", "SHARED_FIELD_TYPES"], [34, 4, 1, "", "SHARED_NONE"], [34, 4, 1, "", "SHARED_PUBLIC"], [34, 4, 1, "", "UNMAPPABLE_PROPERTY_FIELDS"], [34, 4, 1, "", "UNMAPPABLE_TAXLOT_FIELDS"], [34, 4, 1, "", "account_name_column"], [34, 4, 1, "", "actual_emission_column"], [34, 4, 1, "", "actual_energy_column"], [34, 4, 1, "", "benchmark_id_column"], [34, 3, 1, "", "cast"], [34, 3, 1, "", "cast_column_value"], [34, 3, 1, "", "clean"], [34, 4, 1, "", "column_description"], [34, 4, 1, "", "column_list_profiles"], [34, 4, 1, "", "column_name"], [34, 4, 1, "", "columnlistprofilecolumn_set"], [34, 4, 1, "", "comstock_mapping"], [34, 4, 1, "", "contact_email_column"], [34, 4, 1, "", "contact_name_column"], [34, 3, 1, "", "create_mappings"], [34, 3, 1, "", "create_mappings_from_file"], [34, 4, 1, "", "created"], [34, 4, 1, "", "data_admin_account_name_column"], [34, 4, 1, "", "data_admin_email_column"], [34, 4, 1, "", "data_admin_name_column"], [34, 4, 1, "", "data_type"], [34, 4, 1, "", "dataviewparameter_set"], [34, 3, 1, "", "delete_all"], [34, 4, 1, "", "derived_column"], [34, 4, 1, "", "derived_column_id"], [34, 4, 1, "", "derivedcolumn_set"], [34, 4, 1, "", "derivedcolumnparameter_set"], [34, 4, 1, "", "display_name"], [34, 4, 1, "", "geocoding_order"], [34, 3, 1, "", "get_merge_protection_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_modified"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_modified"], [34, 3, 1, "", "get_shared_field_type_display"], [34, 4, 1, "", "goal_area_columns"], [34, 4, 1, "", "goal_eui_column1s"], [34, 4, 1, "", "goal_eui_column2s"], [34, 4, 1, "", "goal_eui_column3s"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_file"], [34, 4, 1, "", "import_file_id"], [34, 4, 1, "", "is_extra_data"], [34, 4, 1, "", "is_matching_criteria"], [34, 4, 1, "", "mapped_mappings"], [34, 4, 1, "", "merge_protection"], [34, 4, 1, "", "modified"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "raw_mappings"], [34, 4, 1, "", "recognize_empty"], [34, 3, 1, "", "rename_column"], [34, 3, 1, "", "retrieve_all"], [34, 3, 1, "", "retrieve_all_by_tuple"], [34, 3, 1, "", "retrieve_db_field_name_for_hash_comparison"], [34, 3, 1, "", "retrieve_db_field_table_and_names_from_db_tables"], [34, 3, 1, "", "retrieve_db_fields"], [34, 3, 1, "", "retrieve_db_fields_from_db_tables"], [34, 3, 1, "", "retrieve_db_types"], [34, 3, 1, "", "retrieve_mapping_columns"], [34, 3, 1, "", "retrieve_priorities"], [34, 4, 1, "", "salesforce_column"], [34, 3, 1, "", "save"], [34, 3, 1, "", "save_column_names"], [34, 4, 1, "", "shared_field_type"], [34, 4, 1, "", "table_name"], [34, 4, 1, "", "target_emission_column"], [34, 4, 1, "", "target_energy_column"], [34, 4, 1, "", "unit"], [34, 4, 1, "", "unit_id"], [34, 4, 1, "", "units_pint"], [34, 4, 1, "", "x_axis_columns"]], "seed.models.cycles": [[34, 2, 1, "", "Cycle"]], "seed.models.cycles.Cycle": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "analysispropertyview_set"], [34, 4, 1, "", "created"], [34, 4, 1, "", "cycles"], [34, 4, 1, "", "dataview_set"], [34, 4, 1, "", "end"], [34, 4, 1, "", "event_set"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_end"], [34, 3, 1, "", "get_next_by_start"], [34, 3, 1, "", "get_or_create_default"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_end"], [34, 3, 1, "", "get_previous_by_start"], [34, 4, 1, "", "goal_baseline_cycles"], [34, 4, 1, "", "goal_current_cycles"], [34, 4, 1, "", "id"], [34, 4, 1, "", "importfile_set"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "propertyview_set"], [34, 4, 1, "", "start"], [34, 4, 1, "", "taxlotproperty_set"], [34, 4, 1, "", "taxlotview_set"], [34, 4, 1, "", "user"], [34, 4, 1, "", "user_id"]], "seed.models.data_quality": [[20, 6, 1, "", "ComparisonError"], [20, 2, 1, "", "DataQualityCheck"], [20, 6, 1, "", "DataQualityTypeCastError"], [20, 2, 1, "", "Rule"], [20, 6, 1, "", "UnitMismatchError"], [20, 1, 1, "", "format_pint_violation"]], "seed.models.data_quality.DataQualityCheck": [[20, 6, 1, "", "DoesNotExist"], [20, 6, 1, "", "MultipleObjectsReturned"], [20, 4, 1, "", "REQUIRED_FIELDS"], [20, 3, 1, "", "add_invalid_geometry_entry_provided"], [20, 3, 1, "", "add_result_comparison_error"], [20, 3, 1, "", "add_result_dimension_error"], [20, 3, 1, "", "add_result_is_null"], [20, 3, 1, "", "add_result_max_error"], [20, 3, 1, "", "add_result_min_error"], [20, 3, 1, "", "add_result_missing_and_none"], [20, 3, 1, "", "add_result_missing_req"], [20, 3, 1, "", "add_result_string_error"], [20, 3, 1, "", "add_result_type_error"], [20, 3, 1, "", "add_rule"], [20, 3, 1, "", "add_rule_if_new"], [20, 3, 1, "", "cache_key"], [20, 3, 1, "", "check_data"], [20, 3, 1, "", "get_fieldnames"], [20, 4, 1, "", "id"], [20, 3, 1, "", "initialize_cache"], [20, 3, 1, "", "initialize_rules"], [20, 4, 1, "", "name"], [20, 4, 1, "", "objects"], [20, 4, 1, "", "organization"], [20, 4, 1, "", "organization_id"], [20, 3, 1, "", "remove_all_rules"], [20, 3, 1, "", "remove_status_label"], [20, 3, 1, "", "reset_all_rules"], [20, 3, 1, "", "reset_default_rules"], [20, 3, 1, "", "reset_results"], [20, 3, 1, "", "retrieve"], [20, 3, 1, "", "retrieve_result_by_address"], [20, 3, 1, "", "retrieve_result_by_tax_lot_id"], [20, 4, 1, "", "rules"], [20, 3, 1, "", "save_to_cache"], [20, 3, 1, "", "update_status_label"]], "seed.models.data_quality.Rule": [[20, 4, 1, "", "DATA_TYPES"], [20, 4, 1, "", "DEFAULT_RULES"], [20, 6, 1, "", "DoesNotExist"], [20, 6, 1, "", "MultipleObjectsReturned"], [20, 4, 1, "", "RULE_EXCLUDE"], [20, 4, 1, "", "RULE_INCLUDE"], [20, 4, 1, "", "RULE_NOT_NULL"], [20, 4, 1, "", "RULE_RANGE"], [20, 4, 1, "", "RULE_REQUIRED"], [20, 4, 1, "", "RULE_TYPE"], [20, 4, 1, "", "RULE_TYPE_CUSTOM"], [20, 4, 1, "", "RULE_TYPE_DEFAULT"], [20, 4, 1, "", "SEVERITY"], [20, 4, 1, "", "SEVERITY_ERROR"], [20, 4, 1, "", "SEVERITY_VALID"], [20, 4, 1, "", "SEVERITY_WARNING"], [20, 4, 1, "", "TYPE_AREA"], [20, 4, 1, "", "TYPE_DATE"], [20, 4, 1, "", "TYPE_EUI"], [20, 4, 1, "", "TYPE_NUMBER"], [20, 4, 1, "", "TYPE_STRING"], [20, 4, 1, "", "TYPE_YEAR"], [20, 4, 1, "", "condition"], [20, 4, 1, "", "data_quality_check"], [20, 4, 1, "", "data_quality_check_id"], [20, 4, 1, "", "data_type"], [20, 4, 1, "", "description"], [20, 4, 1, "", "enabled"], [20, 4, 1, "", "field"], [20, 4, 1, "", "for_derived_column"], [20, 3, 1, "", "format_strings"], [20, 3, 1, "", "get_data_type_display"], [20, 3, 1, "", "get_rule_type_display"], [20, 3, 1, "", "get_severity_display"], [20, 4, 1, "", "id"], [20, 4, 1, "", "max"], [20, 3, 1, "", "maximum_valid"], [20, 4, 1, "", "min"], [20, 3, 1, "", "minimum_valid"], [20, 4, 1, "", "name"], [20, 4, 1, "", "not_null"], [20, 4, 1, "", "objects"], [20, 4, 1, "", "required"], [20, 4, 1, "", "rule_type"], [20, 4, 1, "", "severity"], [20, 4, 1, "", "status_label"], [20, 4, 1, "", "status_label_id"], [20, 3, 1, "", "str_to_data_type"], [20, 4, 1, "", "table_name"], [20, 4, 1, "", "text_match"], [20, 4, 1, "", "units"], [20, 3, 1, "", "valid_text"]], "seed.models.models": [[34, 2, 1, "", "StatusLabel"], [34, 2, 1, "", "Unit"]], "seed.models.models.StatusLabel": [[34, 4, 1, "", "BLUE_CHOICE"], [34, 4, 1, "", "COLOR_CHOICES"], [34, 4, 1, "", "DEFAULT_LABELS"], [34, 6, 1, "", "DoesNotExist"], [34, 4, 1, "", "GRAY_CHOICE"], [34, 4, 1, "", "GREEN_CHOICE"], [34, 4, 1, "", "LIGHT_BLUE_CHOICE"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "ORANGE_CHOICE"], [34, 4, 1, "", "RED_CHOICE"], [34, 4, 1, "", "WHITE_CHOICE"], [34, 4, 1, "", "and_filter_groups"], [34, 4, 1, "", "color"], [34, 4, 1, "", "compliance_label"], [34, 4, 1, "", "exclude_filter_groups"], [34, 3, 1, "", "get_color_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_modified"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_modified"], [34, 4, 1, "", "id"], [34, 4, 1, "", "indication_label"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "or_filter_groups"], [34, 4, 1, "", "propertyview_set"], [34, 4, 1, "", "rule_set"], [34, 4, 1, "", "show_in_list"], [34, 4, 1, "", "super_organization"], [34, 4, 1, "", "super_organization_id"], [34, 4, 1, "", "taxlotview_set"], [34, 3, 1, "", "to_dict"], [34, 4, 1, "", "violation_label"]], "seed.models.models.Unit": [[34, 4, 1, "", "DATE"], [34, 4, 1, "", "DATETIME"], [34, 4, 1, "", "DECIMAL"], [34, 6, 1, "", "DoesNotExist"], [34, 4, 1, "", "FLOAT"], [34, 4, 1, "", "INTEGER"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "STRING"], [34, 4, 1, "", "UNIT_TYPES"], [34, 4, 1, "", "column_set"], [34, 3, 1, "", "get_unit_type_display"], [34, 4, 1, "", "id"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "unit_name"], [34, 4, 1, "", "unit_type"]], "seed.models.properties": [[34, 2, 1, "", "Property"], [34, 2, 1, "", "PropertyAuditLog"], [34, 2, 1, "", "PropertyState"], [34, 2, 1, "", "PropertyView"], [34, 1, 1, "", "post_save_property"], [34, 1, 1, "", "post_save_property_state"], [34, 1, 1, "", "post_save_property_view"], [34, 1, 1, "", "pre_delete_state"], [34, 1, 1, "", "set_default_access_level_instance"], [34, 1, 1, "", "sync_latitude_longitude_and_long_lat"]], "seed.models.properties.Property": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "access_level_instance"], [34, 4, 1, "", "access_level_instance_id"], [34, 4, 1, "", "analysispropertyview_set"], [34, 3, 1, "", "copy_meters"], [34, 4, 1, "", "created"], [34, 4, 1, "", "data_loggers"], [34, 4, 1, "", "events"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 4, 1, "", "goalnote_set"], [34, 4, 1, "", "historical_note"], [34, 4, 1, "", "id"], [34, 4, 1, "", "inventory_documents"], [34, 4, 1, "", "meters"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "parent_property"], [34, 4, 1, "", "parent_property_id"], [34, 4, 1, "", "property_set"], [34, 4, 1, "", "updated"], [34, 4, 1, "", "views"]], "seed.models.properties.PropertyAuditLog": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "created"], [34, 4, 1, "", "description"], [34, 3, 1, "", "get_record_type_display"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_filename"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "parent1"], [34, 4, 1, "", "parent1_id"], [34, 4, 1, "", "parent2"], [34, 4, 1, "", "parent2_id"], [34, 4, 1, "", "parent_state1"], [34, 4, 1, "", "parent_state1_id"], [34, 4, 1, "", "parent_state2"], [34, 4, 1, "", "parent_state2_id"], [34, 4, 1, "", "propertyauditlog_parent1"], [34, 4, 1, "", "propertyauditlog_parent2"], [34, 4, 1, "", "record_type"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 4, 1, "", "view"], [34, 4, 1, "", "view_id"]], "seed.models.properties.PropertyState": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "address_line_1"], [34, 4, 1, "", "address_line_2"], [34, 4, 1, "", "analysispropertyview"], [34, 4, 1, "", "audit_template_building_id"], [34, 4, 1, "", "bounding_box"], [34, 4, 1, "", "building_certification"], [34, 4, 1, "", "building_count"], [34, 4, 1, "", "building_files"], [34, 4, 1, "", "centroid"], [34, 4, 1, "", "city"], [34, 3, 1, "", "clean"], [34, 4, 1, "", "conditioned_floor_area"], [34, 4, 1, "", "conditioned_floor_area_orig"], [34, 3, 1, "", "coparent"], [34, 4, 1, "", "created"], [34, 4, 1, "", "custom_id_1"], [34, 4, 1, "", "data_state"], [34, 4, 1, "", "egrid_subregion_code"], [34, 4, 1, "", "energy_alerts"], [34, 4, 1, "", "energy_score"], [34, 4, 1, "", "extra_data"], [34, 4, 1, "", "generation_date"], [34, 4, 1, "", "geocoding_confidence"], [34, 3, 1, "", "get_data_state_display"], [34, 3, 1, "", "get_merge_state_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 3, 1, "", "get_source_type_display"], [34, 4, 1, "", "gross_floor_area"], [34, 4, 1, "", "gross_floor_area_orig"], [34, 4, 1, "", "hash_object"], [34, 3, 1, "", "history"], [34, 4, 1, "", "home_energy_score_id"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_file"], [34, 4, 1, "", "import_file_id"], [34, 4, 1, "", "jurisdiction_property_id"], [34, 4, 1, "", "latitude"], [34, 4, 1, "", "long_lat"], [34, 4, 1, "", "longitude"], [34, 4, 1, "", "lot_number"], [34, 4, 1, "", "measure_set"], [34, 4, 1, "", "measures"], [34, 3, 1, "", "merge_relationships"], [34, 4, 1, "", "merge_state"], [34, 4, 1, "", "normalized_address"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "occupied_floor_area"], [34, 4, 1, "", "occupied_floor_area_orig"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "owner"], [34, 4, 1, "", "owner_address"], [34, 4, 1, "", "owner_city_state"], [34, 4, 1, "", "owner_email"], [34, 4, 1, "", "owner_postal_code"], [34, 4, 1, "", "owner_telephone"], [34, 4, 1, "", "parent_state1"], [34, 4, 1, "", "parent_state2"], [34, 4, 1, "", "pm_parent_property_id"], [34, 4, 1, "", "pm_property_id"], [34, 4, 1, "", "postal_code"], [34, 3, 1, "", "promote"], [34, 4, 1, "", "property_footprint"], [34, 4, 1, "", "property_name"], [34, 4, 1, "", "property_notes"], [34, 4, 1, "", "property_timezone"], [34, 4, 1, "", "property_type"], [34, 4, 1, "", "propertyauditlog_state"], [34, 4, 1, "", "propertymeasure_set"], [34, 4, 1, "", "propertyview_set"], [34, 4, 1, "", "raw_access_level_instance"], [34, 4, 1, "", "raw_access_level_instance_error"], [34, 4, 1, "", "raw_access_level_instance_id"], [34, 4, 1, "", "recent_sale_date"], [34, 4, 1, "", "release_date"], [34, 3, 1, "", "save"], [34, 4, 1, "", "scenarios"], [34, 4, 1, "", "simulation"], [34, 4, 1, "", "site_eui"], [34, 4, 1, "", "site_eui_modeled"], [34, 4, 1, "", "site_eui_modeled_orig"], [34, 4, 1, "", "site_eui_orig"], [34, 4, 1, "", "site_eui_weather_normalized"], [34, 4, 1, "", "site_eui_weather_normalized_orig"], [34, 4, 1, "", "source_eui"], [34, 4, 1, "", "source_eui_modeled"], [34, 4, 1, "", "source_eui_modeled_orig"], [34, 4, 1, "", "source_eui_orig"], [34, 4, 1, "", "source_eui_weather_normalized"], [34, 4, 1, "", "source_eui_weather_normalized_orig"], [34, 4, 1, "", "source_type"], [34, 4, 1, "", "space_alerts"], [34, 4, 1, "", "state"], [34, 3, 1, "", "to_dict"], [34, 4, 1, "", "total_ghg_emissions"], [34, 4, 1, "", "total_ghg_emissions_intensity"], [34, 4, 1, "", "total_marginal_ghg_emissions"], [34, 4, 1, "", "total_marginal_ghg_emissions_intensity"], [34, 4, 1, "", "ubid"], [34, 4, 1, "", "ubidmodel_set"], [34, 4, 1, "", "updated"], [34, 4, 1, "", "use_description"], [34, 4, 1, "", "year_built"], [34, 4, 1, "", "year_ending"]], "seed.models.properties.PropertyView": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "cycle"], [34, 4, 1, "", "cycle_id"], [34, 4, 1, "", "gapauditlog_view"], [34, 4, 1, "", "greenassessmentproperty_set"], [34, 4, 1, "", "id"], [34, 5, 1, "", "import_filename"], [34, 3, 1, "", "initialize_audit_logs"], [34, 4, 1, "", "labels"], [34, 4, 1, "", "notes"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "property"], [34, 4, 1, "", "property_id"], [34, 4, 1, "", "propertyauditlog_view"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 3, 1, "", "tax_lot_states"], [34, 3, 1, "", "tax_lot_views"], [34, 4, 1, "", "taxlotproperty_set"]], "seed.models.tax_lots": [[34, 2, 1, "", "TaxLot"], [34, 2, 1, "", "TaxLotAuditLog"], [34, 2, 1, "", "TaxLotState"], [34, 2, 1, "", "TaxLotView"], [34, 1, 1, "", "post_save_taxlot_state"], [34, 1, 1, "", "post_save_taxlot_view"], [34, 1, 1, "", "set_default_access_level_instance"], [34, 1, 1, "", "sync_latitude_longitude_and_long_lat"]], "seed.models.tax_lots.TaxLot": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "access_level_instance"], [34, 4, 1, "", "access_level_instance_id"], [34, 4, 1, "", "created"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 4, 1, "", "id"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "updated"], [34, 4, 1, "", "views"]], "seed.models.tax_lots.TaxLotAuditLog": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "created"], [34, 4, 1, "", "description"], [34, 3, 1, "", "get_record_type_display"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_filename"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "parent1"], [34, 4, 1, "", "parent1_id"], [34, 4, 1, "", "parent2"], [34, 4, 1, "", "parent2_id"], [34, 4, 1, "", "parent_state1"], [34, 4, 1, "", "parent_state1_id"], [34, 4, 1, "", "parent_state2"], [34, 4, 1, "", "parent_state2_id"], [34, 4, 1, "", "record_type"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 4, 1, "", "taxlotauditlog_parent1"], [34, 4, 1, "", "taxlotauditlog_parent2"], [34, 4, 1, "", "view"], [34, 4, 1, "", "view_id"]], "seed.models.tax_lots.TaxLotState": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "address_line_1"], [34, 4, 1, "", "address_line_2"], [34, 4, 1, "", "block_number"], [34, 4, 1, "", "bounding_box"], [34, 4, 1, "", "centroid"], [34, 4, 1, "", "city"], [34, 3, 1, "", "coparent"], [34, 4, 1, "", "created"], [34, 4, 1, "", "custom_id_1"], [34, 4, 1, "", "data_state"], [34, 4, 1, "", "district"], [34, 4, 1, "", "extra_data"], [34, 4, 1, "", "geocoding_confidence"], [34, 3, 1, "", "get_data_state_display"], [34, 3, 1, "", "get_merge_state_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 4, 1, "", "hash_object"], [34, 3, 1, "", "history"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_file"], [34, 4, 1, "", "import_file_id"], [34, 4, 1, "", "jurisdiction_tax_lot_id"], [34, 4, 1, "", "latitude"], [34, 4, 1, "", "long_lat"], [34, 4, 1, "", "longitude"], [34, 3, 1, "", "merge_relationships"], [34, 4, 1, "", "merge_state"], [34, 4, 1, "", "normalized_address"], [34, 4, 1, "", "number_properties"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "postal_code"], [34, 3, 1, "", "promote"], [34, 4, 1, "", "raw_access_level_instance"], [34, 4, 1, "", "raw_access_level_instance_error"], [34, 4, 1, "", "raw_access_level_instance_id"], [34, 3, 1, "", "save"], [34, 4, 1, "", "state"], [34, 4, 1, "", "taxlot_footprint"], [34, 4, 1, "", "taxlotauditlog_parent_state1"], [34, 4, 1, "", "taxlotauditlog_parent_state2"], [34, 4, 1, "", "taxlotauditlog_state"], [34, 4, 1, "", "taxlotview_set"], [34, 3, 1, "", "to_dict"], [34, 4, 1, "", "ubid"], [34, 4, 1, "", "ubidmodel_set"], [34, 4, 1, "", "updated"]], "seed.models.tax_lots.TaxLotView": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "cycle"], [34, 4, 1, "", "cycle_id"], [34, 4, 1, "", "id"], [34, 5, 1, "", "import_filename"], [34, 3, 1, "", "initialize_audit_logs"], [34, 4, 1, "", "labels"], [34, 4, 1, "", "notes"], [34, 4, 1, "", "objects"], [34, 3, 1, "", "property_states"], [34, 3, 1, "", "property_views"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 4, 1, "", "taxlot"], [34, 4, 1, "", "taxlot_id"], [34, 4, 1, "", "taxlotauditlog_view"], [34, 4, 1, "", "taxlotproperty_set"]], "seed.search": [[19, 1, 1, "", "build_shared_buildings_orgs"], [19, 1, 1, "", "create_inventory_queryset"], [19, 1, 1, "", "get_inventory_fieldnames"], [19, 1, 1, "", "get_orgs_w_public_fields"], [19, 1, 1, "", "inventory_search_filter_sort"], [19, 1, 1, "", "parse_body"], [19, 1, 1, "", "process_search_params"], [19, 1, 1, "", "search_inventory"], [19, 1, 1, "", "search_properties"], [19, 1, 1, "", "search_taxlots"]], "seed.serializers": [[36, 0, 0, "-", "celery"], [36, 0, 0, "-", "labels"]], "seed.serializers.celery": [[36, 2, 1, "", "CeleryDatetimeSerializer"]], "seed.serializers.celery.CeleryDatetimeSerializer": [[36, 3, 1, "", "default"], [36, 3, 1, "", "seed_decoder"], [36, 3, 1, "", "seed_dumps"], [36, 3, 1, "", "seed_loads"]], "seed.serializers.labels": [[36, 2, 1, "", "LabelSerializer"]], "seed.serializers.labels.LabelSerializer": [[36, 2, 1, "", "Meta"], [36, 3, 1, "", "get_is_applied"], [36, 3, 1, "", "to_representation"]], "seed.serializers.labels.LabelSerializer.Meta": [[36, 4, 1, "", "extra_kwargs"], [36, 4, 1, "", "fields"], [36, 4, 1, "", "model"]], "seed.tasks": [[19, 1, 1, "", "delete_organization"], [19, 1, 1, "", "invite_new_user_to_seed"], [19, 1, 1, "", "send_salesforce_error_log"]], "seed.templatetags": [[37, 0, 0, "-", "breadcrumbs"]], "seed.templatetags.breadcrumbs": [[37, 2, 1, "", "BreadcrumbNode"], [37, 2, 1, "", "UrlBreadcrumbNode"], [37, 1, 1, "", "breadcrumb"], [37, 1, 1, "", "breadcrumb_root"], [37, 1, 1, "", "breadcrumb_url"], [37, 1, 1, "", "breadcrumb_url_root"], [37, 1, 1, "", "create_crumb"], [37, 1, 1, "", "create_crumb_first"]], "seed.templatetags.breadcrumbs.BreadcrumbNode": [[37, 3, 1, "", "render"]], "seed.templatetags.breadcrumbs.UrlBreadcrumbNode": [[37, 3, 1, "", "render"]], "seed.test_helpers.factory": [[39, 0, 0, "-", "helpers"]], "seed.test_helpers.factory.helpers": [[39, 2, 1, "", "DjangoFunctionalFactory"]], "seed.test_helpers.factory.helpers.DjangoFunctionalFactory": [[39, 3, 1, "", "invalid_test_cc_number"], [39, 3, 1, "", "rand_bool"], [39, 3, 1, "", "rand_city"], [39, 3, 1, "", "rand_city_suffix"], [39, 3, 1, "", "rand_currency"], [39, 3, 1, "", "rand_date"], [39, 3, 1, "", "rand_domain"], [39, 3, 1, "", "rand_email"], [39, 3, 1, "", "rand_float"], [39, 3, 1, "", "rand_int"], [39, 3, 1, "", "rand_name"], [39, 3, 1, "", "rand_phone"], [39, 3, 1, "", "rand_plant_name"], [39, 3, 1, "", "rand_str"], [39, 3, 1, "", "rand_street_address"], [39, 3, 1, "", "rand_street_suffix"], [39, 3, 1, "", "test_cc_number"], [39, 3, 1, "", "valid_test_cc_number"]], "seed.tests": [[41, 0, 0, "-", "test_admin_views"], [41, 0, 0, "-", "test_decorators"], [41, 0, 0, "-", "test_tasks"], [41, 0, 0, "-", "test_views"], [41, 0, 0, "-", "util"]], "seed.tests.test_admin_views": [[41, 2, 1, "", "AdminViewsTest"]], "seed.tests.test_admin_views.AdminViewsTest": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_add_org"], [41, 3, 1, "", "test_add_org_dupe"], [41, 3, 1, "", "test_add_owner_existing_org_to_non_root"], [41, 3, 1, "", "test_add_user_existing_org"], [41, 3, 1, "", "test_add_user_new_org"], [41, 3, 1, "", "test_add_user_no_org"], [41, 3, 1, "", "test_signup_process"], [41, 3, 1, "", "test_signup_process_force_lowercase_email"]], "seed.tests.test_decorators": [[41, 2, 1, "", "ClassDecoratorTests"], [41, 2, 1, "", "RequireOrganizationIDTests"], [41, 2, 1, "", "TestDecorators"], [41, 6, 1, "", "TestError"]], "seed.tests.test_decorators.ClassDecoratorTests": [[41, 3, 1, "", "test_ajax_request_class_dict"], [41, 3, 1, "", "test_ajax_request_class_dict_status_error"], [41, 3, 1, "", "test_ajax_request_class_dict_status_false"], [41, 3, 1, "", "test_ajax_request_class_format_type"], [41, 3, 1, "", "test_require_organization_id_class_no_org_id"], [41, 3, 1, "", "test_require_organization_id_class_org_id"], [41, 3, 1, "", "test_require_organization_id_class_org_id_not_int"]], "seed.tests.test_decorators.RequireOrganizationIDTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_require_organization_id_fail_no_key"], [41, 3, 1, "", "test_require_organization_id_fail_not_numeric"], [41, 3, 1, "", "test_require_organization_id_success_integer"], [41, 3, 1, "", "test_require_organization_id_success_string"]], "seed.tests.test_decorators.TestDecorators": [[41, 4, 1, "", "locked"], [41, 4, 1, "", "pk"], [41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_get_prog_key"], [41, 3, 1, "", "test_increment_cache"], [41, 3, 1, "", "test_locking"], [41, 3, 1, "", "test_locking_w_exception"], [41, 3, 1, "", "test_progress"], [41, 4, 1, "", "unlocked"]], "seed.tests.test_tasks": [[41, 2, 1, "", "TestTasks"]], "seed.tests.test_tasks.TestTasks": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_delete_organization"]], "seed.tests.test_views": [[41, 2, 1, "", "DatasetPermissionsTests"], [41, 2, 1, "", "GetDatasetsViewsTests"], [41, 2, 1, "", "ImportFileViewsTests"], [41, 2, 1, "", "InventoryViewTests"], [41, 2, 1, "", "MainViewTests"], [41, 2, 1, "", "TestMCMViews"]], "seed.tests.test_views.DatasetPermissionsTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_dataset_count"], [41, 3, 1, "", "test_dataset_create"], [41, 3, 1, "", "test_dataset_destroy"], [41, 3, 1, "", "test_dataset_list"], [41, 3, 1, "", "test_dataset_retrieve"], [41, 3, 1, "", "test_dataset_update"]], "seed.tests.test_views.GetDatasetsViewsTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_delete_dataset"], [41, 3, 1, "", "test_get_dataset"], [41, 3, 1, "", "test_get_datasets"], [41, 3, 1, "", "test_get_datasets_count"], [41, 3, 1, "", "test_get_datasets_count_invalid"], [41, 3, 1, "", "test_update_dataset"]], "seed.tests.test_views.ImportFileViewsTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_delete_file"], [41, 3, 1, "", "test_get_import_file"], [41, 3, 1, "", "test_get_matching_and_geocoding_results"]], "seed.tests.test_views.InventoryViewTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_get_cycles"], [41, 3, 1, "", "test_get_properties"], [41, 3, 1, "", "test_get_properties_cycle_id"], [41, 3, 1, "", "test_get_properties_empty_page"], [41, 3, 1, "", "test_get_properties_page_not_an_integer"], [41, 3, 1, "", "test_get_properties_pint_fields"], [41, 3, 1, "", "test_get_properties_profile_id"], [41, 3, 1, "", "test_get_properties_property_extra_data"], [41, 3, 1, "", "test_get_properties_select_all"], [41, 3, 1, "", "test_get_properties_taxlot_extra_data"], [41, 3, 1, "", "test_get_properties_with_taxlots"], [41, 3, 1, "", "test_get_properties_with_taxlots_with_footprints"], [41, 3, 1, "", "test_get_properties_wrong_query_params"], [41, 3, 1, "", "test_get_property"], [41, 3, 1, "", "test_get_property_columns"], [41, 3, 1, "", "test_get_property_multiple_taxlots"], [41, 3, 1, "", "test_get_taxlot"], [41, 3, 1, "", "test_get_taxlot_columns"], [41, 3, 1, "", "test_get_taxlots"], [41, 3, 1, "", "test_get_taxlots_empty_page"], [41, 3, 1, "", "test_get_taxlots_extra_data"], [41, 3, 1, "", "test_get_taxlots_multiple_taxlots"], [41, 3, 1, "", "test_get_taxlots_no_cycle_id"], [41, 3, 1, "", "test_get_taxlots_page_not_an_integer"], [41, 3, 1, "", "test_get_taxlots_profile_id"], [41, 3, 1, "", "test_postoffice"], [41, 3, 1, "", "test_update_pint_fields_with_modified_display_settings"]], "seed.tests.test_views.MainViewTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_home"]], "seed.tests.test_views.TestMCMViews": [[41, 3, 1, "", "assert_expected_mappings"], [41, 4, 1, "", "expected_mappings"], [41, 4, 1, "", "raw_columns_expected"], [41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_create_dataset"], [41, 3, 1, "", "test_get_column_mapping_suggestions"], [41, 3, 1, "", "test_get_column_mapping_suggestions_pm_file"], [41, 3, 1, "", "test_get_column_mapping_suggestions_with_columns"], [41, 3, 1, "", "test_get_raw_column_names"], [41, 3, 1, "", "test_progress"], [41, 3, 1, "", "test_save_column_mappings"], [41, 3, 1, "", "test_save_column_mappings_idempotent"]], "seed.tests.util": [[41, 2, 1, "", "AccessLevelBaseTestCase"], [41, 2, 1, "", "AssertDictSubsetMixin"], [41, 2, 1, "", "DataMappingBaseTestCase"], [41, 2, 1, "", "DeleteModelsTestCase"], [41, 2, 1, "", "FakeClient"], [41, 2, 1, "", "FakeRequest"]], "seed.tests.util.AccessLevelBaseTestCase": [[41, 3, 1, "", "login_as_child_member"], [41, 3, 1, "", "login_as_root_member"], [41, 3, 1, "", "login_as_root_owner"], [41, 3, 1, "", "setUp"]], "seed.tests.util.AssertDictSubsetMixin": [[41, 3, 1, "", "assertDictContainsSubset"]], "seed.tests.util.DataMappingBaseTestCase": [[41, 3, 1, "", "create_import_file"], [41, 3, 1, "", "set_up"]], "seed.tests.util.DeleteModelsTestCase": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "tearDown"]], "seed.tests.util.FakeClient": [[41, 3, 1, "", "get"], [41, 3, 1, "", "post"]], "seed.tests.util.FakeRequest": [[41, 4, 1, "", "GET"], [41, 4, 1, "", "META"], [41, 4, 1, "", "POST"], [41, 4, 1, "", "body"], [41, 4, 1, "", "path"]], "seed.token_generators": [[19, 2, 1, "", "SignupTokenGenerator"]], "seed.token_generators.SignupTokenGenerator": [[19, 3, 1, "", "check_token"], [19, 3, 1, "", "make_token"]], "seed.utils": [[44, 0, 0, "-", "api"], [44, 0, 0, "-", "buildings"], [44, 0, 0, "-", "organizations"], [44, 0, 0, "-", "time"]], "seed.utils.api": [[44, 2, 1, "", "APIBypassCSRFMiddleware"], [44, 2, 1, "", "OrgCreateMixin"], [44, 2, 1, "", "OrgCreateUpdateMixin"], [44, 2, 1, "", "OrgMixin"], [44, 2, 1, "", "OrgQuerySetMixin"], [44, 2, 1, "", "OrgUpdateMixin"], [44, 2, 1, "", "OrgValidateMixin"], [44, 2, 1, "", "OrgValidator"], [44, 2, 1, "", "ProfileIdMixin"], [44, 1, 1, "", "api_endpoint"], [44, 1, 1, "", "api_endpoint_class"], [44, 1, 1, "", "clean_api_regex"], [44, 1, 1, "", "drf_api_endpoint"], [44, 1, 1, "", "format_api_docstring"], [44, 1, 1, "", "get_all_urls"], [44, 1, 1, "", "get_api_endpoints"], [44, 1, 1, "", "get_api_request_user"], [44, 1, 1, "", "get_org_id_from_validator"], [44, 1, 1, "", "rgetattr"]], "seed.utils.api.OrgCreateMixin": [[44, 3, 1, "", "perform_create"]], "seed.utils.api.OrgMixin": [[44, 3, 1, "", "get_organization"], [44, 3, 1, "", "get_parent_org"]], "seed.utils.api.OrgQuerySetMixin": [[44, 3, 1, "", "get_queryset"]], "seed.utils.api.OrgUpdateMixin": [[44, 3, 1, "", "perform_update"]], "seed.utils.api.OrgValidateMixin": [[44, 3, 1, "", "validate"], [44, 3, 1, "", "validate_org"]], "seed.utils.api.OrgValidator": [[44, 4, 1, "", "field"], [44, 4, 1, "", "key"]], "seed.utils.api.ProfileIdMixin": [[44, 3, 1, "", "get_show_columns"]], "seed.utils.buildings": [[44, 1, 1, "", "get_source_type"]], "seed.utils.organizations": [[44, 1, 1, "", "create_organization"], [44, 1, 1, "", "create_suborganization"], [44, 1, 1, "", "default_pm_mappings"]], "seed.utils.time": [[44, 1, 1, "", "convert_datestr"], [44, 1, 1, "", "convert_to_js_timestamp"], [44, 1, 1, "", "parse_datetime"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute", "5": "py:property", "6": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"], "5": ["py", "property", "Python property"], "6": ["py", "exception", "Python exception"]}, "titleterms": {"api": [0, 43, 44, 45, 48], "authent": 0, "payload": 0, "respons": 0, "endpoint": 0, "aw": [1, 6, 11, 13], "setup": [1, 8, 11, 13], "prerequisit": [1, 13, 48], "amazon": 1, "web": [1, 11, 13], "servic": [1, 13], "depend": [1, 13, 48], "python": [1, 5, 13, 48], "javascript": [1, 13, 48], "databas": [1, 5, 13, 46, 48], "configur": [1, 11, 13, 18, 48], "cach": [1, 13], "messag": [1, 13], "broker": [1, 13], "run": [1, 13, 47, 48], "celeri": [1, 11, 13], "background": [1, 13], "task": [1, 13, 19, 41], "worker": [1, 13], "data": [2, 3, 10, 20, 21, 22], "model": [2, 19, 20, 22, 24, 34, 35, 41], "todo": [2, 14], "parent": 2, "children": 2, "match": [2, 14, 15], "manual": 2, "v": 2, "auto": 2, "what": [2, 7, 15], "realli": 2, "happen": 2, "buildingsnapshot": 2, "tabl": [2, 10], "import": [2, 14, 22], "when": [2, 15], "canonicalbuild": 2, "organ": [2, 44], "_source_id": 2, "field": [2, 5], "extra_data": 2, "save": 2, "possibl": 2, "loss": 2, "qualiti": [3, 20], "deploy": [4, 6, 11, 16], "guid": [4, 11], "migrat": [4, 5, 16, 48], "monitor": 4, "sentri": 4, "develop": [5, 8, 9, 13, 16, 47], "resourc": [5, 11], "gener": [5, 13, 19, 34, 49], "note": [5, 15], "pre": 5, "commit": 5, "ruff": 5, "set": [5, 7], "type": 5, "hint": 5, "usag": 5, "check": 5, "django": [5, 13, 48], "ad": 5, "new": 5, "nginx": 5, "angularj": 5, "integr": 5, "templat": [5, 18], "tag": 5, "csrf": 5, "token": [5, 19], "ajax": 5, "request": 5, "rout": 5, "partial": 5, "view": [5, 18, 19, 20, 22, 24, 41, 45], "log": [5, 11], "bede": [5, 21], "complianc": 5, "manag": [5, 11, 22, 25, 26, 30, 31, 32], "column": [5, 34], "reset": 5, "restor": 5, "dump": 5, "test": [5, 18, 20, 24, 32, 38, 39, 40, 41, 42, 47], "build": [5, 44, 47], "document": 5, "contribut": 5, "instruct": [5, 48], "best": 5, "practic": 5, "releas": 5, "docker": [6, 16, 47], "instal": [6, 47, 48], "deploi": 6, "frequent": 7, "ask": 7, "question": 7, "i": [7, 15], "seed": [7, 9, 10, 19, 25, 28, 29, 33, 46, 49], "platform": [7, 9, 10], "issu": 7, "why": [7, 15], "domain": 7, "exampl": 7, "com": 7, "aren": 7, "t": [7, 49], "static": 7, "asset": 7, "being": 7, "serv": 7, "correctli": 7, "get": 8, "start": [8, 48], "help": 9, "For": 9, "user": [9, 13, 48], "standard": 10, "energi": 10, "effici": 10, "indic": 10, "kubernet": 11, "helm": 11, "cluster": 11, "cli": 11, "kubectl": 11, "ek": 11, "control": 11, "specif": 11, "chart": 11, "exist": [11, 15], "upgrad": [11, 46], "redeploi": 11, "stack": 11, "In": [11, 15], "updat": [11, 26], "other": 11, "licens": 12, "linux": 13, "postgresql": [13, 48], "creat": 13, "initi": 13, "server": [13, 47, 48], "product": 13, "environ": 13, "variabl": 13, "mail": 13, "se": 13, "smtp": 13, "local_untrack": 13, "py": 13, "map": [14, 28, 33], "pair": 14, "doe": 15, "how": 15, "us": [15, 47], "cycl": [15, 34], "merg": [15, 29], "link": 15, "across": 15, "put": 15, "them": 15, "togeth": 15, "Not": 15, "search": [15, 19], "depth": 15, "version": 16, "3": 16, "0": [16, 48], "beta": 16, "2": [16, 48], "22": 16, "21": 16, "20": 16, "1": [16, 48], "19": 16, "18": 16, "17": 16, "4": 16, "16": [16, 46], "15": 16, "14": 16, "13": 16, "12": [16, 46], "11": [16, 48], "10": 16, "7": 16, "9": 16, "6": 16, "base": [16, 42], "ubuntu": [16, 47], "max": 16, "osx": [16, 47, 48], "5": [16, 48], "modul": [17, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 45], "submodul": [18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42, 43, 44, 45], "context": 18, "util": [18, 19, 22, 41, 44], "wsgi": 18, "packag": [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48], "subpackag": [19, 24, 25, 30, 31, 38, 39], "inherit": [19, 20], "decor": [19, 41], "factori": [19, 40], "content": [19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 45], "url": [22, 24, 43], "featur": 23, "land": [24, 25, 26], "form": 24, "eula": 26, "librari": 27, "lib": [28, 29, 40], "mapper": [28, 33], "mapping_column": 28, "mapping_data": 28, "test_mapp": 28, "test_mapping_column": 28, "test_mapping_data": 28, "json": [31, 32], "seed_map": 33, "auditlog": 34, "join": 34, "properti": 34, "taxlot": 34, "public": 35, "serial": 36, "label": 36, "templatetag": 37, "breadcrumb": 37, "helper": [38, 39, 40], "factor": 39, "chomski": 40, "admin": [41, 48], "export": 41, "function": 42, "page": 42, "account": [43, 45], "main": [43, 45], "time": 44, "meter": 45, "from": 46, "postgr": 46, "assumpt": 46, "nativ": 47, "window": 47, "contain": 47, "non": 47, "debug": 47, "quick": 48, "postgi": 48, "timescaledb": 48, "nodej": 48, "npm": 48, "mapquest": 48, "kei": 48, "redi": 48, "login": 48, "translat": 49, "philosophi": 49, "style": 49, "don": 49, "go": 49, "crazi": 49, "indirect": 49, "interpol": 49}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx.ext.intersphinx": 1, "sphinx": 60}, "alltitles": {"API": [[0, "api"]], "Authentication": [[0, "authentication"]], "Payloads": [[0, "payloads"]], "Responses": [[0, "responses"]], "API Endpoints": [[0, "api-endpoints"]], "AWS Setup": [[1, "aws-setup"]], "Prerequisites": [[1, "prerequisites"], [13, "prerequisites"], [48, "prerequisites"]], "Amazon Web Services (AWS) Dependencies": [[1, "amazon-web-services-aws-dependencies"]], "Python Dependencies": [[1, "python-dependencies"], [13, "python-dependencies"]], "JavaScript Dependencies": [[1, "javascript-dependencies"], [13, "javascript-dependencies"]], "Database Configuration": [[1, "database-configuration"]], "Cache and Message Broker": [[1, "cache-and-message-broker"], [13, "cache-and-message-broker"]], "Running Celery the Background Task Worker": [[1, "running-celery-the-background-task-worker"]], "Data Model": [[2, "data-model"]], "Todo": [[2, "id1"], [14, "id2"], [14, "id3"]], "parents and children": [[2, "parents-and-children"]], "matching": [[2, "matching"]], "manual-matching vs auto-matching": [[2, "manual-matching-vs-auto-matching"]], "what really happens to the BuildingSnapshot table on import (and when)": [[2, "what-really-happens-to-the-buildingsnapshot-table-on-import-and-when"]], "what really happens to the CanonicalBuilding table on import (and when)": [[2, "what-really-happens-to-the-canonicalbuilding-table-on-import-and-when"]], "organization": [[2, "organization"]], "*_source_id fields": [[2, "source-id-fields"]], "extra_data": [[2, "extra-data"]], "saving and possible data loss": [[2, "saving-and-possible-data-loss"]], "Data Quality": [[3, "data-quality"]], "Deployment Guide": [[4, "deployment-guide"]], "Migrations": [[4, "migrations"], [16, "migrations"]], "Monitoring": [[4, "monitoring"]], "Sentry": [[4, "sentry"]], "Developer Resources": [[5, "developer-resources"]], "General Notes": [[5, "general-notes"]], "Pre-commit": [[5, "pre-commit"]], "Ruff Settings": [[5, "ruff-settings"]], "Python Type Hints": [[5, "python-type-hints"]], "Usage": [[5, "usage"]], "Type Checking": [[5, "type-checking"]], "Django Notes": [[5, "django-notes"]], "Adding New Fields to Database": [[5, "adding-new-fields-to-database"]], "NGINX Notes": [[5, "nginx-notes"]], "AngularJS Integration Notes": [[5, "angularjs-integration-notes"]], "Template Tags": [[5, "template-tags"]], "Django CSRF Token and AJAX Requests": [[5, "django-csrf-token-and-ajax-requests"]], "Routes and Partials or Views": [[5, "routes-and-partials-or-views"]], "Logging": [[5, "logging"]], "BEDES Compliance and Managing Columns": [[5, "bedes-compliance-and-managing-columns"]], "Resetting the Database": [[5, "resetting-the-database"]], "Restoring a Database Dump": [[5, "restoring-a-database-dump"]], "Migrating the Database": [[5, "migrating-the-database"]], "Testing": [[5, "testing"]], "Building Documentation": [[5, "building-documentation"]], "Contribution Instructions / Best Practices": [[5, "contribution-instructions-best-practices"]], "Release Instructions": [[5, "release-instructions"]], "Docker Deployment on AWS": [[6, "docker-deployment-on-aws"]], "Installation": [[6, "installation"]], "Deploying with Docker": [[6, "deploying-with-docker"]], "Frequently Asked Questions": [[7, "frequently-asked-questions"]], "Questions": [[7, "questions"]], "What is the SEED Platform?": [[7, "what-is-the-seed-platform"]], "Issues": [[7, "issues"]], "Why is the domain set to example.com?": [[7, "why-is-the-domain-set-to-example-com"]], "Why aren\u2019t the static assets being served correctly?": [[7, "why-aren-t-the-static-assets-being-served-correctly"]], "Getting Started": [[8, "getting-started"]], "Development Setup": [[8, "development-setup"]], "Help": [[9, "help"]], "For SEED Platform Users": [[9, "for-seed-platform-users"]], "For SEED Platform Developers": [[9, "for-seed-platform-developers"]], "Standard Energy Efficiency Data (SEED) Platform": [[10, "standard-energy-efficiency-data-seed-platform"]], "Indices and tables": [[10, "indices-and-tables"]], "Kubernetes Deployment Guide with Helm": [[11, "kubernetes-deployment-guide-with-helm"]], "Setup": [[11, "setup"]], "Cluster": [[11, "cluster"]], "AWS CLI Configuration": [[11, "aws-cli-configuration"]], "Kubectl": [[11, "kubectl"]], "Helm": [[11, "helm"]], "EKS Control (AWS Specific)": [[11, "eks-control-aws-specific"]], "Charts": [[11, "charts"]], "Deployment": [[11, "deployment"]], "Managing Existing Clusters": [[11, "managing-existing-clusters"]], "Upgrade/Redeploy the Helm Stack": [[11, "upgrade-redeploy-the-helm-stack"]], "Managing the Kubernetes Cluster (AWS Specific)": [[11, "managing-the-kubernetes-cluster-aws-specific"]], "Logging In": [[11, "logging-in"]], "Update web and web-celery": [[11, "update-web-and-web-celery"]], "Other Resources": [[11, "other-resources"]], "License": [[12, "license"]], "General Linux Setup": [[13, "general-linux-setup"]], "Configure PostgreSQL": [[13, "configure-postgresql"]], "Django Database Configuration": [[13, "django-database-configuration"]], "Creating the initial user": [[13, "creating-the-initial-user"]], "Running celery the background task worker": [[13, "running-celery-the-background-task-worker"]], "Running the development web server": [[13, "running-the-development-web-server"]], "Running a production web server": [[13, "running-a-production-web-server"]], "Environment Variables": [[13, "environment-variables"]], "Mail Services": [[13, "mail-services"]], "AWS SES Service": [[13, "aws-ses-service"]], "SMTP service": [[13, "smtp-service"]], "local_untracked.py": [[13, "local-untracked-py"]], "Mapping": [[14, "mapping"], [14, "id1"]], "Import": [[14, "import"]], "Matching": [[14, "matching"], [15, "matching"]], "Pairing": [[14, "pairing"]], "What is it?": [[15, "what-is-it"]], "Why does it exist?": [[15, "why-does-it-exist"]], "How and when is it used?": [[15, "how-and-when-is-it-used"]], "In-Cycle Merging": [[15, "in-cycle-merging"]], "Linking (Across Cycles)": [[15, "linking-across-cycles"]], "Putting them Together, Match-Merge-Linking": [[15, "putting-them-together-match-merge-linking"]], "Note on In-Cycle Not-merged Matches": [[15, "note-on-in-cycle-not-merged-matches"]], "Match Searching in Depth": [[15, "match-searching-in-depth"]], "Version Develop": [[16, "version-develop"]], "Version 3.0.0": [[16, "version-3-0-0"]], "Version 3.0.0-beta.0": [[16, "version-3-0-0-beta-0"]], "Version 2.22.0": [[16, "version-2-22-0"]], "Version 2.21.0": [[16, "version-2-21-0"]], "Version 2.20.1": [[16, "version-2-20-1"]], "Version 2.20.0": [[16, "version-2-20-0"]], "Version 2.19.0": [[16, "version-2-19-0"]], "Version 2.18.1": [[16, "version-2-18-1"]], "Version 2.18.0": [[16, "version-2-18-0"]], "Version 2.17.4": [[16, "version-2-17-4"]], "Version 2.17.3": [[16, "version-2-17-3"]], "Version 2.17.2": [[16, "version-2-17-2"]], "Version 2.17.1": [[16, "version-2-17-1"]], "Version 2.17.0": [[16, "version-2-17-0"]], "Version 2.16.0": [[16, "version-2-16-0"]], "Version 2.15.2": [[16, "version-2-15-2"]], "Version 2.15.1": [[16, "version-2-15-1"]], "Version 2.15.0": [[16, "version-2-15-0"]], "Version 2.14.0": [[16, "version-2-14-0"]], "Version 2.13.0": [[16, "version-2-13-0"]], "Version 2.12.0 - 2.12.4": [[16, "version-2-12-0-2-12-4"]], "Version 2.11.0": [[16, "version-2-11-0"]], "Version 2.10.0": [[16, "version-2-10-0"]], "Version 2.7.3 to 2.9.0": [[16, "version-2-7-3-to-2-9-0"]], "Version 2.7.2": [[16, "version-2-7-2"]], "Version 2.7.1": [[16, "version-2-7-1"]], "Version 2.7.0": [[16, "version-2-7-0"]], "Version 2.6.1": [[16, "version-2-6-1"]], "Version 2.6.0": [[16, "version-2-6-0"]], "Docker-based Deployment": [[16, "docker-based-deployment"], [16, "id1"]], "Ubuntu": [[16, "ubuntu"]], "Max OSX": [[16, "max-osx"]], "Version 2.5.2": [[16, "version-2-5-2"]], "Version 2.5.1": [[16, "version-2-5-1"]], "Version 2.5.0": [[16, "version-2-5-0"]], "Development": [[16, "development"]], "Modules": [[17, "modules"]], "Configuration": [[18, "configuration"]], "Submodules": [[18, "submodules"], [19, "submodules"], [20, "submodules"], [21, "submodules"], [22, "submodules"], [23, "submodules"], [24, "submodules"], [26, "submodules"], [27, "submodules"], [28, "submodules"], [29, "submodules"], [31, "submodules"], [32, "submodules"], [33, "submodules"], [34, "submodules"], [35, "submodules"], [36, "submodules"], [37, "submodules"], [39, "submodules"], [40, "submodules"], [41, "submodules"], [42, "submodules"], [43, "submodules"], [44, "submodules"], [45, "submodules"]], "Template Context": [[18, "module-config.template_context"]], "Tests": [[18, "module-config.tests"], [20, "tests"], [24, "module-seed.landing.tests"], [41, "tests"]], "Utils": [[18, "module-config.utils"], [19, "module-seed.utils"], [22, "module-seed.data_importer.utils"], [41, "module-seed.tests.util"]], "Views": [[18, "module-config.views"], [19, "module-seed.views"], [20, "views"], [22, "views"], [24, "module-seed.landing.views"], [41, "module-seed.tests.test_views"]], "WSGI": [[18, "module-config.wsgi"]], "SEED Package": [[19, "seed-package"]], "Subpackages": [[19, "subpackages"], [24, "subpackages"], [25, "subpackages"], [30, "subpackages"], [31, "subpackages"], [38, "subpackages"], [39, "subpackages"]], "Inheritance": [[19, "inheritance"], [20, "inheritance"]], "Decorators": [[19, "module-seed.decorators"], [41, "module-seed.tests.test_decorators"]], "Factory": [[19, "factory"]], "Models": [[19, "module-seed.models"], [20, "module-seed.models.data_quality"], [22, "models"], [24, "module-seed.landing.models"], [34, "models"], [35, "models"], [41, "models"]], "Search": [[19, "module-seed.search"]], "Tasks": [[19, "module-seed.tasks"], [41, "module-seed.tests.test_tasks"]], "Token Generator": [[19, "module-seed.token_generators"]], "Module contents": [[19, "module-seed"], [21, "module-contents"], [22, "module-seed.data_importer"], [23, "module-contents"], [24, "module-seed.landing"], [25, "module-seed.landing.management"], [26, "module-seed.landing.management.commands"], [27, "module-seed.lib"], [28, "module-seed.lib.mappings"], [29, "module-seed.lib.merging"], [30, "module-seed.management"], [31, "module-contents"], [32, "module-contents"], [33, "module-contents"], [34, "module-seed.models"], [35, "module-seed.public"], [36, "module-seed.serializers"], [38, "module-seed.test_helpers"], [45, "module-seed.views"]], "Data Quality Package": [[20, "data-quality-package"]], "Data Package": [[21, "data-package"]], "BEDES": [[21, "bedes"]], "Data Importer Package": [[22, "data-importer-package"]], "Managers": [[22, "module-seed.data_importer.managers"]], "URLs": [[22, "urls"], [24, "module-seed.landing.urls"]], "Features Package": [[23, "features-package"]], "Landing Package": [[24, "landing-package"]], "Forms": [[24, "module-seed.landing.forms"]], "seed.landing.management package": [[25, "seed-landing-management-package"]], "Landing Management Package": [[26, "landing-management-package"]], "Update EULA": [[26, "update-eula"]], "Library Packages": [[27, "library-packages"]], "seed.lib.mappings package": [[28, "seed-lib-mappings-package"]], "seed.lib.mappings.mapper module": [[28, "module-seed.lib.mappings.mapper"]], "seed.lib.mappings.mapping_columns module": [[28, "module-seed.lib.mappings.mapping_columns"]], "seed.lib.mappings.mapping_data module": [[28, "seed-lib-mappings-mapping-data-module"]], "seed.lib.mappings.test_mapper module": [[28, "seed-lib-mappings-test-mapper-module"]], "seed.lib.mappings.test_mapping_columns module": [[28, "seed-lib-mappings-test-mapping-columns-module"]], "seed.lib.mappings.test_mapping_data module": [[28, "seed-lib-mappings-test-mapping-data-module"]], "seed.lib.merging package": [[29, "seed-lib-merging-package"]], "seed.lib.merging.merging module": [[29, "module-seed.lib.merging.merging"]], "Management Package": [[30, "management-package"]], "Managers Package": [[31, "managers-package"]], "JSON": [[31, "json"]], "Manager Tests Package": [[32, "manager-tests-package"]], "Test JSON Manager": [[32, "test-json-manager"]], "Mapping Package": [[33, "mapping-package"]], "seed.mappings.mapper module": [[33, "seed-mappings-mapper-module"]], "seed.mappings.seed_mappings module": [[33, "seed-mappings-seed-mappings-module"]], "AuditLog": [[34, "module-seed.models.auditlog"]], "Columns": [[34, "module-seed.models.columns"]], "Cycles": [[34, "module-seed.models.cycles"]], "Joins": [[34, "joins"]], "Generic Models": [[34, "module-seed.models.models"]], "Properties": [[34, "module-seed.models.properties"]], "TaxLots": [[34, "module-seed.models.tax_lots"]], "Public Package": [[35, "public-package"]], "Serializers Package": [[36, "serializers-package"]], "Serializers": [[36, "module-seed.serializers.celery"]], "Labels": [[36, "module-seed.serializers.labels"]], "Templatetags Package": [[37, "templatetags-package"]], "Breadcrumbs": [[37, "module-seed.templatetags.breadcrumbs"]], "Test Helpers Package": [[38, "test-helpers-package"]], "Test Helper Factor Package": [[39, "test-helper-factor-package"]], "Helpers": [[39, "module-seed.test_helpers.factory.helpers"]], "Test Helper Factory Lib Package": [[40, "test-helper-factory-lib-package"]], "Chomsky": [[40, "chomsky"]], "Tests Package": [[41, "tests-package"]], "Admin Views": [[41, "module-seed.tests.test_admin_views"]], "Exporters": [[41, "exporters"]], "Tests (Functional) Package": [[42, "tests-functional-package"]], "Base": [[42, "base"]], "Page": [[42, "page"]], "Pages": [[42, "pages"]], "URLs Package": [[43, "urls-package"]], "Accounts": [[43, "accounts"], [45, "accounts"]], "APIs": [[43, "apis"], [44, "module-seed.utils.api"], [45, "apis"]], "Main": [[43, "main"], [45, "main"]], "Utilities Package": [[44, "utilities-package"]], "Buildings": [[44, "module-seed.utils.buildings"]], "Organizations": [[44, "module-seed.utils.organizations"]], "Time": [[44, "module-seed.utils.time"]], "Views Package": [[45, "views-package"]], "Meters": [[45, "meters"]], "Upgrade a SEED database from Postgres 12 to Postgres 16": [[46, "upgrade-a-seed-database-from-postgres-12-to-postgres-16"]], "Assumptions": [[46, "assumptions"]], "Installation using Docker": [[47, "installation-using-docker"]], "Docker Native (Ubuntu)": [[47, "docker-native-ubuntu"]], "Docker Native (Windows/OSX)": [[47, "docker-native-windows-osx"]], "Building and Running Containers for Non-Development": [[47, "building-and-running-containers-for-non-development"]], "Using Docker for Development": [[47, "using-docker-for-development"]], "Build": [[47, "build"]], "Running the Server": [[47, "running-the-server"]], "Running Tests": [[47, "running-tests"]], "Debugging": [[47, "debugging"]], "Installation on OSX": [[48, "installation-on-osx"]], "Quick Installation Instructions": [[48, "quick-installation-instructions"]], "PostgreSQL 11.1": [[48, "postgresql-11-1"]], "PostGIS 2.5": [[48, "postgis-2-5"]], "TimescaleDB 1.5.0": [[48, "timescaledb-1-5-0"]], "Python Packages": [[48, "python-packages"]], "NodeJS/npm": [[48, "nodejs-npm"]], "Configure Django and Databases": [[48, "configure-django-and-databases"]], "MapQuest API Key": [[48, "mapquest-api-key"]], "Run Django Migrations": [[48, "run-django-migrations"]], "Django Admin User": [[48, "django-admin-user"]], "Install Redis": [[48, "install-redis"]], "Install JavaScript Dependencies": [[48, "install-javascript-dependencies"]], "Start the Server": [[48, "start-the-server"]], "Login": [[48, "login"]], "Translating SEED": [[49, "translating-seed"]], "General philosophies / style": [[49, "general-philosophies-style"]], "Don\u2019t go crazy with indirection and interpolation": [[49, "don-t-go-crazy-with-indirection-and-interpolation"]]}, "indexentries": {"config.template_context": [[18, "module-config.template_context"]], "config.tests": [[18, "module-config.tests"]], "config.utils": [[18, "module-config.utils"]], "config.views": [[18, "module-config.views"]], "config.wsgi": [[18, "module-config.wsgi"]], "de_camel_case() (in module config.utils)": [[18, "config.utils.de_camel_case"]], "module": [[18, "module-config.template_context"], [18, "module-config.tests"], [18, "module-config.utils"], [18, "module-config.views"], [18, "module-config.wsgi"], [19, "module-seed"], [19, "module-seed.decorators"], [19, "module-seed.models"], [19, "module-seed.search"], [19, "module-seed.tasks"], [19, "module-seed.token_generators"], [19, "module-seed.utils"], [19, "module-seed.views"], [20, "module-seed.models.data_quality"], [22, "module-seed.data_importer"], [22, "module-seed.data_importer.managers"], [22, "module-seed.data_importer.utils"], [24, "module-seed.landing"], [24, "module-seed.landing.forms"], [24, "module-seed.landing.models"], [24, "module-seed.landing.tests"], [24, "module-seed.landing.urls"], [24, "module-seed.landing.views"], [25, "module-seed.landing.management"], [26, "module-seed.landing.management.commands"], [27, "module-seed.lib"], [27, "module-seed.lib.mappings"], [27, "module-seed.lib.merging"], [28, "module-seed.lib.mappings"], [28, "module-seed.lib.mappings.mapper"], [28, "module-seed.lib.mappings.mapping_columns"], [29, "module-seed.lib.merging"], [29, "module-seed.lib.merging.merging"], [30, "module-seed.management"], [34, "module-seed.models"], [34, "module-seed.models.auditlog"], [34, "module-seed.models.columns"], [34, "module-seed.models.cycles"], [34, "module-seed.models.models"], [34, "module-seed.models.properties"], [34, "module-seed.models.tax_lots"], [35, "module-seed.public"], [36, "module-seed.serializers"], [36, "module-seed.serializers.celery"], [36, "module-seed.serializers.labels"], [37, "module-seed.templatetags.breadcrumbs"], [38, "module-seed.test_helpers"], [39, "module-seed.test_helpers.factory.helpers"], [41, "module-seed.tests.test_admin_views"], [41, "module-seed.tests.test_decorators"], [41, "module-seed.tests.test_tasks"], [41, "module-seed.tests.test_views"], [41, "module-seed.tests.util"], [44, "module-seed.utils.api"], [44, "module-seed.utils.buildings"], [44, "module-seed.utils.organizations"], [44, "module-seed.utils.time"], [45, "module-seed.views"]], "robots_txt() (in module config.views)": [[18, "config.views.robots_txt"]], "sentry_js() (in module config.template_context)": [[18, "config.template_context.sentry_js"]], "session_key() (in module config.template_context)": [[18, "config.template_context.session_key"]], "drfendpointmixin (in module seed.decorators)": [[19, "seed.decorators.DRFEndpointMixin"]], "signuptokengenerator (class in seed.token_generators)": [[19, "seed.token_generators.SignupTokenGenerator"]], "ajax_request() (in module seed.decorators)": [[19, "seed.decorators.ajax_request"]], "ajax_request_class() (in module seed.decorators)": [[19, "seed.decorators.ajax_request_class"]], "build_shared_buildings_orgs() (in module seed.search)": [[19, "seed.search.build_shared_buildings_orgs"]], "check_token() (seed.token_generators.signuptokengenerator method)": [[19, "seed.token_generators.SignupTokenGenerator.check_token"]], "create_inventory_queryset() (in module seed.search)": [[19, "seed.search.create_inventory_queryset"]], "decorator_to_mixin() (in module seed.decorators)": [[19, "seed.decorators.decorator_to_mixin"]], "delete_organization() (in module seed.tasks)": [[19, "seed.tasks.delete_organization"]], "get_inventory_fieldnames() (in module seed.search)": [[19, "seed.search.get_inventory_fieldnames"]], "get_orgs_w_public_fields() (in module seed.search)": [[19, "seed.search.get_orgs_w_public_fields"]], "get_prog_key() (in module seed.decorators)": [[19, "seed.decorators.get_prog_key"]], "inventory_search_filter_sort() (in module seed.search)": [[19, "seed.search.inventory_search_filter_sort"]], "invite_new_user_to_seed() (in module seed.tasks)": [[19, "seed.tasks.invite_new_user_to_seed"]], "lock_and_track() (in module seed.decorators)": [[19, "seed.decorators.lock_and_track"]], "make_token() (seed.token_generators.signuptokengenerator method)": [[19, "seed.token_generators.SignupTokenGenerator.make_token"]], "parse_body() (in module seed.search)": [[19, "seed.search.parse_body"]], "process_search_params() (in module seed.search)": [[19, "seed.search.process_search_params"]], "require_organization_id() (in module seed.decorators)": [[19, "seed.decorators.require_organization_id"]], "require_organization_id_class() (in module seed.decorators)": [[19, "seed.decorators.require_organization_id_class"]], "require_organization_membership() (in module seed.decorators)": [[19, "seed.decorators.require_organization_membership"]], "search_inventory() (in module seed.search)": [[19, "seed.search.search_inventory"]], "search_properties() (in module seed.search)": [[19, "seed.search.search_properties"]], "search_taxlots() (in module seed.search)": [[19, "seed.search.search_taxlots"]], "seed": [[19, "module-seed"]], "seed.decorators": [[19, "module-seed.decorators"]], "seed.models": [[19, "module-seed.models"], [34, "module-seed.models"]], "seed.search": [[19, "module-seed.search"]], "seed.tasks": [[19, "module-seed.tasks"]], "seed.token_generators": [[19, "module-seed.token_generators"]], "seed.utils": [[19, "module-seed.utils"]], "seed.views": [[19, "module-seed.views"], [45, "module-seed.views"]], "send_salesforce_error_log() (in module seed.tasks)": [[19, "seed.tasks.send_salesforce_error_log"]], "comparisonerror": [[20, "seed.models.data_quality.ComparisonError"]], "data_types (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.DATA_TYPES"]], "default_rules (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.DEFAULT_RULES"]], "dataqualitycheck (class in seed.models.data_quality)": [[20, "seed.models.data_quality.DataQualityCheck"]], "dataqualitycheck.doesnotexist": [[20, "seed.models.data_quality.DataQualityCheck.DoesNotExist"]], "dataqualitycheck.multipleobjectsreturned": [[20, "seed.models.data_quality.DataQualityCheck.MultipleObjectsReturned"]], "dataqualitytypecasterror": [[20, "seed.models.data_quality.DataQualityTypeCastError"]], "required_fields (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.REQUIRED_FIELDS"]], "rule_exclude (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_EXCLUDE"]], "rule_include (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_INCLUDE"]], "rule_not_null (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_NOT_NULL"]], "rule_range (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_RANGE"]], "rule_required (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_REQUIRED"]], "rule_type (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_TYPE"], [20, "seed.models.data_quality.Rule.rule_type"]], "rule_type_custom (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_TYPE_CUSTOM"]], "rule_type_default (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_TYPE_DEFAULT"]], "rule (class in seed.models.data_quality)": [[20, "seed.models.data_quality.Rule"]], "rule.doesnotexist": [[20, "seed.models.data_quality.Rule.DoesNotExist"]], "rule.multipleobjectsreturned": [[20, "seed.models.data_quality.Rule.MultipleObjectsReturned"]], "severity (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY"], [20, "seed.models.data_quality.Rule.severity"]], "severity_error (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY_ERROR"]], "severity_valid (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY_VALID"]], "severity_warning (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY_WARNING"]], "type_area (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_AREA"]], "type_date (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_DATE"]], "type_eui (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_EUI"]], "type_number (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_NUMBER"]], "type_string (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_STRING"]], "type_year (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_YEAR"]], "unitmismatcherror": [[20, "seed.models.data_quality.UnitMismatchError"]], "add_invalid_geometry_entry_provided() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_invalid_geometry_entry_provided"]], "add_result_comparison_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_comparison_error"]], "add_result_dimension_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_dimension_error"]], "add_result_is_null() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_is_null"]], "add_result_max_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_max_error"]], "add_result_min_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_min_error"]], "add_result_missing_and_none() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_missing_and_none"]], "add_result_missing_req() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_missing_req"]], "add_result_string_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_string_error"]], "add_result_type_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_type_error"]], "add_rule() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_rule"]], "add_rule_if_new() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_rule_if_new"]], "cache_key() (seed.models.data_quality.dataqualitycheck static method)": [[20, "seed.models.data_quality.DataQualityCheck.cache_key"]], "check_data() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.check_data"]], "condition (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.condition"]], "data_quality_check (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.data_quality_check"]], "data_quality_check_id (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.data_quality_check_id"]], "data_type (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.data_type"]], "description (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.description"]], "enabled (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.enabled"]], "field (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.field"]], "for_derived_column (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.for_derived_column"]], "format_pint_violation() (in module seed.models.data_quality)": [[20, "seed.models.data_quality.format_pint_violation"]], "format_strings() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.format_strings"]], "get_data_type_display() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.get_data_type_display"]], "get_fieldnames() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.get_fieldnames"]], "get_rule_type_display() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.get_rule_type_display"]], "get_severity_display() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.get_severity_display"]], "id (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.id"]], "id (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.id"]], "initialize_cache() (seed.models.data_quality.dataqualitycheck static method)": [[20, "seed.models.data_quality.DataQualityCheck.initialize_cache"]], "initialize_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.initialize_rules"]], "max (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.max"]], "maximum_valid() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.maximum_valid"]], "min (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.min"]], "minimum_valid() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.minimum_valid"]], "name (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.name"]], "name (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.name"]], "not_null (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.not_null"]], "objects (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.objects"]], "objects (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.objects"]], "organization (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.organization"]], "organization_id (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.organization_id"]], "remove_all_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.remove_all_rules"]], "remove_status_label() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.remove_status_label"]], "required (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.required"]], "reset_all_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.reset_all_rules"]], "reset_default_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.reset_default_rules"]], "reset_results() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.reset_results"]], "retrieve() (seed.models.data_quality.dataqualitycheck class method)": [[20, "seed.models.data_quality.DataQualityCheck.retrieve"]], "retrieve_result_by_address() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.retrieve_result_by_address"]], "retrieve_result_by_tax_lot_id() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.retrieve_result_by_tax_lot_id"]], "rules (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.rules"]], "save_to_cache() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.save_to_cache"]], "seed.models.data_quality": [[20, "module-seed.models.data_quality"]], "status_label (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.status_label"]], "status_label_id (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.status_label_id"]], "str_to_data_type() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.str_to_data_type"]], "table_name (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.table_name"]], "text_match (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.text_match"]], "units (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.units"]], "update_status_label() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.update_status_label"]], "valid_text() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.valid_text"]], "notdeletedmanager (class in seed.data_importer.managers)": [[22, "seed.data_importer.managers.NotDeletedManager"]], "get_all() (seed.data_importer.managers.notdeletedmanager method)": [[22, "seed.data_importer.managers.NotDeletedManager.get_all"]], "get_queryset() (seed.data_importer.managers.notdeletedmanager method)": [[22, "seed.data_importer.managers.NotDeletedManager.get_queryset"]], "kbtu_thermal_conversion_factors() (in module seed.data_importer.utils)": [[22, "seed.data_importer.utils.kbtu_thermal_conversion_factors"]], "seed.data_importer": [[22, "module-seed.data_importer"]], "seed.data_importer.managers": [[22, "module-seed.data_importer.managers"]], "seed.data_importer.utils": [[22, "module-seed.data_importer.utils"]], "usage_point_id() (in module seed.data_importer.utils)": [[22, "seed.data_importer.utils.usage_point_id"]], "use_for_related_fields (seed.data_importer.managers.notdeletedmanager attribute)": [[22, "seed.data_importer.managers.NotDeletedManager.use_for_related_fields"]], "customcreateuserform (class in seed.landing.forms)": [[24, "seed.landing.forms.CustomCreateUserForm"]], "customcreateuserform.meta (class in seed.landing.forms)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta"]], "loginform (class in seed.landing.forms)": [[24, "seed.landing.forms.LoginForm"]], "required_fields (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.REQUIRED_FIELDS"]], "seeduser (class in seed.landing.models)": [[24, "seed.landing.models.SEEDUser"]], "seeduser.doesnotexist": [[24, "seed.landing.models.SEEDUser.DoesNotExist"]], "seeduser.multipleobjectsreturned": [[24, "seed.landing.models.SEEDUser.MultipleObjectsReturned"]], "username_field (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.USERNAME_FIELD"]], "userlogintest (class in seed.landing.tests)": [[24, "seed.landing.tests.UserLoginTest"]], "account_activation_sent() (in module seed.landing.views)": [[24, "seed.landing.views.account_activation_sent"]], "activate() (in module seed.landing.views)": [[24, "seed.landing.views.activate"]], "analysis_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.analysis_set"]], "api_key (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.api_key"]], "base_fields (seed.landing.forms.customcreateuserform attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.base_fields"]], "base_fields (seed.landing.forms.loginform attribute)": [[24, "seed.landing.forms.LoginForm.base_fields"]], "columnmapping_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.columnmapping_set"]], "create_account() (in module seed.landing.views)": [[24, "seed.landing.views.create_account"]], "cycle_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.cycle_set"]], "date_joined (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.date_joined"]], "deactivate_user() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.deactivate_user"]], "declared_fields (seed.landing.forms.customcreateuserform attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.declared_fields"]], "declared_fields (seed.landing.forms.loginform attribute)": [[24, "seed.landing.forms.LoginForm.declared_fields"]], "default_building_detail_custom_columns (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_building_detail_custom_columns"]], "default_custom_columns (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_custom_columns"]], "default_organization (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_organization"]], "default_organization_id (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_organization_id"]], "email (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.email"]], "email_user() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.email_user"]], "fields (seed.landing.forms.customcreateuserform.meta attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta.fields"]], "first_name (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.first_name"]], "generate_key() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.generate_key"]], "get_absolute_url() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_absolute_url"]], "get_full_name() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_full_name"]], "get_next_by_date_joined() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_next_by_date_joined"]], "get_previous_by_date_joined() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_previous_by_date_joined"]], "get_short_name() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_short_name"]], "greenassessmentpropertyauditlog_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.greenassessmentpropertyauditlog_set"]], "groups (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.groups"]], "id (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.id"]], "importrecord_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.importrecord_set"]], "is_staff (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.is_staff"]], "landing_page() (in module seed.landing.views)": [[24, "seed.landing.views.landing_page"]], "last_name (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.last_name"]], "logentry_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.logentry_set"]], "media (seed.landing.forms.customcreateuserform property)": [[24, "seed.landing.forms.CustomCreateUserForm.media"]], "media (seed.landing.forms.loginform property)": [[24, "seed.landing.forms.LoginForm.media"]], "model (seed.landing.forms.customcreateuserform.meta attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta.model"]], "modified_import_records (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.modified_import_records"]], "notes (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.notes"]], "oauth2_provider_accesstoken (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.oauth2_provider_accesstoken"]], "oauth2_provider_application (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.oauth2_provider_application"]], "oauth2_provider_grant (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.oauth2_provider_grant"]], "oauth2_provider_refreshtoken (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.oauth2_provider_refreshtoken"]], "objects (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.objects"]], "organizationuser_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.organizationuser_set"]], "orgs (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.orgs"]], "password_reset() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset"]], "password_reset_complete() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset_complete"]], "password_reset_confirm() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset_confirm"]], "password_reset_done() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset_done"]], "password_set() (in module seed.landing.views)": [[24, "seed.landing.views.password_set"]], "postofficeemail_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.postofficeemail_set"]], "postofficeemailtemplate_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.postofficeemailtemplate_set"]], "process_header_request() (seed.landing.models.seeduser class method)": [[24, "seed.landing.models.SEEDUser.process_header_request"]], "save() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.save"]], "seed.landing": [[24, "module-seed.landing"]], "seed.landing.forms": [[24, "module-seed.landing.forms"]], "seed.landing.models": [[24, "module-seed.landing.models"]], "seed.landing.tests": [[24, "module-seed.landing.tests"]], "seed.landing.urls": [[24, "module-seed.landing.urls"]], "seed.landing.views": [[24, "module-seed.landing.views"]], "setup() (seed.landing.tests.userlogintest method)": [[24, "seed.landing.tests.UserLoginTest.setUp"]], "show_shared_buildings (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.show_shared_buildings"]], "signup() (in module seed.landing.views)": [[24, "seed.landing.views.signup"]], "test_simple_login() (seed.landing.tests.userlogintest method)": [[24, "seed.landing.tests.UserLoginTest.test_simple_login"]], "user_permissions (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.user_permissions"]], "username (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.username"]], "widgets (seed.landing.forms.customcreateuserform.meta attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta.widgets"]], "seed.landing.management": [[25, "module-seed.landing.management"]], "seed.landing.management.commands": [[26, "module-seed.landing.management.commands"]], "seed.lib": [[27, "module-seed.lib"]], "seed.lib.mappings": [[27, "module-seed.lib.mappings"], [28, "module-seed.lib.mappings"]], "seed.lib.merging": [[27, "module-seed.lib.merging"], [29, "module-seed.lib.merging"]], "mappingcolumns (class in seed.lib.mappings.mapping_columns)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns"]], "add_mappings() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.add_mappings"]], "apply_threshold() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.apply_threshold"]], "create_column_regexes() (in module seed.lib.mappings.mapper)": [[28, "seed.lib.mappings.mapper.create_column_regexes"]], "duplicates (seed.lib.mappings.mapping_columns.mappingcolumns property)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.duplicates"]], "final_mappings (seed.lib.mappings.mapping_columns.mappingcolumns property)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.final_mappings"]], "first_suggested_mapping() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.first_suggested_mapping"]], "get_pm_mapping() (in module seed.lib.mappings.mapper)": [[28, "seed.lib.mappings.mapper.get_pm_mapping"]], "resolve_duplicate() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.resolve_duplicate"]], "seed.lib.mappings.mapper": [[28, "module-seed.lib.mappings.mapper"]], "seed.lib.mappings.mapping_columns": [[28, "module-seed.lib.mappings.mapping_columns"]], "set_initial_mapping_cmp() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.set_initial_mapping_cmp"]], "sort_duplicates() (in module seed.lib.mappings.mapping_columns)": [[28, "seed.lib.mappings.mapping_columns.sort_duplicates"]], "get_attrs_with_mapping() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_attrs_with_mapping"]], "get_propertystate_attrs() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_propertystate_attrs"]], "get_state_attrs() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_state_attrs"]], "get_state_to_state_tuple() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_state_to_state_tuple"]], "get_taxlotstate_attrs() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_taxlotstate_attrs"]], "merge_state() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.merge_state"]], "seed.lib.merging.merging": [[29, "module-seed.lib.merging.merging"]], "seed.management": [[30, "module-seed.management"]], "blue_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.BLUE_CHOICE"]], "color_choices (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.COLOR_CHOICES"]], "column_exclude_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_EXCLUDE_FIELDS"]], "column_merge_favor_existing (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_MERGE_FAVOR_EXISTING"]], "column_merge_favor_new (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_MERGE_FAVOR_NEW"]], "column_merge_protection (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_MERGE_PROTECTION"]], "column (class in seed.models.columns)": [[34, "seed.models.columns.Column"]], "column.doesnotexist": [[34, "seed.models.columns.Column.DoesNotExist"]], "column.multipleobjectsreturned": [[34, "seed.models.columns.Column.MultipleObjectsReturned"]], "columncasterror": [[34, "seed.models.columns.ColumnCastError"]], "cycle (class in seed.models.cycles)": [[34, "seed.models.cycles.Cycle"]], "cycle.doesnotexist": [[34, "seed.models.cycles.Cycle.DoesNotExist"]], "cycle.multipleobjectsreturned": [[34, "seed.models.cycles.Cycle.MultipleObjectsReturned"]], "database_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.DATABASE_COLUMNS"]], "data_type_parsers (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.DATA_TYPE_PARSERS"]], "date (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.DATE"]], "datetime (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.DATETIME"]], "decimal (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.DECIMAL"]], "default_labels (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.DEFAULT_LABELS"]], "excluded_column_return_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_COLUMN_RETURN_FIELDS"]], "excluded_mapping_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_MAPPING_FIELDS"]], "excluded_rename_from_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_RENAME_FROM_FIELDS"]], "excluded_rename_to_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_RENAME_TO_FIELDS"]], "float (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.FLOAT"]], "gray_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.GRAY_CHOICE"]], "green_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.GREEN_CHOICE"]], "integer (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.INTEGER"]], "internal_type_to_data_type (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.INTERNAL_TYPE_TO_DATA_TYPE"]], "light_blue_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.LIGHT_BLUE_CHOICE"]], "orange_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.ORANGE_CHOICE"]], "pinned_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.PINNED_COLUMNS"]], "property (class in seed.models.properties)": [[34, "seed.models.properties.Property"]], "property.doesnotexist": [[34, "seed.models.properties.Property.DoesNotExist"]], "property.multipleobjectsreturned": [[34, "seed.models.properties.Property.MultipleObjectsReturned"]], "propertyauditlog (class in seed.models.properties)": [[34, "seed.models.properties.PropertyAuditLog"]], "propertyauditlog.doesnotexist": [[34, "seed.models.properties.PropertyAuditLog.DoesNotExist"]], "propertyauditlog.multipleobjectsreturned": [[34, "seed.models.properties.PropertyAuditLog.MultipleObjectsReturned"]], "propertystate (class in seed.models.properties)": [[34, "seed.models.properties.PropertyState"]], "propertystate.doesnotexist": [[34, "seed.models.properties.PropertyState.DoesNotExist"]], "propertystate.multipleobjectsreturned": [[34, "seed.models.properties.PropertyState.MultipleObjectsReturned"]], "propertyview (class in seed.models.properties)": [[34, "seed.models.properties.PropertyView"]], "propertyview.doesnotexist": [[34, "seed.models.properties.PropertyView.DoesNotExist"]], "propertyview.multipleobjectsreturned": [[34, "seed.models.properties.PropertyView.MultipleObjectsReturned"]], "quantity_unit_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.QUANTITY_UNIT_COLUMNS"]], "red_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.RED_CHOICE"]], "shared_field_types (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.SHARED_FIELD_TYPES"]], "shared_none (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.SHARED_NONE"]], "shared_public (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.SHARED_PUBLIC"]], "string (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.STRING"]], "statuslabel (class in seed.models.models)": [[34, "seed.models.models.StatusLabel"]], "statuslabel.doesnotexist": [[34, "seed.models.models.StatusLabel.DoesNotExist"]], "statuslabel.multipleobjectsreturned": [[34, "seed.models.models.StatusLabel.MultipleObjectsReturned"]], "taxlot (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLot"]], "taxlot.doesnotexist": [[34, "seed.models.tax_lots.TaxLot.DoesNotExist"]], "taxlot.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLot.MultipleObjectsReturned"]], "taxlotauditlog (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLotAuditLog"]], "taxlotauditlog.doesnotexist": [[34, "seed.models.tax_lots.TaxLotAuditLog.DoesNotExist"]], "taxlotauditlog.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLotAuditLog.MultipleObjectsReturned"]], "taxlotstate (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLotState"]], "taxlotstate.doesnotexist": [[34, "seed.models.tax_lots.TaxLotState.DoesNotExist"]], "taxlotstate.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLotState.MultipleObjectsReturned"]], "taxlotview (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLotView"]], "taxlotview.doesnotexist": [[34, "seed.models.tax_lots.TaxLotView.DoesNotExist"]], "taxlotview.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLotView.MultipleObjectsReturned"]], "unit_types (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.UNIT_TYPES"]], "unmappable_property_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.UNMAPPABLE_PROPERTY_FIELDS"]], "unmappable_taxlot_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.UNMAPPABLE_TAXLOT_FIELDS"]], "unit (class in seed.models.models)": [[34, "seed.models.models.Unit"]], "unit.doesnotexist": [[34, "seed.models.models.Unit.DoesNotExist"]], "unit.multipleobjectsreturned": [[34, "seed.models.models.Unit.MultipleObjectsReturned"]], "white_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.WHITE_CHOICE"]], "access_level_instance (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.access_level_instance"]], "access_level_instance (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.access_level_instance"]], "access_level_instance_id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.access_level_instance_id"]], "access_level_instance_id (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.access_level_instance_id"]], "account_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.account_name_column"]], "actual_emission_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.actual_emission_column"]], "actual_energy_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.actual_energy_column"]], "address_line_1 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.address_line_1"]], "address_line_1 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.address_line_1"]], "address_line_2 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.address_line_2"]], "address_line_2 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.address_line_2"]], "analysispropertyview (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.analysispropertyview"]], "analysispropertyview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.analysispropertyview_set"]], "analysispropertyview_set (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.analysispropertyview_set"]], "and_filter_groups (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.and_filter_groups"]], "audit_template_building_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.audit_template_building_id"]], "benchmark_id_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.benchmark_id_column"]], "block_number (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.block_number"]], "bounding_box (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.bounding_box"]], "bounding_box (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.bounding_box"]], "building_certification (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.building_certification"]], "building_count (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.building_count"]], "building_files (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.building_files"]], "cast() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.cast"]], "cast_column_value() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.cast_column_value"]], "centroid (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.centroid"]], "centroid (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.centroid"]], "city (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.city"]], "city (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.city"]], "clean() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.clean"]], "clean() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.clean"]], "color (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.color"]], "column_description (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.column_description"]], "column_list_profiles (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.column_list_profiles"]], "column_name (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.column_name"]], "column_set (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.column_set"]], "columnlistprofilecolumn_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.columnlistprofilecolumn_set"]], "compliance_label (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.compliance_label"]], "comstock_mapping (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.comstock_mapping"]], "conditioned_floor_area (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.conditioned_floor_area"]], "conditioned_floor_area_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.conditioned_floor_area_orig"]], "contact_email_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.contact_email_column"]], "contact_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.contact_name_column"]], "coparent() (seed.models.properties.propertystate class method)": [[34, "seed.models.properties.PropertyState.coparent"]], "coparent() (seed.models.tax_lots.taxlotstate class method)": [[34, "seed.models.tax_lots.TaxLotState.coparent"]], "copy_meters() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.copy_meters"]], "create_mappings() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.create_mappings"]], "create_mappings_from_file() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.create_mappings_from_file"]], "created (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.created"]], "created (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.created"]], "created (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.created"]], "created (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.created"]], "created (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.created"]], "created (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.created"]], "created (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.created"]], "created (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.created"]], "custom_id_1 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.custom_id_1"]], "custom_id_1 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.custom_id_1"]], "cycle (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.cycle"]], "cycle (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.cycle"]], "cycle_id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.cycle_id"]], "cycle_id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.cycle_id"]], "cycles (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.cycles"]], "data_admin_account_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_admin_account_name_column"]], "data_admin_email_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_admin_email_column"]], "data_admin_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_admin_name_column"]], "data_loggers (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.data_loggers"]], "data_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.data_state"]], "data_state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.data_state"]], "data_type (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_type"]], "dataview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.dataview_set"]], "dataviewparameter_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.dataviewparameter_set"]], "delete_all() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.delete_all"]], "derived_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derived_column"]], "derived_column_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derived_column_id"]], "derivedcolumn_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derivedcolumn_set"]], "derivedcolumnparameter_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derivedcolumnparameter_set"]], "description (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.description"]], "description (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.description"]], "display_name (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.display_name"]], "district (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.district"]], "egrid_subregion_code (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.egrid_subregion_code"]], "end (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.end"]], "energy_alerts (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.energy_alerts"]], "energy_score (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.energy_score"]], "event_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.event_set"]], "events (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.events"]], "exclude_filter_groups (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.exclude_filter_groups"]], "extra_data (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.extra_data"]], "extra_data (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.extra_data"]], "gapauditlog_view (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.gapauditlog_view"]], "generation_date (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.generation_date"]], "geocoding_confidence (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.geocoding_confidence"]], "geocoding_confidence (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.geocoding_confidence"]], "geocoding_order (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.geocoding_order"]], "get_color_display() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_color_display"]], "get_data_state_display() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_data_state_display"]], "get_data_state_display() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_data_state_display"]], "get_merge_protection_display() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_merge_protection_display"]], "get_merge_state_display() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_merge_state_display"]], "get_merge_state_display() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_merge_state_display"]], "get_next_by_created() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_next_by_created"]], "get_next_by_created() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_next_by_created"]], "get_next_by_created() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_next_by_created"]], "get_next_by_created() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_next_by_created"]], "get_next_by_created() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_next_by_created"]], "get_next_by_created() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_next_by_created"]], "get_next_by_created() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_next_by_created"]], "get_next_by_end() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_next_by_end"]], "get_next_by_modified() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_next_by_modified"]], "get_next_by_modified() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_next_by_modified"]], "get_next_by_start() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_next_by_start"]], "get_next_by_updated() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_next_by_updated"]], "get_next_by_updated() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_next_by_updated"]], "get_next_by_updated() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_next_by_updated"]], "get_next_by_updated() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_next_by_updated"]], "get_or_create_default() (seed.models.cycles.cycle class method)": [[34, "seed.models.cycles.Cycle.get_or_create_default"]], "get_previous_by_created() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_previous_by_created"]], "get_previous_by_created() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_previous_by_created"]], "get_previous_by_created() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_previous_by_created"]], "get_previous_by_created() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_previous_by_created"]], "get_previous_by_created() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_previous_by_created"]], "get_previous_by_created() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_previous_by_created"]], "get_previous_by_created() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_previous_by_created"]], "get_previous_by_end() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_previous_by_end"]], "get_previous_by_modified() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_previous_by_modified"]], "get_previous_by_modified() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_previous_by_modified"]], "get_previous_by_start() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_previous_by_start"]], "get_previous_by_updated() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_previous_by_updated"]], "get_previous_by_updated() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_previous_by_updated"]], "get_previous_by_updated() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_previous_by_updated"]], "get_previous_by_updated() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_previous_by_updated"]], "get_record_type_display() (seed.models.properties.propertyauditlog method)": [[34, "seed.models.properties.PropertyAuditLog.get_record_type_display"]], "get_record_type_display() (seed.models.tax_lots.taxlotauditlog method)": [[34, "seed.models.tax_lots.TaxLotAuditLog.get_record_type_display"]], "get_shared_field_type_display() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_shared_field_type_display"]], "get_source_type_display() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_source_type_display"]], "get_unit_type_display() (seed.models.models.unit method)": [[34, "seed.models.models.Unit.get_unit_type_display"]], "goal_area_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.goal_area_columns"]], "goal_baseline_cycles (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.goal_baseline_cycles"]], "goal_current_cycles (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.goal_current_cycles"]], "goal_eui_column1s (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.goal_eui_column1s"]], "goal_eui_column2s (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.goal_eui_column2s"]], "goal_eui_column3s (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.goal_eui_column3s"]], "goalnote_set (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.goalnote_set"]], "greenassessmentproperty_set (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.greenassessmentproperty_set"]], "gross_floor_area (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.gross_floor_area"]], "gross_floor_area_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.gross_floor_area_orig"]], "hash_object (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.hash_object"]], "hash_object (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.hash_object"]], "historical_note (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.historical_note"]], "history() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.history"]], "history() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.history"]], "home_energy_score_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.home_energy_score_id"]], "id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.id"]], "id (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.id"]], "id (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.id"]], "id (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.id"]], "id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.id"]], "id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.id"]], "id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.id"]], "id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.id"]], "id (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.id"]], "id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.id"]], "id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.id"]], "id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.id"]], "import_file (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.import_file"]], "import_file (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.import_file"]], "import_file (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.import_file"]], "import_file_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.import_file_id"]], "import_file_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.import_file_id"]], "import_file_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.import_file_id"]], "import_filename (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.import_filename"]], "import_filename (seed.models.properties.propertyview property)": [[34, "seed.models.properties.PropertyView.import_filename"]], "import_filename (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.import_filename"]], "import_filename (seed.models.tax_lots.taxlotview property)": [[34, "seed.models.tax_lots.TaxLotView.import_filename"]], "importfile_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.importfile_set"]], "indication_label (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.indication_label"]], "initialize_audit_logs() (seed.models.properties.propertyview method)": [[34, "seed.models.properties.PropertyView.initialize_audit_logs"]], "initialize_audit_logs() (seed.models.tax_lots.taxlotview method)": [[34, "seed.models.tax_lots.TaxLotView.initialize_audit_logs"]], "inventory_documents (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.inventory_documents"]], "is_extra_data (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.is_extra_data"]], "is_matching_criteria (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.is_matching_criteria"]], "jurisdiction_property_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.jurisdiction_property_id"]], "jurisdiction_tax_lot_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.jurisdiction_tax_lot_id"]], "labels (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.labels"]], "labels (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.labels"]], "latitude (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.latitude"]], "latitude (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.latitude"]], "long_lat (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.long_lat"]], "long_lat (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.long_lat"]], "longitude (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.longitude"]], "longitude (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.longitude"]], "lot_number (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.lot_number"]], "mapped_mappings (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.mapped_mappings"]], "measure_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.measure_set"]], "measures (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.measures"]], "merge_protection (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.merge_protection"]], "merge_relationships() (seed.models.properties.propertystate class method)": [[34, "seed.models.properties.PropertyState.merge_relationships"]], "merge_relationships() (seed.models.tax_lots.taxlotstate class method)": [[34, "seed.models.tax_lots.TaxLotState.merge_relationships"]], "merge_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.merge_state"]], "merge_state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.merge_state"]], "meters (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.meters"]], "modified (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.modified"]], "name (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.name"]], "name (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.name"]], "name (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.name"]], "name (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.name"]], "normalized_address (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.normalized_address"]], "normalized_address (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.normalized_address"]], "notes (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.notes"]], "notes (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.notes"]], "number_properties (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.number_properties"]], "objects (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.objects"]], "objects (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.objects"]], "objects (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.objects"]], "objects (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.objects"]], "objects (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.objects"]], "objects (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.objects"]], "objects (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.objects"]], "objects (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.objects"]], "objects (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.objects"]], "objects (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.objects"]], "objects (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.objects"]], "objects (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.objects"]], "occupied_floor_area (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.occupied_floor_area"]], "occupied_floor_area_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.occupied_floor_area_orig"]], "or_filter_groups (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.or_filter_groups"]], "organization (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.organization"]], "organization (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.organization"]], "organization (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.organization"]], "organization (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.organization"]], "organization (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.organization"]], "organization (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.organization"]], "organization (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.organization"]], "organization (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.organization"]], "organization_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.organization_id"]], "organization_id (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.organization_id"]], "organization_id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.organization_id"]], "organization_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.organization_id"]], "organization_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.organization_id"]], "organization_id (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.organization_id"]], "organization_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.organization_id"]], "organization_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.organization_id"]], "owner (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner"]], "owner_address (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_address"]], "owner_city_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_city_state"]], "owner_email (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_email"]], "owner_postal_code (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_postal_code"]], "owner_telephone (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_telephone"]], "parent1 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent1"]], "parent1 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent1"]], "parent1_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent1_id"]], "parent1_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent1_id"]], "parent2 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent2"]], "parent2 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent2"]], "parent2_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent2_id"]], "parent2_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent2_id"]], "parent_property (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.parent_property"]], "parent_property_id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.parent_property_id"]], "parent_state1 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state1"]], "parent_state1 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.parent_state1"]], "parent_state1 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state1"]], "parent_state1_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state1_id"]], "parent_state1_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state1_id"]], "parent_state2 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state2"]], "parent_state2 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.parent_state2"]], "parent_state2 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state2"]], "parent_state2_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state2_id"]], "parent_state2_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state2_id"]], "pm_parent_property_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.pm_parent_property_id"]], "pm_property_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.pm_property_id"]], "post_save_property() (in module seed.models.properties)": [[34, "seed.models.properties.post_save_property"]], "post_save_property_state() (in module seed.models.properties)": [[34, "seed.models.properties.post_save_property_state"]], "post_save_property_view() (in module seed.models.properties)": [[34, "seed.models.properties.post_save_property_view"]], "post_save_taxlot_state() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.post_save_taxlot_state"]], "post_save_taxlot_view() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.post_save_taxlot_view"]], "postal_code (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.postal_code"]], "postal_code (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.postal_code"]], "pre_delete_state() (in module seed.models.properties)": [[34, "seed.models.properties.pre_delete_state"]], "promote() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.promote"]], "promote() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.promote"]], "property (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.property"]], "property_footprint (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_footprint"]], "property_id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.property_id"]], "property_name (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_name"]], "property_notes (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_notes"]], "property_set (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.property_set"]], "property_states() (seed.models.tax_lots.taxlotview method)": [[34, "seed.models.tax_lots.TaxLotView.property_states"]], "property_timezone (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_timezone"]], "property_type (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_type"]], "property_views() (seed.models.tax_lots.taxlotview method)": [[34, "seed.models.tax_lots.TaxLotView.property_views"]], "propertyauditlog_parent1 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.propertyauditlog_parent1"]], "propertyauditlog_parent2 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.propertyauditlog_parent2"]], "propertyauditlog_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.propertyauditlog_state"]], "propertyauditlog_view (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.propertyauditlog_view"]], "propertymeasure_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.propertymeasure_set"]], "propertyview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.propertyview_set"]], "propertyview_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.propertyview_set"]], "propertyview_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.propertyview_set"]], "raw_access_level_instance (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.raw_access_level_instance"]], "raw_access_level_instance (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.raw_access_level_instance"]], "raw_access_level_instance_error (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.raw_access_level_instance_error"]], "raw_access_level_instance_error (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.raw_access_level_instance_error"]], "raw_access_level_instance_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.raw_access_level_instance_id"]], "raw_access_level_instance_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.raw_access_level_instance_id"]], "raw_mappings (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.raw_mappings"]], "recent_sale_date (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.recent_sale_date"]], "recognize_empty (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.recognize_empty"]], "record_type (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.record_type"]], "record_type (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.record_type"]], "release_date (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.release_date"]], "rename_column() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.rename_column"]], "retrieve_all() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_all"]], "retrieve_all_by_tuple() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_all_by_tuple"]], "retrieve_db_field_name_for_hash_comparison() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_field_name_for_hash_comparison"]], "retrieve_db_field_table_and_names_from_db_tables() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_field_table_and_names_from_db_tables"]], "retrieve_db_fields() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_fields"]], "retrieve_db_fields_from_db_tables() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_fields_from_db_tables"]], "retrieve_db_types() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_types"]], "retrieve_mapping_columns() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_mapping_columns"]], "retrieve_priorities() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_priorities"]], "rule_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.rule_set"]], "salesforce_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.salesforce_column"]], "save() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.save"]], "save() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.save"]], "save() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.save"]], "save_column_names() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.save_column_names"]], "scenarios (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.scenarios"]], "seed.models.auditlog": [[34, "module-seed.models.auditlog"]], "seed.models.columns": [[34, "module-seed.models.columns"]], "seed.models.cycles": [[34, "module-seed.models.cycles"]], "seed.models.models": [[34, "module-seed.models.models"]], "seed.models.properties": [[34, "module-seed.models.properties"]], "seed.models.tax_lots": [[34, "module-seed.models.tax_lots"]], "set_default_access_level_instance() (in module seed.models.properties)": [[34, "seed.models.properties.set_default_access_level_instance"]], "set_default_access_level_instance() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.set_default_access_level_instance"]], "shared_field_type (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.shared_field_type"]], "show_in_list (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.show_in_list"]], "simulation (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.simulation"]], "site_eui (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui"]], "site_eui_modeled (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_modeled"]], "site_eui_modeled_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_modeled_orig"]], "site_eui_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_orig"]], "site_eui_weather_normalized (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_weather_normalized"]], "site_eui_weather_normalized_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_weather_normalized_orig"]], "source_eui (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui"]], "source_eui_modeled (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_modeled"]], "source_eui_modeled_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_modeled_orig"]], "source_eui_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_orig"]], "source_eui_weather_normalized (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_weather_normalized"]], "source_eui_weather_normalized_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_weather_normalized_orig"]], "source_type (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_type"]], "space_alerts (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.space_alerts"]], "start (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.start"]], "state (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.state"]], "state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.state"]], "state (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.state"]], "state (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.state"]], "state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.state"]], "state (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.state"]], "state_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.state_id"]], "state_id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.state_id"]], "state_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.state_id"]], "state_id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.state_id"]], "super_organization (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.super_organization"]], "super_organization_id (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.super_organization_id"]], "sync_latitude_longitude_and_long_lat() (in module seed.models.properties)": [[34, "seed.models.properties.sync_latitude_longitude_and_long_lat"]], "sync_latitude_longitude_and_long_lat() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.sync_latitude_longitude_and_long_lat"]], "table_name (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.table_name"]], "target_emission_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.target_emission_column"]], "target_energy_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.target_energy_column"]], "tax_lot_states() (seed.models.properties.propertyview method)": [[34, "seed.models.properties.PropertyView.tax_lot_states"]], "tax_lot_views() (seed.models.properties.propertyview method)": [[34, "seed.models.properties.PropertyView.tax_lot_views"]], "taxlot (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlot"]], "taxlot_footprint (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlot_footprint"]], "taxlot_id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlot_id"]], "taxlotauditlog_parent1 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.taxlotauditlog_parent1"]], "taxlotauditlog_parent2 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.taxlotauditlog_parent2"]], "taxlotauditlog_parent_state1 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotauditlog_parent_state1"]], "taxlotauditlog_parent_state2 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotauditlog_parent_state2"]], "taxlotauditlog_state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotauditlog_state"]], "taxlotauditlog_view (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlotauditlog_view"]], "taxlotproperty_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.taxlotproperty_set"]], "taxlotproperty_set (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.taxlotproperty_set"]], "taxlotproperty_set (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlotproperty_set"]], "taxlotview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.taxlotview_set"]], "taxlotview_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.taxlotview_set"]], "taxlotview_set (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotview_set"]], "to_dict() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.to_dict"]], "to_dict() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.to_dict"]], "to_dict() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.to_dict"]], "total_ghg_emissions (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_ghg_emissions"]], "total_ghg_emissions_intensity (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_ghg_emissions_intensity"]], "total_marginal_ghg_emissions (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_marginal_ghg_emissions"]], "total_marginal_ghg_emissions_intensity (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_marginal_ghg_emissions_intensity"]], "ubid (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.ubid"]], "ubid (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.ubid"]], "ubidmodel_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.ubidmodel_set"]], "ubidmodel_set (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.ubidmodel_set"]], "unit (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.unit"]], "unit_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.unit_id"]], "unit_name (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.unit_name"]], "unit_type (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.unit_type"]], "units_pint (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.units_pint"]], "updated (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.updated"]], "updated (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.updated"]], "updated (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.updated"]], "updated (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.updated"]], "use_description (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.use_description"]], "user (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.user"]], "user_id (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.user_id"]], "validate_model() (in module seed.models.columns)": [[34, "seed.models.columns.validate_model"]], "view (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.view"]], "view (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.view"]], "view_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.view_id"]], "view_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.view_id"]], "views (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.views"]], "views (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.views"]], "violation_label (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.violation_label"]], "x_axis_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.x_axis_columns"]], "year_built (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.year_built"]], "year_ending (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.year_ending"]], "seed.public": [[35, "module-seed.public"]], "celerydatetimeserializer (class in seed.serializers.celery)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer"]], "labelserializer (class in seed.serializers.labels)": [[36, "seed.serializers.labels.LabelSerializer"]], "labelserializer.meta (class in seed.serializers.labels)": [[36, "seed.serializers.labels.LabelSerializer.Meta"]], "default() (seed.serializers.celery.celerydatetimeserializer method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.default"]], "extra_kwargs (seed.serializers.labels.labelserializer.meta attribute)": [[36, "seed.serializers.labels.LabelSerializer.Meta.extra_kwargs"]], "fields (seed.serializers.labels.labelserializer.meta attribute)": [[36, "seed.serializers.labels.LabelSerializer.Meta.fields"]], "get_is_applied() (seed.serializers.labels.labelserializer method)": [[36, "seed.serializers.labels.LabelSerializer.get_is_applied"]], "model (seed.serializers.labels.labelserializer.meta attribute)": [[36, "seed.serializers.labels.LabelSerializer.Meta.model"]], "seed.serializers": [[36, "module-seed.serializers"]], "seed.serializers.celery": [[36, "module-seed.serializers.celery"]], "seed.serializers.labels": [[36, "module-seed.serializers.labels"]], "seed_decoder() (seed.serializers.celery.celerydatetimeserializer static method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.seed_decoder"]], "seed_dumps() (seed.serializers.celery.celerydatetimeserializer static method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.seed_dumps"]], "seed_loads() (seed.serializers.celery.celerydatetimeserializer static method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.seed_loads"]], "to_representation() (seed.serializers.labels.labelserializer method)": [[36, "seed.serializers.labels.LabelSerializer.to_representation"]], "breadcrumbnode (class in seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.BreadcrumbNode"]], "urlbreadcrumbnode (class in seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.UrlBreadcrumbNode"]], "breadcrumb() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb"]], "breadcrumb_root() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb_root"]], "breadcrumb_url() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb_url"]], "breadcrumb_url_root() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb_url_root"]], "create_crumb() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.create_crumb"]], "create_crumb_first() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.create_crumb_first"]], "render() (seed.templatetags.breadcrumbs.breadcrumbnode method)": [[37, "seed.templatetags.breadcrumbs.BreadcrumbNode.render"]], "render() (seed.templatetags.breadcrumbs.urlbreadcrumbnode method)": [[37, "seed.templatetags.breadcrumbs.UrlBreadcrumbNode.render"]], "seed.templatetags.breadcrumbs": [[37, "module-seed.templatetags.breadcrumbs"]], "seed.test_helpers": [[38, "module-seed.test_helpers"]], "djangofunctionalfactory (class in seed.test_helpers.factory.helpers)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory"]], "invalid_test_cc_number() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.invalid_test_cc_number"]], "rand_bool() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_bool"]], "rand_city() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_city"]], "rand_city_suffix() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_city_suffix"]], "rand_currency() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_currency"]], "rand_date() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_date"]], "rand_domain() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_domain"]], "rand_email() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_email"]], "rand_float() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_float"]], "rand_int() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_int"]], "rand_name() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_name"]], "rand_phone() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_phone"]], "rand_plant_name() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_plant_name"]], "rand_str() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_str"]], "rand_street_address() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_street_address"]], "rand_street_suffix() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_street_suffix"]], "seed.test_helpers.factory.helpers": [[39, "module-seed.test_helpers.factory.helpers"]], "test_cc_number() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.test_cc_number"]], "valid_test_cc_number() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.valid_test_cc_number"]], "accesslevelbasetestcase (class in seed.tests.util)": [[41, "seed.tests.util.AccessLevelBaseTestCase"]], "adminviewstest (class in seed.tests.test_admin_views)": [[41, "seed.tests.test_admin_views.AdminViewsTest"]], "assertdictsubsetmixin (class in seed.tests.util)": [[41, "seed.tests.util.AssertDictSubsetMixin"]], "classdecoratortests (class in seed.tests.test_decorators)": [[41, "seed.tests.test_decorators.ClassDecoratorTests"]], "datamappingbasetestcase (class in seed.tests.util)": [[41, "seed.tests.util.DataMappingBaseTestCase"]], "datasetpermissionstests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.DatasetPermissionsTests"]], "deletemodelstestcase (class in seed.tests.util)": [[41, "seed.tests.util.DeleteModelsTestCase"]], "fakeclient (class in seed.tests.util)": [[41, "seed.tests.util.FakeClient"]], "fakerequest (class in seed.tests.util)": [[41, "seed.tests.util.FakeRequest"]], "get (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.GET"]], "getdatasetsviewstests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.GetDatasetsViewsTests"]], "importfileviewstests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.ImportFileViewsTests"]], "inventoryviewtests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.InventoryViewTests"]], "meta (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.META"]], "mainviewtests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.MainViewTests"]], "post (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.POST"]], "requireorganizationidtests (class in seed.tests.test_decorators)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests"]], "testdecorators (class in seed.tests.test_decorators)": [[41, "seed.tests.test_decorators.TestDecorators"]], "testerror": [[41, "seed.tests.test_decorators.TestError"]], "testmcmviews (class in seed.tests.test_views)": [[41, "seed.tests.test_views.TestMCMViews"]], "testtasks (class in seed.tests.test_tasks)": [[41, "seed.tests.test_tasks.TestTasks"]], "assertdictcontainssubset() (seed.tests.util.assertdictsubsetmixin method)": [[41, "seed.tests.util.AssertDictSubsetMixin.assertDictContainsSubset"]], "assert_expected_mappings() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.assert_expected_mappings"]], "body (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.body"]], "create_import_file() (seed.tests.util.datamappingbasetestcase method)": [[41, "seed.tests.util.DataMappingBaseTestCase.create_import_file"]], "expected_mappings (seed.tests.test_views.testmcmviews attribute)": [[41, "seed.tests.test_views.TestMCMViews.expected_mappings"]], "get() (seed.tests.util.fakeclient method)": [[41, "seed.tests.util.FakeClient.get"]], "locked (seed.tests.test_decorators.testdecorators attribute)": [[41, "seed.tests.test_decorators.TestDecorators.locked"]], "login_as_child_member() (seed.tests.util.accesslevelbasetestcase method)": [[41, "seed.tests.util.AccessLevelBaseTestCase.login_as_child_member"]], "login_as_root_member() (seed.tests.util.accesslevelbasetestcase method)": [[41, "seed.tests.util.AccessLevelBaseTestCase.login_as_root_member"]], "login_as_root_owner() (seed.tests.util.accesslevelbasetestcase method)": [[41, "seed.tests.util.AccessLevelBaseTestCase.login_as_root_owner"]], "path (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.path"]], "pk (seed.tests.test_decorators.testdecorators attribute)": [[41, "seed.tests.test_decorators.TestDecorators.pk"]], "post() (seed.tests.util.fakeclient method)": [[41, "seed.tests.util.FakeClient.post"]], "raw_columns_expected (seed.tests.test_views.testmcmviews attribute)": [[41, "seed.tests.test_views.TestMCMViews.raw_columns_expected"]], "seed.tests.test_admin_views": [[41, "module-seed.tests.test_admin_views"]], "seed.tests.test_decorators": [[41, "module-seed.tests.test_decorators"]], "seed.tests.test_tasks": [[41, "module-seed.tests.test_tasks"]], "seed.tests.test_views": [[41, "module-seed.tests.test_views"]], "seed.tests.util": [[41, "module-seed.tests.util"]], "setup() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.setUp"]], "setup() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.setUp"]], "setup() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.setUp"]], "setup() (seed.tests.test_tasks.testtasks method)": [[41, "seed.tests.test_tasks.TestTasks.setUp"]], "setup() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.setUp"]], "setup() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.setUp"]], "setup() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.setUp"]], "setup() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.setUp"]], "setup() (seed.tests.test_views.mainviewtests method)": [[41, "seed.tests.test_views.MainViewTests.setUp"]], "setup() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.setUp"]], "setup() (seed.tests.util.accesslevelbasetestcase method)": [[41, "seed.tests.util.AccessLevelBaseTestCase.setUp"]], "setup() (seed.tests.util.deletemodelstestcase method)": [[41, "seed.tests.util.DeleteModelsTestCase.setUp"]], "set_up() (seed.tests.util.datamappingbasetestcase method)": [[41, "seed.tests.util.DataMappingBaseTestCase.set_up"]], "teardown() (seed.tests.util.deletemodelstestcase method)": [[41, "seed.tests.util.DeleteModelsTestCase.tearDown"]], "test_add_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_org"]], "test_add_org_dupe() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_org_dupe"]], "test_add_owner_existing_org_to_non_root() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_owner_existing_org_to_non_root"]], "test_add_user_existing_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_user_existing_org"]], "test_add_user_new_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_user_new_org"]], "test_add_user_no_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_user_no_org"]], "test_ajax_request_class_dict() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_dict"]], "test_ajax_request_class_dict_status_error() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_dict_status_error"]], "test_ajax_request_class_dict_status_false() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_dict_status_false"]], "test_ajax_request_class_format_type() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_format_type"]], "test_create_dataset() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_create_dataset"]], "test_dataset_count() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_count"]], "test_dataset_create() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_create"]], "test_dataset_destroy() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_destroy"]], "test_dataset_list() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_list"]], "test_dataset_retrieve() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_retrieve"]], "test_dataset_update() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_update"]], "test_delete_dataset() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_delete_dataset"]], "test_delete_file() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.test_delete_file"]], "test_delete_organization() (seed.tests.test_tasks.testtasks method)": [[41, "seed.tests.test_tasks.TestTasks.test_delete_organization"]], "test_get_column_mapping_suggestions() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_column_mapping_suggestions"]], "test_get_column_mapping_suggestions_pm_file() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_column_mapping_suggestions_pm_file"]], "test_get_column_mapping_suggestions_with_columns() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_column_mapping_suggestions_with_columns"]], "test_get_cycles() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_cycles"]], "test_get_dataset() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_dataset"]], "test_get_datasets() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_datasets"]], "test_get_datasets_count() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_datasets_count"]], "test_get_datasets_count_invalid() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_datasets_count_invalid"]], "test_get_import_file() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.test_get_import_file"]], "test_get_matching_and_geocoding_results() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.test_get_matching_and_geocoding_results"]], "test_get_prog_key() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_get_prog_key"]], "test_get_properties() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties"]], "test_get_properties_cycle_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_cycle_id"]], "test_get_properties_empty_page() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_empty_page"]], "test_get_properties_page_not_an_integer() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_page_not_an_integer"]], "test_get_properties_pint_fields() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_pint_fields"]], "test_get_properties_profile_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_profile_id"]], "test_get_properties_property_extra_data() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_property_extra_data"]], "test_get_properties_select_all() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_select_all"]], "test_get_properties_taxlot_extra_data() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_taxlot_extra_data"]], "test_get_properties_with_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_with_taxlots"]], "test_get_properties_with_taxlots_with_footprints() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_with_taxlots_with_footprints"]], "test_get_properties_wrong_query_params() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_wrong_query_params"]], "test_get_property() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_property"]], "test_get_property_columns() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_property_columns"]], "test_get_property_multiple_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_property_multiple_taxlots"]], "test_get_raw_column_names() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_raw_column_names"]], "test_get_taxlot() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlot"]], "test_get_taxlot_columns() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlot_columns"]], "test_get_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots"]], "test_get_taxlots_empty_page() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_empty_page"]], "test_get_taxlots_extra_data() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_extra_data"]], "test_get_taxlots_multiple_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_multiple_taxlots"]], "test_get_taxlots_no_cycle_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_no_cycle_id"]], "test_get_taxlots_page_not_an_integer() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_page_not_an_integer"]], "test_get_taxlots_profile_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_profile_id"]], "test_home() (seed.tests.test_views.mainviewtests method)": [[41, "seed.tests.test_views.MainViewTests.test_home"]], "test_increment_cache() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_increment_cache"]], "test_locking() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_locking"]], "test_locking_w_exception() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_locking_w_exception"]], "test_postoffice() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_postoffice"]], "test_progress() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_progress"]], "test_progress() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_progress"]], "test_require_organization_id_class_no_org_id() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_require_organization_id_class_no_org_id"]], "test_require_organization_id_class_org_id() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_require_organization_id_class_org_id"]], "test_require_organization_id_class_org_id_not_int() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_require_organization_id_class_org_id_not_int"]], "test_require_organization_id_fail_no_key() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_fail_no_key"]], "test_require_organization_id_fail_not_numeric() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_fail_not_numeric"]], "test_require_organization_id_success_integer() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_success_integer"]], "test_require_organization_id_success_string() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_success_string"]], "test_save_column_mappings() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_save_column_mappings"]], "test_save_column_mappings_idempotent() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_save_column_mappings_idempotent"]], "test_signup_process() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_signup_process"]], "test_signup_process_force_lowercase_email() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_signup_process_force_lowercase_email"]], "test_update_dataset() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_update_dataset"]], "test_update_pint_fields_with_modified_display_settings() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_update_pint_fields_with_modified_display_settings"]], "unlocked (seed.tests.test_decorators.testdecorators attribute)": [[41, "seed.tests.test_decorators.TestDecorators.unlocked"]], "apibypasscsrfmiddleware (class in seed.utils.api)": [[44, "seed.utils.api.APIBypassCSRFMiddleware"]], "orgcreatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgCreateMixin"]], "orgcreateupdatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgCreateUpdateMixin"]], "orgmixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgMixin"]], "orgquerysetmixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgQuerySetMixin"]], "orgupdatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgUpdateMixin"]], "orgvalidatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgValidateMixin"]], "orgvalidator (class in seed.utils.api)": [[44, "seed.utils.api.OrgValidator"]], "profileidmixin (class in seed.utils.api)": [[44, "seed.utils.api.ProfileIdMixin"]], "api_endpoint() (in module seed.utils.api)": [[44, "seed.utils.api.api_endpoint"]], "api_endpoint_class() (in module seed.utils.api)": [[44, "seed.utils.api.api_endpoint_class"]], "clean_api_regex() (in module seed.utils.api)": [[44, "seed.utils.api.clean_api_regex"]], "convert_datestr() (in module seed.utils.time)": [[44, "seed.utils.time.convert_datestr"]], "convert_to_js_timestamp() (in module seed.utils.time)": [[44, "seed.utils.time.convert_to_js_timestamp"]], "create_organization() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.create_organization"]], "create_suborganization() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.create_suborganization"]], "default_pm_mappings() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.default_pm_mappings"]], "drf_api_endpoint() (in module seed.utils.api)": [[44, "seed.utils.api.drf_api_endpoint"]], "field (seed.utils.api.orgvalidator attribute)": [[44, "seed.utils.api.OrgValidator.field"]], "format_api_docstring() (in module seed.utils.api)": [[44, "seed.utils.api.format_api_docstring"]], "get_all_urls() (in module seed.utils.api)": [[44, "seed.utils.api.get_all_urls"]], "get_api_endpoints() (in module seed.utils.api)": [[44, "seed.utils.api.get_api_endpoints"]], "get_api_request_user() (in module seed.utils.api)": [[44, "seed.utils.api.get_api_request_user"]], "get_org_id_from_validator() (in module seed.utils.api)": [[44, "seed.utils.api.get_org_id_from_validator"]], "get_organization() (seed.utils.api.orgmixin method)": [[44, "seed.utils.api.OrgMixin.get_organization"]], "get_parent_org() (seed.utils.api.orgmixin method)": [[44, "seed.utils.api.OrgMixin.get_parent_org"]], "get_queryset() (seed.utils.api.orgquerysetmixin method)": [[44, "seed.utils.api.OrgQuerySetMixin.get_queryset"]], "get_show_columns() (seed.utils.api.profileidmixin method)": [[44, "seed.utils.api.ProfileIdMixin.get_show_columns"]], "get_source_type() (in module seed.utils.buildings)": [[44, "seed.utils.buildings.get_source_type"]], "key (seed.utils.api.orgvalidator attribute)": [[44, "seed.utils.api.OrgValidator.key"]], "parse_datetime() (in module seed.utils.time)": [[44, "seed.utils.time.parse_datetime"]], "perform_create() (seed.utils.api.orgcreatemixin method)": [[44, "seed.utils.api.OrgCreateMixin.perform_create"]], "perform_update() (seed.utils.api.orgupdatemixin method)": [[44, "seed.utils.api.OrgUpdateMixin.perform_update"]], "rgetattr() (in module seed.utils.api)": [[44, "seed.utils.api.rgetattr"]], "seed.utils.api": [[44, "module-seed.utils.api"]], "seed.utils.buildings": [[44, "module-seed.utils.buildings"]], "seed.utils.organizations": [[44, "module-seed.utils.organizations"]], "seed.utils.time": [[44, "module-seed.utils.time"]], "validate() (seed.utils.api.orgvalidatemixin method)": [[44, "seed.utils.api.OrgValidateMixin.validate"]], "validate_org() (seed.utils.api.orgvalidatemixin method)": [[44, "seed.utils.api.OrgValidateMixin.validate_org"]]}}) \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/setup_docker.html b/docs/code_documentation/3.0.0/setup_docker.html new file mode 100644 index 00000000..a3dbdc1b --- /dev/null +++ b/docs/code_documentation/3.0.0/setup_docker.html @@ -0,0 +1,254 @@ + + + + + + + Installation using Docker — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Installation using Docker

+

Docker works natively on Linux, Mac OSX, and Windows 10. If you are using an older version of +Windows (and some older versions of Mac OSX), you will need to install Docker Toolbox.

+

Choose either Docker Native (Windows/OSX) or Docker Native (Ubuntu) to +install Docker.

+
+

Docker Native (Ubuntu)

+

Follow instructions here.

+ +
+
+

Docker Native (Windows/OSX)

+

Following instructions for Mac or +for Windows. Note that for OSX you must have docker desktop version 3.0 or later <https://github.com/concourse/concourse/issues/6038>.

+ +
+
+

Building and Running Containers for Non-Development

+
    +
  • Run Docker Compose

    +
    +
    docker compose build
    +
    +
    +

    Be Patient … If the containers build successfully, then start the containers

    +
    docker volume create --name=seed_pgdata
    +docker volume create --name=seed_media
    +docker compose up
    +
    +
    +

    Note that you may need to build the containers a couple times for everything to converge

    +
    +
  • +
  • Login to container

    +
    +

    The docker-compose file creates a default user and password. Below are the defaults but can +be overridden by setting environment variables.

    +
    username: user@seed-platform.org
    +password: super-secret-password
    +
    +
    +
    +
  • +
+
+

Note

+

Don’t forget that you need to reset your default username and password if you are going +to use these Docker images in production mode!

+
+
+
+

Using Docker for Development

+

The development environment is configured for live reloading (i.e., restart webserver when files change) +and debugging. It builds off the base docker-compose.yml, so it’s necessary +to specify the files being used in docker-compose commands as seen below.

+
+

Build

+
# create volumes for the database and media directory
+docker volume create --name=seed_pgdata
+docker volume create --name=seed_media
+
+# build the images
+docker compose -f docker-compose.yml -f docker-compose.dev.yml build
+
+
+
+
+

Running the Server

+

NOTE: the server config is sourced from config.settings.docker_dev, which will include +your local_untracked.py if it exists. If you have a local_untracked.py, make sure it doesn’t +overwrite the database or celery configuration!

+
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
+
+
+

If the server doesn’t start successfully, and docker compose logs doesn’t help, +the django development server probably failed to start due to an error in your config or code. +Unfortunately docker/django logging doesn’t appear to work when the container is first started. +Just try running the server yourself with docker exec, and see what the output is.

+

The development docker-compose file has some configurable parameters for specifying volumes to use:

+
    +
  • SEED_DB_VOLUME: the name of the docker volume to mount for postgres

  • +
  • SEED_MEDIA_VOLUME: the name of the docker volume to mount for the seed media folder

  • +
+

Docker will use environment variables from the shell or from a .env file to set these values.

+

This is useful if you want to switch between different databases for testing. +For example, if you want to create a separate volume for storing a production backup, you could do the following

+
docker volume create --name=seed_pgdata_prod
+SEED_DB_VOLUME=seed_pgdata_prod docker compose -f docker-compose.yml -f docker-compose.dev.yml up
+
+
+

NOTE: you’ll need to run docker compose down to remove the containers before you +can restart the containers connecting to different volumes.

+
+
+

Running Tests

+

While the containers are running (i.e., after running the docker compose up command), use docker exec to run tests in the web container:

+
docker exec -it seed_web ./manage.py test --settings config.settings.docker_dev
+
+
+

Add the setting --nocapture in order to see stdout while running tests. You will need to do this in order to make use of debugging as described below or the output to your debug commands will not display until after the break point has passed and the tests are finished.

+

Also worth noting: output from logging (_log.debug, etc) will not display in any situation unless a test fails.

+
+
+

Debugging

+

To use pdb on the server, the web container has remote-pdb installed. +In your code, insert the following

+
import remote_pdb; remote_pdb.set_trace()
+
+
+

Once the breakpoint is triggered, you should see the web container log something like “RemotePdb session open at 127.0.0.1:41653, waiting for connection …”. +To connect to the remote session, run netcat from inside the container (using the appropriate port).

+
docker exec -it seed_web nc 127.0.0.1:41653
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/setup_osx.html b/docs/code_documentation/3.0.0/setup_osx.html new file mode 100644 index 00000000..7cc1d108 --- /dev/null +++ b/docs/code_documentation/3.0.0/setup_osx.html @@ -0,0 +1,467 @@ + + + + + + + Installation on OSX — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Installation on OSX

+

These instructions are for installing and running SEED on Mac OSX in +development mode.

+
+

Quick Installation Instructions

+

This section is intended for developers who may already have their machine +ready for general development. If this is not the case, skip to Prerequisites. Note that SEED uses python 3.

+
    +
  • install Postgres 11.1 and redis for cache and message broker

  • +
  • install PostGIS 2.5 and enable it on the database using CREATE EXTENSION postgis;

  • +
  • install TimescaleDB 1.5.0

  • +
  • use a virtualenv (if desired)

  • +
  • git clone git@github.com:seed-platform/seed.git

  • +
  • create a local_untracked.py in the config/settings folder and add CACHE and DB config (example local_untracked.py.dist)

  • +
  • to enable geocoding, get MapQuest API key and attach it to your organization

  • +
  • export DJANGO_SETTINGS_MODULE=config.settings.dev in all terminals used by SEED (celery terminal and runserver terminal)

  • +
  • +
    pip install -r requirements/local.txt
      +
    • for condas python, you way need to run this command to get pip install to succeed: conda install -c conda-forge python-crfsuite

    • +
    +
    +
    +
  • +
  • npm install

  • +
  • ./manage.py migrate

  • +
  • ./manage.py create_default_user

  • +
  • ./manage.py runserver

  • +
  • DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 4 –max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler

  • +
  • navigate to http://127.0.0.1:8000/app/#/profile/admin in your browser to add users to organizations

  • +
  • main app runs at 127.0.0.1:8000/app

  • +
+

The python manage.py create_default_user will setup a default superuser +which must be used to access the system the first time. The management command +can also create other superusers.

+
./manage.py create_default_user --username=demo@seed-platform.org --organization=lbl --password=demo123
+
+
+
+
+

Prerequisites

+

These instructions assume you have MacPorts or Homebrew. Your system +should have the following dependencies already installed:

+
    +
  • git (port install git or brew install git)

  • +
  • graphviz (brew install graphviz)

  • +
  • pyenv (Recommended)

    +
    +
    +

    Note

    +

    Although you could install Python packages globally, this is the +easiest way to install Python packages. Setting these up first will +help avoid polluting your base Python installation and make it much +easier to switch between different versions of the code.

    +
    +
    brew install pyenv
    +brew install pyenv-virtualenv
    +pyenv install <python3 version you want>
    +pyenv virtualenv <python3 version you want> seed
    +pyenv local seed
    +
    +
    +
    +
  • +
+
+
+

PostgreSQL 11.1

+

MacPorts:

+
sudo su - root
+port install postgresql94-server postgresql94 postgresql94-doc
+# init db
+mkdir -p /opt/local/var/db/postgresql94/defaultdb
+chown postgres:postgres /opt/local/var/db/postgresql94/defaultdb
+su postgres -c '/opt/local/lib/postgresql94/bin/initdb -D /opt/local/var/db/postgresql94/defaultdb'
+
+# At this point, you may want to add start/stop scripts or aliases to
+# ~/.bashrc or your virtualenv ``postactivate`` script
+# (in ``~/.virtualenvs/{env-name}/bin/postactivate``).
+
+alias pg_start='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \
+    -D /opt/local/var/db/postgresql94/defaultdb \
+    -l /opt/local/var/db/postgresql94/defaultdb/postgresql.log start"'
+alias pg_stop='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \
+    -D /opt/local/var/db/postgresql94/defaultdb stop"'
+
+pg_start
+
+sudo su - postgres
+PATH=$PATH:/opt/local/lib/postgresql94/bin/
+
+
+

Homebrew:

+
brew install postgres
+# follow the post install instructions to add to launchagents or call
+# manually with `postgres -D /usr/local/var/postgres`
+# Skip the remaining Postgres instructions!
+
+
+

Configure PostgreSQL. Replace ‘seeddb’, ‘seeduser’ with desired db/user. By +default use password seedpass when prompted. Use the code block below in development only since +the seeduser is a SUPERUSER.

+
createuser -P seeduser
+createdb `whoami`
+psql -c 'CREATE DATABASE "seeddb" WITH OWNER = "seeduser";'
+psql -c 'GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO seeduser;'
+psql -c 'ALTER ROLE seeduser SUPERUSER;'
+
+
+
+
+

PostGIS 2.5

+

MacPorts:

+
# Assuming you're still root from installing PostgreSQL,
+port install postgis2
+
+
+

Homebrew:

+
brew install postgis
+
+
+

Configure PostGIS:

+
psql -d seeddb -c "CREATE EXTENSION postgis;"
+
+# For testing, give seed user superuser access:
+# psql -c 'ALTER USER seeduser CREATEDB;'
+
+
+

If upgrading from an existing database or existing local_untracked.py file, make sure to add the +MapQuest API Key and set the database engine to ‘ENGINE’: ‘django.contrib.gis.db.backends.postgis’.

+

Now exit any root environments, becoming just yourself (even though it’s not +that easy being green), for the remainder of these instructions.

+
+
+

TimescaleDB 1.5.0

+

Note, as of version 1.5.0, dumping and restoring databases requires that both the source and target +database have the same version of TimescaleDB.

+

Downloading From Source:

+
# Note: Installing from source should only be done
+# if you have a Postgres installation not maintained by Homebrew.
+# This installation requires C compiler (e.g., gcc or clang) and CMake version 3.4 or greater.
+
+git clone https://github.com/timescale/timescaledb.git
+cd timescaledb
+git checkout 1.5.0
+
+# Bootstrap the build system
+./bootstrap
+
+# If OpenSSL can't be found by cmake - run the following instead
+# ./bootstrap -DOPENSSL_ROOT_DIR=<location of OpenSSL> # e.g., -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl
+
+# To build the extension
+cd build && make
+
+# To install
+make install
+
+# Find postgresql.conf
+# Then uncomment the shared_preload_libraries line changing it to the following
+# shared_preload_libraries = 'timescaledb'
+psql -d postgres -c "SHOW config_file;"
+
+# Restart PostgreSQL instance
+
+
+
+
+

Python Packages

+

Run these commands as your normal user id.

+

Change to a virtualenv (using virtualenvwrapper) or do the following as a +superuser. A virtualenv is usually better for development. Set the virtualenv +to seed.

+
workon seed
+
+
+

Make sure PostgreSQL command line scripts are in your PATH (if using MacPorts)

+
export PATH=$PATH:/opt/local/lib/postgresql94/bin
+
+
+

Some packages (uWSGI) may need to find your C compiler. Make sure you have +‘gcc’ on your system, and then also export this to the CC environment +variable:

+
export CC=gcc
+
+
+

Install requirements with pip

+
pip install -r requirements/local.txt
+
+
+
+
+

NodeJS/npm

+

Install npm. You can do this by installing from nodejs.org, MacPorts, or +Homebrew:

+

MacPorts:

+
sudo port install npm
+
+
+

Homebrew:

+
brew install npm
+
+
+
+
+

Configure Django and Databases

+

In the config/settings directory, there must be a file called +local_untracked.py that sets up databases and a number of other things. +To create and edit this file, start by copying over the template

+
cd config/settings
+cp local_untracked.py.dist local_untracked.py
+
+
+

Edit local_untracked.py. Open the file you created in your favorite editor. The PostgreSQL config section will look something like this:

+
# postgres DB config
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.contrib.gis.db.backends.postgis',
+        'NAME': 'seeddb',
+        'USER': 'seeduser',
+        'PASSWORD': 'seedpass',
+        'HOST': 'localhost',
+        'PORT': '5432',
+    }
+}
+
+
+

You may want to comment out the AWS settings.

+

For Redis, edit the CACHES and CELERY_BROKER_URL values to look like this:

+
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+
+
+
+

MapQuest API Key

+

Register for a MapQuest API key: +https://developer.mapquest.com/plan_purchase/steps/business_edition/business_edition_free/register

+

Visit the Manage Keys page: +https://developer.mapquest.com/user/me/apps +Either create a new key or use the key initially provided. +Copy the “Consumer Key” into the target organizations MapQuest API Key field under the organization’s settings page or directly within the DB.

+
+
+

Run Django Migrations

+

Change back to the root of the repository. Now run the migration script to set +up the database tables

+
export DJANGO_SETTINGS_MODULE=config.settings.dev
+./manage.py migrate
+
+
+
+
+

Django Admin User

+

You need a Django admin (super) user.

+
./manage.py create_default_user --username=admin@my.org --organization=seedorg --password=badpass
+
+
+

Of course, you need to save this user/password somewhere, since this is what +you will use to login to the SEED website.

+

If you want to do any API testing (and of course you do!), you will need to +add an API KEY for this user. You can do this in postgresql directly:

+
psql seeddb seeduser
+seeddb=> update landing_seeduser set api_key='DEADBEEF' where id=1;
+
+
+

The ‘secret’ key DEADBEEF is hard-coded into the test scripts.

+
+
+

Install Redis

+

You need to manually install Redis for Celery to work.

+

MacPorts:

+
sudo port install redis
+
+
+

Homebrew:

+
brew install redis
+# follow the post install instructions to add to launchagents or
+# call manually with `redis-server`
+
+
+
+
+

Install JavaScript Dependencies

+

The JS dependencies are installed using node.js package management (npm).

+
npm install
+
+
+
+
+

Start the Server

+

You should put the following statement in ~/.bashrc or add it to the +virtualenv post-activation script (e.g., in +~/.virtualenvs/seed/bin/postactivate).

+
export DJANGO_SETTINGS_MODULE=config.settings.dev
+
+
+

The combination of Redis, Celery, and Django have been encapsulated in a +single shell script, which examines existing processes and does not start +duplicate instances:

+
./bin/start-seed.sh
+
+
+

When this script is done, the Django stand-alone server will be running in +the foreground.

+
+
+

Login

+

Open your browser and navigate to http://127.0.0.1:8000

+

Login with the user/password you created before, e.g., admin@my.org and +badpass.

+
+

Note

+

these steps have been combined into a script called start-seed.sh. +The script will also not start Celery or Redis if they already seem +to be running.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.0.0/translation.html b/docs/code_documentation/3.0.0/translation.html new file mode 100644 index 00000000..9336cfcb --- /dev/null +++ b/docs/code_documentation/3.0.0/translation.html @@ -0,0 +1,218 @@ + + + + + + + Translating SEED — SEED Platform 3.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Translating SEED

+
    +
  1. Update translations on lokalise.

  2. +
  3. Copy lokalise.yml.example to lokalise.yml. Update API token.

  4. +
  5. Install lokalise locally

    +
    brew tap lokalise/cli-2
    +brew install lokalise2
    +
    +
    +
  6. +
+
    +
  1. Run scripts if you have Lokalise CLI installed. If not, see scripts for manual steps.

    +
    script/get_python_translations.sh
    +script/get_angular_translations.sh
    +
    +
    +
  2. +
  3. Uncomment the useMissingTranslationHandlerLog line seed.js to log untranslated strings to the console for review

  4. +
  5. Verify and commit changes

  6. +
+

Note: The lokalize website is the canonical source of data. If you +change the locale files locally, then you need to push them to +lokalize.

+

TL;DR

+

SEED is localized for more than just English, so a little more care is +needed as we add new UI. All translatable strings are held in either +per-language .json files (for Angular-controlled strings, which are +the majority), or .mo files (for strings supplied by Django).

+

At render time, SEED will sniff out the browser’s Accept: header. +Based on that, we choose the right file. The language files themselves +are key->value mappings from a translation “key” to a translated value. +Either Angular or Django will then swap that value into the DOM wherever +it sees the key. If no translation is available, the key remains in the +DOM. (There are some wrinkles with HTML styling and pluralization that +we’ll review below).

+

So, the basic flow on top of any new UI features is now:

+
    +
  1. Tag any user-visible strings in the UI as “translatable.” There are +currently 12 (!) ways in which to do this; see below.

  2. +
  3. Create the translation key at lokalise. We’re using lokalise +because it can smooth over differences in the file formats that +Angular and Django require, and is a nice tool for managing the +process of getting translations done by a native speaker: we can put +up screenshots to clarify how the translated phrase is used, track +translation progress, etc.

  4. +
  5. Get a translation done. As a placeholder, lokalise can provide an +auto-filled translation from Google Translate or a few other +services, but it’s fairly straightforward to order a professional +translation through lokalise.

  6. +
  7. Pull new translation files into the right places in the source tree +and commit them. There are scripts under /scripts to make this +mostly automatic.

  8. +
  9. Visually check that the containing UI looks OK with the translated +string(s). Some languages (e.g., French, German) can be wordy relative +to English and cause UI elements like buttons to expand oddly. Adjust +the layout or adjust the translation as needed.

  10. +
+
+

General philosophies / style

+
+

Don’t go crazy with indirection and interpolation

+

It’s probably better to err on the side of too many keys than to get +clever with interpolation or Angular expressions to avoid +near-duplicates of keys. The aim should be that there is at least one +place where a competent translator can see the whole string at once.

+

Compare:

+
<h2>{$:: inventory_type == 'taxlots' ?
+      translations['INCLUDE_SHARED_TAXLOTS'] :
+      translations['INCLUDE_SHARED']
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/.buildinfo b/docs/code_documentation/3.1.0/.buildinfo new file mode 100644 index 00000000..287e507b --- /dev/null +++ b/docs/code_documentation/3.1.0/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: c55ad28548a1044470a5c07f8271a909 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/code_documentation/3.1.0/.doctrees/api.doctree b/docs/code_documentation/3.1.0/.doctrees/api.doctree new file mode 100644 index 00000000..572883d8 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/api.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/aws.doctree b/docs/code_documentation/3.1.0/.doctrees/aws.doctree new file mode 100644 index 00000000..df526559 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/aws.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/data_model.doctree b/docs/code_documentation/3.1.0/.doctrees/data_model.doctree new file mode 100644 index 00000000..130d53ca Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/data_model.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/data_quality.doctree b/docs/code_documentation/3.1.0/.doctrees/data_quality.doctree new file mode 100644 index 00000000..19e84b77 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/data_quality.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/deployment.doctree b/docs/code_documentation/3.1.0/.doctrees/deployment.doctree new file mode 100644 index 00000000..1022e318 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/deployment.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/developer_resources.doctree b/docs/code_documentation/3.1.0/.doctrees/developer_resources.doctree new file mode 100644 index 00000000..0bba63e2 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/developer_resources.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/docker.doctree b/docs/code_documentation/3.1.0/.doctrees/docker.doctree new file mode 100644 index 00000000..0bdbc528 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/docker.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/environment.pickle b/docs/code_documentation/3.1.0/.doctrees/environment.pickle new file mode 100644 index 00000000..a67f785c Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/environment.pickle differ diff --git a/docs/code_documentation/3.1.0/.doctrees/faq.doctree b/docs/code_documentation/3.1.0/.doctrees/faq.doctree new file mode 100644 index 00000000..7f064dd8 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/faq.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/getting_started.doctree b/docs/code_documentation/3.1.0/.doctrees/getting_started.doctree new file mode 100644 index 00000000..1da9e919 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/getting_started.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/help.doctree b/docs/code_documentation/3.1.0/.doctrees/help.doctree new file mode 100644 index 00000000..ad88a505 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/help.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/index.doctree b/docs/code_documentation/3.1.0/.doctrees/index.doctree new file mode 100644 index 00000000..f2608346 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/index.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/kubernetes_deployment.doctree b/docs/code_documentation/3.1.0/.doctrees/kubernetes_deployment.doctree new file mode 100644 index 00000000..df2c5c02 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/kubernetes_deployment.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/license.doctree b/docs/code_documentation/3.1.0/.doctrees/license.doctree new file mode 100644 index 00000000..4d3a65b9 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/license.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/linux.doctree b/docs/code_documentation/3.1.0/.doctrees/linux.doctree new file mode 100644 index 00000000..b7ae5c4f Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/linux.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/mapping.doctree b/docs/code_documentation/3.1.0/.doctrees/mapping.doctree new file mode 100644 index 00000000..b224d875 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/mapping.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/matching.doctree b/docs/code_documentation/3.1.0/.doctrees/matching.doctree new file mode 100644 index 00000000..7d078ee3 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/matching.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/migrations.doctree b/docs/code_documentation/3.1.0/.doctrees/migrations.doctree new file mode 100644 index 00000000..0e05837b Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/migrations.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules.doctree b/docs/code_documentation/3.1.0/.doctrees/modules.doctree new file mode 100644 index 00000000..d41b263e Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/config.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/config.doctree new file mode 100644 index 00000000..8993b747 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/config.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.cleansing.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.cleansing.doctree new file mode 100644 index 00000000..878d87e7 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.cleansing.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.data.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.data.doctree new file mode 100644 index 00000000..a39e4aab Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.data.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.data_importer.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.data_importer.doctree new file mode 100644 index 00000000..ae55f03b Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.data_importer.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.doctree new file mode 100644 index 00000000..6fd2ce84 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.features.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.features.doctree new file mode 100644 index 00000000..48e0fb6c Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.features.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.landing.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.landing.doctree new file mode 100644 index 00000000..1ee07350 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.landing.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.landing.management.commands.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.landing.management.commands.doctree new file mode 100644 index 00000000..fceaf89c Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.landing.management.commands.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.landing.management.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.landing.management.doctree new file mode 100644 index 00000000..9036aa6a Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.landing.management.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.lib.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.lib.doctree new file mode 100644 index 00000000..d8f0ab5d Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.lib.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.lib.mappings.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.lib.mappings.doctree new file mode 100644 index 00000000..23770ef3 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.lib.mappings.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.lib.merging.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.lib.merging.doctree new file mode 100644 index 00000000..b0aa834b Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.lib.merging.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.management.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.management.doctree new file mode 100644 index 00000000..b0cd06a6 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.management.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.managers.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.managers.doctree new file mode 100644 index 00000000..02c82493 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.managers.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.managers.tests.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.managers.tests.doctree new file mode 100644 index 00000000..387f3d6d Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.managers.tests.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.mappings.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.mappings.doctree new file mode 100644 index 00000000..fc03c342 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.mappings.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.models.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.models.doctree new file mode 100644 index 00000000..f54bfc87 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.models.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.public.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.public.doctree new file mode 100644 index 00000000..4b72a5dc Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.public.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.serializers.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.serializers.doctree new file mode 100644 index 00000000..820cb828 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.serializers.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.templatetags.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.templatetags.doctree new file mode 100644 index 00000000..b131b844 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.templatetags.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.test_helpers.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.test_helpers.doctree new file mode 100644 index 00000000..dbf7d6ad Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.test_helpers.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.test_helpers.factory.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.test_helpers.factory.doctree new file mode 100644 index 00000000..be581475 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.test_helpers.factory.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.test_helpers.factory.lib.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.test_helpers.factory.lib.doctree new file mode 100644 index 00000000..53e13ff9 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.test_helpers.factory.lib.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.tests.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.tests.doctree new file mode 100644 index 00000000..fc322fad Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.tests.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.tests.functional.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.tests.functional.doctree new file mode 100644 index 00000000..8728c0e9 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.tests.functional.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.urls.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.urls.doctree new file mode 100644 index 00000000..d75717df Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.urls.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.utils.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.utils.doctree new file mode 100644 index 00000000..1b6b1483 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.utils.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/modules/seed.views.doctree b/docs/code_documentation/3.1.0/.doctrees/modules/seed.views.doctree new file mode 100644 index 00000000..a565b63d Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/modules/seed.views.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/postgres_upgrade.doctree b/docs/code_documentation/3.1.0/.doctrees/postgres_upgrade.doctree new file mode 100644 index 00000000..5f3f4dbc Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/postgres_upgrade.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/setup_docker.doctree b/docs/code_documentation/3.1.0/.doctrees/setup_docker.doctree new file mode 100644 index 00000000..4935b5d9 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/setup_docker.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/setup_osx.doctree b/docs/code_documentation/3.1.0/.doctrees/setup_osx.doctree new file mode 100644 index 00000000..54f00403 Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/setup_osx.doctree differ diff --git a/docs/code_documentation/3.1.0/.doctrees/translation.doctree b/docs/code_documentation/3.1.0/.doctrees/translation.doctree new file mode 100644 index 00000000..8b7c03ad Binary files /dev/null and b/docs/code_documentation/3.1.0/.doctrees/translation.doctree differ diff --git a/docs/code_documentation/3.1.0/_images/case-a.webp b/docs/code_documentation/3.1.0/_images/case-a.webp new file mode 100644 index 00000000..aa4e81d6 Binary files /dev/null and b/docs/code_documentation/3.1.0/_images/case-a.webp differ diff --git a/docs/code_documentation/3.1.0/_images/case-b.webp b/docs/code_documentation/3.1.0/_images/case-b.webp new file mode 100644 index 00000000..93b6ee0b Binary files /dev/null and b/docs/code_documentation/3.1.0/_images/case-b.webp differ diff --git a/docs/code_documentation/3.1.0/_images/case-c.webp b/docs/code_documentation/3.1.0/_images/case-c.webp new file mode 100644 index 00000000..180a613c Binary files /dev/null and b/docs/code_documentation/3.1.0/_images/case-c.webp differ diff --git a/docs/code_documentation/3.1.0/_images/case-d.webp b/docs/code_documentation/3.1.0/_images/case-d.webp new file mode 100644 index 00000000..72213abd Binary files /dev/null and b/docs/code_documentation/3.1.0/_images/case-d.webp differ diff --git a/docs/code_documentation/3.1.0/_images/data-model.webp b/docs/code_documentation/3.1.0/_images/data-model.webp new file mode 100644 index 00000000..3471d8cf Binary files /dev/null and b/docs/code_documentation/3.1.0/_images/data-model.webp differ diff --git a/docs/code_documentation/3.1.0/_sources/api.rst.txt b/docs/code_documentation/3.1.0/_sources/api.rst.txt new file mode 100644 index 00000000..5cfde4e2 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/api.rst.txt @@ -0,0 +1,68 @@ +API +=== + +Authentication +-------------- +Authentication is handled via an encoded authorization token set in a HTTP header. +To request an API token, go to ``/app/#/profile/developer`` and click 'Get a New API Key'. + +Authenticate every API request with your username (email, all lowercase) and the API key via `Basic Auth`_. +The header is sent in the form of ``Authorization: Basic ``, where credentials is the base64 encoding of the email and key joined by a single colon ``:``. + +.. _Basic Auth: https://en.wikipedia.org/wiki/Basic_access_authentication + +Using Python, use the requests library:: + + import requests + + result = requests.get('https://seed-platform.org/api/version/', auth=(user_email, api_key)) + print result.json() + +Using curl, pass the username and API key as follows:: + + curl -u user_email:api_key http://seed-platform.org/api/version/ + +If authentication fails, the response's status code will be 302, redirecting the user to ``/app/login``. + +Payloads +-------- + +Many requests require a JSON-encoded payload and parameters in the query string of the url. A frequent +requirement is including the organization_id of the org you belong to. For example:: + + curl -u user_email:api_key https://seed-platform.org/api/v2/organizations/12/ + +Or in a JSON payload:: + + curl -u user_email:api_key \ + -d '{"organization_id":6, "role": "viewer"}' \ + https://seed-platform.org/api/v2/users/12/update_role/ + +Using Python:: + + params = {'organization_id': 6, 'role': 'viewer'} + result = requests.post('https://seed-platform.org/api/v2/users/12/update_role/', + data=json.dumps(params), + auth=(user_email, api_key)) + print result.json() + +Responses +--------- + +Responses from all requests will be JSON-encoded objects, as specified in each endpoint's documentation. +In the case of an error, most endpoints will return this instead of the expected payload (or an HTTP status code):: + + { + "status": "error", + "message": "explanation of the error here" + } + +API Endpoints +------------- + +A list of interactive endpoints are available by accessing the API menu item on the left navigation +pane within you account on your SEED instance. + +To view a list of non-interactive endpoints without an account, view swagger_ on the development server. + +.. _swagger: https://seed-platform.org/api/swagger/ diff --git a/docs/code_documentation/3.1.0/_sources/aws.rst.txt b/docs/code_documentation/3.1.0/_sources/aws.rst.txt new file mode 100644 index 00000000..eccace1f --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/aws.rst.txt @@ -0,0 +1,183 @@ +========= +AWS Setup +========= + +Amazon Web Services (`AWS`_) provides the preferred hosting for the SEED Platform. + +**seed** is a `Django Project`_ and Django's documentation is an excellent place for general +understanding of this project's layout. + +.. _Django Project: https://www.djangoproject.com/ + +.. _AWS: http://aws.amazon.com/ + +Prerequisites +^^^^^^^^^^^^^ + +Ubuntu server 18.04 LTS + +.. note:: These instructions have not been updated for Ubuntu 18.04. It is recommended to use Docker-based deployments. + +.. code-block:: console + + sudo apt-get update + sudo apt-get upgrade + sudo apt-get install -y libpq-dev python-dev python-pip libatlas-base-dev \ + gfortran build-essential g++ npm libxml2-dev libxslt1-dev git mercurial \ + libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python + + +PostgreSQL and Redis are not included in the above commands. For a quick installation on AWS it +is okay to install PostgreSQL and Redis locally on the AWS instance. If a more permanent and +scalable solution, it is recommended to use AWS's hosted Redis (ElastiCache) and PostgreSQL service. + +.. note:: postgresql ``>=9.4`` is required to support `JSON Type`_ + +.. code-block:: console + + # To install PostgreSQL and Redis locally + sudo apt-get install redis-server + sudo apt-get install postgresql postgresql-contrib + +.. _`JSON Type`: https://www.postgresql.org/docs/9.4/datatype-json.html + +Amazon Web Services (AWS) Dependencies +++++++++++++++++++++++++++++++++++++++ + +The following AWS services can be used for **SEED** but are not required: + +* RDS (PostgreSQL >=9.4) +* ElastiCache (redis) +* SES + + +Python Dependencies +^^^^^^^^^^^^^^^^^^^ + +Clone the **SEED** repository from **github** + +.. code-block:: console + + $ git clone git@github.com:SEED-platform/seed.git + +enter the repo and install the python dependencies from `requirements`_ + +.. _requirements: https://github.com/SEED-platform/seed/blob/main/requirements/aws.txt + +.. code-block:: console + + $ cd seed + $ sudo pip install -r requirements/aws.txt + + +JavaScript Dependencies +^^^^^^^^^^^^^^^^^^^^^^^ + +``npm`` is required to install the JS dependencies. + +.. code-block:: console + + $ sudo apt-get install build-essential + $ sudo apt-get install curl + + +.. code-block:: console + + $ npm install + + +Database Configuration +^^^^^^^^^^^^^^^^^^^^^^ + +Copy the ``local_untracked.py.dist`` file in the ``config/settings`` directory to +``config/settings/local_untracked.py``, and add a ``DATABASES`` configuration with your database username, +password, host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database +instance you have manually installed within your infrastructure. + +.. code-block:: python + + # Database + DATABASES = { + 'default': { + 'ENGINE':'django.db.backends.postgresql_psycopg2', + 'NAME': 'seed', + 'USER': '', + 'PASSWORD': '', + 'HOST': '', + 'PORT': '', + } + } + + +.. note:: + + In the above database configuration, ``seed`` is the database name, this + is arbitrary and any valid name can be used as long as the database exists. + +create the database within the postgres ``psql`` shell: + +.. code-block:: psql + + CREATE DATABASE seed; + +or from the command line: + +.. code-block:: console + + createdb seed + + +create the database tables and migrations: + +.. code-block:: console + + python manage.py syncdb + python manage.py migrate + + +create a superuser to access the system + +.. code-block:: console + + $ python manage.py create_default_user --username=demo@example.com --organization=example --password=demo123 + + +.. note:: + + Every user must be tied to an organization, visit ``/app/#/profile/admin`` + as the superuser to create parent organizations and add users to them. + +Cache and Message Broker +^^^^^^^^^^^^^^^^^^^^^^^^ + +The SEED project relies on `redis`_ for both cache and message brokering, and +is available as an AWS `ElastiCache`_ service. +``local_untracked.py`` should be updated with the ``CACHES`` and ``CELERY_BROKER_URL`` +settings. + +.. _ElastiCache: https://aws.amazon.com/elasticache/ + +.. _redis: http://redis.io/ + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://seed-core-cache.ntmprk.0001.usw2.cache.amazonaws.com:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + +Running Celery the Background Task Worker +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +`Celery`_ is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, ``celery`` +can be started: + +.. code-block:: console + + celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler + +.. _Celery: http://www.celeryproject.org/ diff --git a/docs/code_documentation/3.1.0/_sources/data_model.rst.txt b/docs/code_documentation/3.1.0/_sources/data_model.rst.txt new file mode 100644 index 00000000..15650406 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/data_model.rst.txt @@ -0,0 +1,415 @@ +Data Model +========== + +.. image:: images/case-a.webp + +.. image:: images/case-b.webp + +.. image:: images/case-c.webp + +.. image:: images/case-d.webp + +.. image:: images/data-model.webp + + +.. todo:: Documentation below is out of state and needs updated. + +Our primary data model is based on a tree structure with BuildingSnapshot +instances as nodes of the tree and the tip of the tree referenced by a +CanonicalBuilding. + +Take the following example: a user has loaded a CSV file containing information +about one building and created the first BuildingSnapshot (BS0). At this point +in time, BS0 is linked to the first CanonicalBuilding (CB0), and CB0 is also +linked to BS0. + +.. code-block:: shell + + BS0 <-- CB0 + BS0 --> CB0 + +These relations are represented in the database as foreign keys from the +BuildingSnapshot table to the CanonicalBuilding table, and from the +CanonicalBuilding table to the BuildingSnapshot table. + +The tree structure comes to fruition when a building, BS0 in our case, is +matched with a new building, say BS1, enters the system and is auto-matched. + +Here BS1 entered the system and was matched with BS0. When a match occurs, +a new BuildingSnapshot is created, BS2, with the fields from the existing +BuildingSnapshot, BS0, and the new BuildingSnapshot, BS1, merged +together. If both the existing and new BuildingSnapshot have data for a +given field, the new record's fields are preferred and merged into the child, B3. + +The fields from new snapshot are preferred because that is the newer of the +two records from the perspective of the system. By preferring the most recent fields +this allows for evolving building snapshots over time. For example, if an existing +canonical record has a Site EUI value of 75 and some changes happen to a building +that cause this to change to 80 the user can submit a new record with that change. + +All BuildingSnapshot instances point to a CanonicalBuilding. + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 <-- CB0 + + BS0 --> CB0 + BS1 --> CB0 + BS2 --> CB0 + + +parents and children +^^^^^^^^^^^^^^^^^^^^ + +BuildingSnapshots also have linkage to other BuildingSnapshots in order to +keep track of their *parents* and *children*. This is represented in the +Django model as a many-to-many relation from BuildingSnapshot to BuildingSnapshot. +It is represented in the PostgreSQL database as an additional seed_buildingsnapshot_children +table. + + +In our case here, BS0 and BS1 would both have *children* BS2, and BS2 would +have *parents* BS0 and BS1. + +.. note:: + + throughout most of the application, the ``search_buildings`` endpoint + is used to search or list active building. This is to say, buildings that + are pointed to by an active CanonicalBuilding. + The ``search_mapping_results`` endpoint allows the search of buildings + regardless of whether the BuildingSnapshot is pointed to by an active + CanonicalBuilding or not and this search is needed during the mapping + preview and matching sections of the application. + + + +For illustration purposes let's suppose BS2 and a new building BS3 match to form a child BS4. + ++--------+-------+ +| parent | child | ++========+=======+ +| BS0 | BS2 | ++--------+-------+ +| BS1 | BS2 | ++--------+-------+ +| BS2 | BS4 | ++--------+-------+ +| BS3 | BS4 | ++--------+-------+ + + +And the corresponding tree would look like: + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 BS3 + \ / + BS4 <-- CB0 + + BS0 --> CB0 + BS1 --> CB0 + BS2 --> CB0 + BS3 --> CB0 + BS4 --> CB0 + +matching +-------- + +During the auto-matching process, if a *raw* BuildingSnapshot matches an +existing BuildingSnapshot instance, then it will point to the existing +BuildingSnapshot instance's CanonicalBuilding. In the case where there is no +existing BuildingSnapshot to match, a new CanonicalBuilding will be created, as +happened to B0 and C0 above. + ++-------+--------+--------+-------------+ +| field | BS0 | BS1 | BS2 (child) | ++=======+========+========+=============+ +| id1 | **11** | 11 | 11 | ++-------+--------+--------+-------------+ +| id2 | | **12** | 12 | ++-------+--------+--------+-------------+ +| id3 | **13** | | 13 | ++-------+--------+--------+-------------+ +| id4 | 14 | **15** | 15 | ++-------+--------+--------+-------------+ + + +manual-matching vs auto-matching +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Since BuildingSnapshots can be manually matched, there is the possibility for +two BuildingSnapshots each with an active CanonicalBuilding to match and the +system has to choose to move only one CanonicalBuilding to the tip of the tree +for the primary BuildingSnapshot and *deactivate* the secondary +BuildingSnapshot's CanonicalBuilding. + +Take for example: + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 BS3 + \ / + BS4 <-- CB0 (active: True) BS5 <-- CB1 (active: True) + +If a user decides to manually match BS4 and BS5, the system will take the +primary BuildingSnapshot's CanonicalBuilding and have it point to their +child and deactivate CB1. The deactivation is handled by setting a field +on the CanonicalBuilding instance, *active*, from ``True`` to ``False``. + +Here is what the tree would look like after the manual match of **BS4** and +**BS5**: + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 BS3 + \ / + BS4 BS5 <-- CB1 (active: False) + \ / + BS6 <-- CB0 (active: True) + +Even though BS5 is pointed to by a CanonicalBuilding, CB1, BS5 will not be +returned by the normal ``search_buildings`` endpoint because the +CanonicalBuilding pointing to it has its field ``active`` set to ``False``. + +.. note:: + anytime a match is **unmatched** the system will create a new + CanonicalBuilding or set an existing CanonicalBuilding's active field to + ``True`` for any leaf BuildingSnapshot trees. + +what really happens to the BuildingSnapshot table on import (and when) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The above is conceptually what happens but sometimes the devil is in the details. +Here is what happens to the BuildingSnapshot table in the database when records +are imported. + +Every time a record is added at least two BuildingSnapshot records are created. + +Consider the following simple record: + ++-------------+-------------+---------------------+-----------+--------------+ +| Property Id | Year Ending | Property Floor Area | Address 1 | Release Date | ++=============+=============+=====================+===========+==============+ +| 499045 | 2000 | 1234 | 1 fake st | 12/12/2000 | ++-------------+-------------+---------------------+-----------+--------------+ + +The first thing the user is upload the file. When the user sees the +"Successful Upload!" dialog one record has been added to the +BuildingSnapshot table. + +This new record has an id (73700 in this case) and a created and +modified timestamp. Then there are a lot of empty fields and a +source_type of 0. Then there is the extra_data column which contains +the contents of the record in key-value form: + +:Address 1: "1 fake st" +:Property Id: "499045" +:Year Ending: "2000" +:Release Date: "12/12/2000" +:Property Floor Area: "1234" + +And a corresponding extra_data_sources that looks like + +:Address 1: 73700 +:Property Id: 73700 +:Year Ending: 73700 +:Release Date: 73700 +:Property Floor Area: 73700 + + +All of the fields that look like _source_id are also populated +with 73700 E.G. owner_postal_code_source_id. + +The other fields of interest are the organization field which +is populated with the user's default organization and the import_file_id +field which is populated with a reference to a data_importer_importfile record. + +At this point the record has been created before the user hits the +"Continue to data mapping" button. + +The second record (id = 73701) is created by the time the user gets to the screen +with the "Save Mappings" button. This second record has the following fields populated: + +- id +- created +- modified +- pm_property_id +- year_ending +- gross_floor_area +- address_line_1 +- release_date +- source_type (this is 2 instead of 0 as with the other record) +- import_file_id +- organization_id. + +That is all. All other fields are empty. In this case that is all that happens. + +Now consider the same user uploading a new file from the next year that looks like + ++-------------+-------------+---------------------+-----------+--------------+ +| Property Id | Year Ending | Property Floor Area | Address 1 | Release Date | ++=============+=============+=====================+===========+==============+ +| 499045 | 2000 | 1234 | 1 fake st | 12/12/2001 | ++-------------+-------------+---------------------+-----------+--------------+ + +As before one new record is created on upload. This has id 73702 and follows the same +pattern as 73700. And similarly 73703 is created like 73701 before the "Save Mappings" +button appears. + +However this time the system was able to make a match with an existing record. +After the user clicks the "Confirm mappings & start matching" button a new record +is created with ID 73704. + +73704 is identical to 73703 (in terms of contents of the BuildingSnapshot table only) +with the following exceptions: + +- created and modified timestamps are different +- match type is populated and has a value of 1 +- confidence is populated and has a value of .9 +- source_type is 4 instead of 2 +- canonical_building_id is populated with a value +- import_file_id is NULL +- last_modified_by_id is populated with value 2 (This is a key into the landing_seeduser table) +- address_line_1_source_id is 73701 +- gross_floor_area_source_id is populated with value 73701 +- pm_property_id_source_id is populated with 73701 +- release_date_source_id is populated with 73701 +- year_ending_source_id is populated with 73701 + +what really happens to the CanonicalBuilding table on import (and when) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In addition to the BuildingSnapshot table the CanonicalBuilding table is also updated +during the import process. To summarize the above 5 records were created in the +BuildingSnapshot table: + +1. 73700 is created from the raw 2000 data +2. 73701 is the mapped 2000 data, +3. 73702 is created from the raw 2001 data +4. 73703 is the mapped 2001 data +5. 73704 is the result of merging the 2000 and 2001 data. + +In this process CanonicalBuilding is updated twice. First when the 2000 record is imported the +CanonicalBuilding gets populated with one new row at the end of the matching step. +I.E. when the user sees the "Load More Data" screen. At this point there is a new row that looks like + ++--------+--------+-----------------------+ +| id | active | canonical_building_id | ++========+========+=======================+ +| 20505 | TRUE | 73701 | ++--------+--------+-----------------------+ + +At this point there is one new canonical building and that is the BuildingSnapshot with +id 73701. Next the user uploads the 2001 data. When the "Matching Results" screen +appears the CanonicalBuilding table has been updated. Now it looks like + ++--------+--------+-----------------------+ +| id | active | canonical_building_id | ++========+========+=======================+ +| 20505 | TRUE | 73704 | ++--------+--------+-----------------------+ + +There is still only one canonical building but now it is the BuildingSnapshot record +that is the result of merging the 2000 and 2001 data: id = 73704. + +organization +^^^^^^^^^^^^ + +BuildingSnapshots belong to an Organization field that is a foreign key into the organization +model (orgs_organization in Postgres). + +Many endpoints filter the buildings based on the organizations the requesting user +belongs to. E.G. get_buildings changes which fields are returned based on the +requesting user's membership in the BuildingSnapshot's organization. + +\*_source_id fields +^^^^^^^^^^^^^^^^^^^ + +Any field in the BuildingSnapshot table that is populated with data from a +submitted record will have a corresponding _source_id field. E.G +pm_property_id has pm_property_id_source_id, +address_line_1 has address_line_1_source_id, +etc... + +These are foreign keys into the BuildingSnapshot that is the source of that +value. To extend the above table + ++-------+--------+--------+-------------+------------------------+ +| field | BS0 | BS1 | BS2 (child) | BS2 (child) _source_id | ++=======+========+========+=============+========================+ +| id1 | **11** | | 11 | BS0 | ++-------+--------+--------+-------------+------------------------+ +| id2 | | **12** | 12 | BS1 | ++-------+--------+--------+-------------+------------------------+ + +**NOTE:** The BuildingSnapshot records made from the raw input file have all the +_source_id fields populated with that record's ID. The non-canonical BuildingSnapshot +records created from the mapped data have none set. The canonical BuildingSnapshot +records that are the result of merging two records have only the _source_id fields +set where the record itself has data. E.G. in the above address_line_1 is set to +"1 fake st." so there is a value in the canonical BuildingSnapshot's address_line_1_source_id +field. However there is no block number so block_number_source_id is empty. This +is unlike the two raw BuildingSnapshot records who also have no block_number but +nevertheless have a block_number_source_id populated. + +extra_data +^^^^^^^^^^ + +The BuildingSnapshot model has many "named" fields. Fields like "address_line_1", +"year_built", and "pm_property_id". However the users are allowed to submit files +with arbitrary fields. Some of those arbitrary fields can be mapped to "named" +fields. E.G. "Street Address" can usually be mapped to "Address Line 1". +For all the fields that cannot be mapped like that there is the extra_data field. + +extra_data is Django json field that serves as key-value storage for other +user-submitted fields. As with the other "named" fields there is a corresponding +extra_data_sources field that serves the same role as the other _source_id fields. +E.G. If a BuildingSnapshot has an extra_data field that looks like + +:an_unknown_field: 1 +:something_else: 2 + +It should have an extra_data_sources field that looks like + +:an_unknown_field: some_BuildingSnapshot_id +:something_else: another_BuildingSnapshot_id + +saving and possible data loss +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When saving a Property file some fields that are truncated if too long. +The following are truncated to 255 characters + +- jurisdiction_tax_lot_id +- pm_property_id +- custom_id_1 +- ubid +- lot_number +- block_number +- district +- owner +- owner_email +- owner_telephone +- owner_address +- owner_city_state +- owner_postal_code + +And the following are truncated to 255: + +- property_name +- address_line_1 +- address_line_2 +- city +- postal_code +- state_province +- building_certification + +No truncation happens to any of the fields stored in extra_data. diff --git a/docs/code_documentation/3.1.0/_sources/data_quality.rst.txt b/docs/code_documentation/3.1.0/_sources/data_quality.rst.txt new file mode 100644 index 00000000..49e06799 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/data_quality.rst.txt @@ -0,0 +1,9 @@ +Data Quality +============ + +Data quality checks are run after the data are paired, during import of Properties/TaxLots, or on-demand by selecting rows in the inventory +page and clicking the action button. This checks whether any default or user-defined Rules are broken or satisfied by Property/TaxLot records. + +Notably, in most cases when data quality checks are run, Labels can be applied for any broken Rules that have a Label. +To elaborate, Rules can have an attached Label. When a data quality check is run, records that break one of these "Labeled Rules" +are then given that Label. The case where this Label attachment does not happen is during import due to performance reasons. diff --git a/docs/code_documentation/3.1.0/_sources/deployment.rst.txt b/docs/code_documentation/3.1.0/_sources/deployment.rst.txt new file mode 100644 index 00000000..e2e3d347 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/deployment.rst.txt @@ -0,0 +1,57 @@ +Deployment Guide +================ + +SEED is intended to be installed on Linux instances in the cloud (e.g., AWS), and on local hardware. SEED Platform does not officially support Windows for production deployment. If this is desired, see the Django `notes`_. + +.. _notes: https://docs.djangoproject.com/en/1.7/howto/windows/ + +.. toctree:: + :maxdepth: 2 + + aws + linux + docker + kubernetes_deployment + +Migrations +---------- + +Migrations are handles through Django; however, various versions have customs actions for the migrations. See the :doc:`migrations page ` for more information. + + +Monitoring +---------- + +Sentry +^^^^^^ + +Sentry can monitor your webservers for any issues. To enable sentry add the following to +your local_untracked.py files after setting up your Sentry account on sentry.io. + +The RAVEN_CONFIG is used for the backend and the SENTRY_JS_DSN is used for the frontend. At the moment, +it is recommended to setup two sentry projects, one for backend and one for frontend. + +.. code-block:: python + + import sentry_sdk + from sentry_sdk.integrations.django import DjangoIntegration + from sentry_sdk.integrations.celery import CeleryIntegration + + sentry_sdk.init( + dsn="https://@.ingest.sentry.io/", + integrations=[ + DjangoIntegration(), + CeleryIntegration(), + ], + + # Set traces_sample_rate to 1.0 to capture 100% + # of transactions for performance monitoring. + # We recommend adjusting this value in production. + traces_sample_rate=1.0, + + # If you wish to associate users to errors (assuming you are using + # django.contrib.auth) you may enable sending PII data. + send_default_pii=True + ) + + SENTRY_JS_DSN = 'https://@sentry.io/' diff --git a/docs/code_documentation/3.1.0/_sources/developer_resources.rst.txt b/docs/code_documentation/3.1.0/_sources/developer_resources.rst.txt new file mode 100644 index 00000000..e92c7bce --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/developer_resources.rst.txt @@ -0,0 +1,450 @@ +Developer Resources +=================== + +.. toctree:: + migrations + translation + +General Notes +------------- + +Pre-commit +^^^^^^^^^^ +We use precommit commits for formatting. Set it up locally with + +.. code-block:: bash + + pre-commit install + +Ruff Settings +^^^^^^^^^^^^^^ + +Ruff is used to statically verify code syntax. To run ruff locally call: + +.. code-block:: bash + + tox -e precommit -- ruff + tox -e precommit -- ruff-format + +Python Type Hints +^^^^^^^^^^^^^^^^^ + +Python type hints are beginning to be added to the SEED codebase. The benefits are +eliminating some accidental typing mistakes to prevent bugs as well as a better IDE +experience. + +Usage +***** + +SEED does not require exhaustive type annotations, but it is recommended you add them if you +create any new functions or refactor any existing code where it might be beneficial (e.g. types +that appear ambiguous or that the IDE can't determine) and not require a ton of additional effort. + +When applicable, we recommend you use `built-in collection types `_ +such as :code:`list`, :code:`dict` or :code:`tuple` instead of the capitalized types +from the :code:`typing` module. You can also use ``TypedDict`` and ``NotRequired`` from the ``typing_extensions`` +package to specify the types of required/optional keys of dictionaries. + +Common gotchas: + +- If trying to annotate a class method with the class itself, import :code:`from __future__ import annotations` +- If you're getting warnings about runtime errors due to a type name, make sure your IDE is set up to point to an environment with python 3.9 +- If you're wasting time trying to please the type checker, feel free to throw :code:`# type: ignore` on the problematic line (or at the top of the file to ignore all issues for that file) + +Type Checking +************* + +CI currently runs static type checking on the codebase using `mypy `_. For +your own IDE, we recommend the following extensions: + +- VSCode: `Pylance `_ (uses Microsoft's Pyright type checking) + +To run the same typechecking applied in CI (i.e., using mypy) you can run the following + +.. code-block:: bash + + tox -e mypy + + +Django Notes +------------ + +Adding New Fields to Database +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Adding new fields to SEED can be complicated since SEED has a mix of typed fields (database fields) and extra data +fields. Follow the steps below to add new fields to the SEED database: + +#. Add the field to the PropertyState or the TaxLotState model. Adding fields to the Property or TaxLot models is more complicated and not documented yet. +#. Add field to list in the following locations: + +- models/columns.py: Column.DATABASE_COLUMNS +- TaxLotState.coparent or PropertyState.coparent: SQL query and keep_fields + +#. Run `./manage.py makemigrations` +#. Add in a Python script in the new migration to add in the new column into every organizations list of columns. Note that the new_db_fields will be the same as the data in the Column.DATABASE_COLUMNS that were added. + + .. code-block:: python + + def forwards(apps, schema_editor): + Column = apps.get_model("seed", "Column") + Organization = apps.get_model("orgs", "Organization") + + new_db_fields = [ + { + 'column_name': 'geocoding_confidence', + 'table_name': 'PropertyState', + 'display_name': 'Geocoding Confidence', + 'column_description': 'Geocoding Confidence', + 'data_type': 'number', + }, { + 'column_name': 'geocoding_confidence', + 'table_name': 'TaxLotState', + 'display_name': 'Geocoding Confidence', + 'column_description': 'Geocoding Confidence', + 'data_type': 'number', + } + ] + + # Go through all the organizations + for org in Organization.objects.all(): + for new_db_field in new_db_fields: + columns = Column.objects.filter( + organization_id=org.id, + table_name=new_db_field['table_name'], + column_name=new_db_field['column_name'], + is_extra_data=False, + ) + + if not columns.count(): + new_db_field['organization_id'] = org.id + Column.objects.create(**new_db_field) + elif columns.count() == 1: + # If the column exists, then update the display_name and data_type if empty + c = columns.first() + if c.display_name is None or c.display_name == '': + c.display_name = new_db_field['display_name'] + if c.data_type is None or c.data_type == '' or c.data_type == 'None': + c.data_type = new_db_field['data_type'] + for col in columns: + # If the column exists, then update the column_description if empty + if c.column_description is None or c.column_description == '': + c.column_description = new_db_field['column_description'] + c.save() + else: + print(" More than one column returned") + + + class Migration(migrations.Migration): + dependencies = [ + ('seed', '0090_auto_20180425_1154'), + ] + + operations = [ + ... existing db migrations ..., + migrations.RunPython(forwards), + ] + + +#. Run migrations `./manage.py migrate` +#. Run unit tests, fix failures. Below is a list of files that need to be fixed (this is not an exhaustive list) + +- test_mapping_data.py:test_keys +- test_columns.py:test_column_retrieve_schema +- test_columns.py:test_column_retrieve_db_fields + +#. (Optional) Update example files to include new fields +#. Test import workflow with mapping to new fields + + +NGINX Notes +----------- + +Toggle *maintenance mode* to display a maintenance page and prevent access to all site resources including API endpoints: + +.. code-block:: bash + + docker exec seed_web ./docker/maintenance.sh on + docker exec seed_web ./docker/maintenance.sh off + + +AngularJS Integration Notes +--------------------------- + +Template Tags +^^^^^^^^^^^^^ + +Angular and Django both use `{{` and `}}` as variable delimiters, and thus the AngularJS variable delimiters are +renamed `{$` and `$}`. + +.. code-block:: JavaScript + + window.SEED.apps.seed = angular.module('SEED', ['$interpolateProvider', ($interpolateProvider) => { + $interpolateProvider.startSymbol('{$'); + $interpolateProvider.endSymbol('$}'); + }]); + +Django CSRF Token and AJAX Requests +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For ease of making angular `$http` requests, we automatically add the CSRF token to all `$http` requests as +recommended by http://django-angular.readthedocs.io/en/latest/integration.html#xmlhttprequest + +.. code-block:: JavaScript + + window.SEED.apps.seed.run(($http, $cookies) => { + $http.defaults.headers.common['X-CSRFToken'] = $cookies['csrftoken']; + }); + + +Routes and Partials or Views +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Routes in `static/seed/js/seed.js` (the normal angularjs `app.js`) + + +.. code-block:: JavaScript + + SEED_app.config(['stateHelperProvider', '$urlRouterProvider', '$locationProvider', (stateHelperProvider, $urlRouterProvider, $locationProvider) => { + stateHelperProvider + .state({ + name: 'home', + url: '/', + templateUrl: static_url + 'seed/partials/home.html' + }) + .state({ + name: 'profile', + url: '/profile', + templateUrl: static_url + 'seed/partials/profile.html', + controller: 'profile_controller', + resolve: { + auth_payload: ['auth_service', '$q', 'user_service', function (auth_service, $q, user_service) { + var organization_id = user_service.get_organization().id; + return auth_service.is_authorized(organization_id, ['requires_superuser']); + }], + user_profile_payload: ['user_service', function (user_service) { + return user_service.get_user_profile(); + }] + } + }); + }]); + +HTML partials in `static/seed/partials/` + +Logging +------- + +Information about error logging can be found here - https://docs.djangoproject.com/en/1.7/topics/logging/ + +Below is a standard set of error messages from Django. + +A logger is configured to have a log level. This log level describes the severity of +the messages that the logger will handle. Python defines the following log levels: + +.. code-block:: bash + + DEBUG: Low level system information for debugging purposes + INFO: General system information + WARNING: Information describing a minor problem that has occurred. + ERROR: Information describing a major problem that has occurred. + CRITICAL: Information describing a critical problem that has occurred. + +Each message that is written to the logger is a Log Record. The log record is stored +in the web server & Celery + + +BEDES Compliance and Managing Columns +------------------------------------- + +Columns that do not represent hardcoded fields in the application are represented using +a Django database model defined in the seed.models module. The goal of adding new columns +to the database is to create seed.models.Column records in the database for each column to +import. Currently, the list of Columns is dynamically populated by importing data. + +There are default mappings for ESPM are located here: + + https://github.com/SEED-platform/seed/blob/develop/seed/lib/mappings/data/pm-mapping.json + + +Resetting the Database +---------------------- + +This is a brief description of how to drop and re-create the database +for the seed application. + +The first two commands below are commands distributed with the +Postgres database, and are not part of the SEED application. The third +command below will create the required database tables for SEED and +setup initial data that the application expects (e.g. initial columns for +BEDES). The last command below (spanning multiple lines) will create a +new superuser and organization that you can use to login to the +application, and from there create any other users or organizations +that you require. + +Below are the commands for resetting the database and creating a new +user: + +.. code-block:: bash + + createuser -U seed seeduser + + psql -d postgres -U seeduser -c 'DROP DATABASE seed;' + psql -d postgres -U seeduser -c 'CREATE DATABASE seed;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;' + + ./manage.py migrate + ./manage.py create_default_user \ + --username=demo@seed-platform.org \ + --password=password \ + --organization=testorg + +Restoring a Database Dump +------------------------- + +.. code-block:: bash + + psql -d postgres -U seeduser -c 'DROP DATABASE seed;' + psql -d postgres -U seeduser -c 'CREATE DATABASE seed;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;' + psql -d seed -U seeduser -c 'SELECT timescaledb_pre_restore();' + + # restore a previous database dump (must be pg_restore 12+) + pg_restore -d seed -U seeduser /backups/prod-backups/prod_20191203_000002.dump + # if any errors appear during the pg_restore process check that the `installed_version` of the timescaledb extension where the database was dumped matches the extension version where it's being restored + # `SELECT default_version, installed_version FROM pg_available_extensions WHERE name = 'timescaledb';` + + psql -d seed -U seeduser -c 'SELECT timescaledb_post_restore();' + + ./manage.py migrate + + # if needed add a user to the database + ./manage.py create_default_user \ + --username=demo@seed-platform.org \ + --password=password \ + --organization=testorg + +If restoring a production backup to a different deployment update the site settings for password reset emails, and disable celerybeat Salesforce updates/emails: + +.. code-block:: bash + + ./manage.py shell + + from django.contrib.sites.models import Site + site = Site.objects.first() + site.domain = 'dev1.seed-platform.org' + site.name = 'SEED Dev1' + site.save() + + from seed.models import Organization + Organization.objects.filter(salesforce_enabled=True).update(salesforce_enabled=False) + + from django_celery_beat.models import PeriodicTask, PeriodicTasks + PeriodicTask.objects.filter(enabled=True, name__startswith='salesforce_sync_org-').update(enabled=False) + PeriodicTasks.update_changed() + + +Migrating the Database +---------------------- + +Migrations are handles through Django; however, various versions have customs actions for the migrations. See the :doc:`migrations page ` for more information based on the version of SEED. + + +Testing +------- + +JS tests can be run with Jasmine at the url `/angular_js_tests/`. + +Python unit tests are run with + +.. code-block:: bash + + python manage.py test --settings=config.settings.test + +Note on geocode-related testing: + Most of these tests use VCR.py and cassettes to capture and reuse recordings of HTTP requests and responses. Given that, unless you want to make changes and/or refresh the cassettes/recordings, there isn't anything needed to run the geocode tests. + + In the case that the geocoding logic/code is changed or you'd like to the verify the MapQuest API is still working as expected, you'll need to run the tests with a small change. Namely, you'll want to provide the tests with an API key via an environment variable called "TESTING_MAPQUEST_API_KEY" or within your local_untracked.py file with that same variable name. + + In order to refresh the actual cassettes, you'll just need to delete or move the old ones which can be found at ".seed/tests/data/vcr_cassettes". The API key should be hidden within the cassettes, so these new cassettes can and should be pushed to GitHub. + +Run coverage using + +.. code-block:: bash + + coverage run manage.py test --settings=config.settings.test + coverage report --fail-under=83 + +Python compliance uses Ruff + +.. code-block:: bash + + tox -e precommit -- ruff + tox -e precommit -- ruff-format + +JavaScript compliance uses ESLint, SCSS compliance uses StyleLint, and HTML compliance uses Prettier + +.. code-block:: bash + + npm run lint + npm run lint:fix + +Building Documentation +---------------------- + +Older versions of the source code documentation are (still) on readthedocs; however, newer versions are built and pushed to the seed-website repository manually. To build the documentation follow the script below: + +.. code-block:: bash + + cd docs + rm -rf htmlout + sphinx-build -b html source htmlout + +For releasing, copy the ``htmlout`` directory into the seed-platform's website repository under ``docs/code_documentation/``. Make sure to add the new documentation to the table in the ``docs/developer_resources.md``. + +Contribution Instructions / Best Practices +------------------------------------------ + +If this is the first time contributing and you are outside of the DOE National Lab system, then you will need to review and fill out the contribution agreement which is found in `SEED's Contribution Agreement in the GitHub repository`_ + +The desired workflow for development and submitting changes is the following: + +#. Fork the repository on GitHub if you do not have access to the repository, otherwise, work within the https://github.com/seed-platform/seed repository. +#. Ensure there is a ticket/issue created for the work you are doing. Verify that the ticket is assigned to you and that it is part of the latest project board on the GitHub site (https://github.com/orgs/SEED-platform/projects). +#. Move the ticket/issue to 'In Progress' in the GitHub project tracker when you begin work +#. Create a branch off of develop (unless it is a hotfix, then branch of the appropriate tag). The recommended naming convention is -short-descriptive-name. +#. Make changes and write a test for the code added. +#. Make sure tests pass locally. Most branches created and pushed to GitHub will be tested automatically. +#. Upon completion of the work, create a pull request (PR) against the develop branch (or hotfix branch if applicable). In the PR description fill out the requested information and include the issue number (e.g., #1234). +#. Assign one label to the PR (not the ticket/issue) in order to auto-populate change logs (e.g., Bug, Feature, Maintenance, Performance, DoNotPublish) This is required and CI will fail if not present. + * **Bug** (these will appear as "Bug Fixes" in the change log) + * **Feature** (features will appear as “New Features” item in the change log) + * **Enhancement** (these will appear as “Improvements" in the change log) + * **Maintenance** (these will appear under “Maintenance" in the change log) + * **Performance** (these will appear under “Maintenance" in the change log) + * **Documentation** (these will appear under “Maintenance" in the change log) + * **Do not publish** (these will no appear in the change log) +#. Ensure all tests pass. +#. Assign a reviewer to the PR. +#. If the reviewer requests changes, then addresses changes and re-assign the reviewer as needed. +#. Once approved, merge the PR! +#. Move the related ticket(s)/issue(s) to the 'Ready to Deploy' column in the GitHub project tracker. + +Release Instructions +-------------------- + +To make a release do the following: + +#. Create a branch from develop to prepare the updates (e.g., 2.21.0-release-prep). +#. Update the root ``package.json`` file with the release version number, and then run ``npm install``. Always use MAJOR.MINOR.RELEASE. +#. Update the ``docs/sources/migrations.rst`` file with any required actions. +#. Commit the changes and push the release prep branch to GitHub, then go to the Releases page to draft a new release which will generate the changelog. +#. Copy the GitHub changelog results into ``CHANGELOG.md``. Cleanup the formatting and items as needed (make sure the spelling is correct, starts with a capital letter, if any PRs were missing the ``Do not publish`` label, etc.) and push the changelog update. +#. Make sure that any new UI needing localization has been tagged for translation, and that any new translation keys exist in the lokalise.com project. (see :doc:`translation documentation `). +#. Create PR for release preparation and merge after tests/reviews pass. +#. Create a new Release using the develop branch and new release number as the tag (https://github.com/SEED-platform/seed/releases). Include list of changes since previous release (e.g., the additions to ``CHANGELOG.md``). +#. Locally, merge the ``develop`` branch into the ``main`` branch and push. +#. Verify that the Docker versions are built and pushed to Docker Hub (https://hub.docker.com/r/seedplatform/seed/tags/). +#. Publish the new documentation in the seed-platform website repository (see instructions above under Building Documentation). + +.. _`SEED's Contribution Agreement in the GitHub repository`: https://github.com/SEED-platform/seed/blob/develop/.github/CONTRIBUTING.md diff --git a/docs/code_documentation/3.1.0/_sources/docker.rst.txt b/docs/code_documentation/3.1.0/_sources/docker.rst.txt new file mode 100644 index 00000000..a0208c34 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/docker.rst.txt @@ -0,0 +1,128 @@ +======================== +Docker Deployment on AWS +======================== + +Amazon Web Services (`AWS`_) provides the preferred hosting for the SEED Platform. + +**seed** is a `Django Project`_ and Django's documentation is an excellent place for general +understanding of this project's layout. + +.. _Django Project: https://www.djangoproject.com/ + +.. _AWS: http://aws.amazon.com/ + +Installation +^^^^^^^^^^^^ + +Ubuntu server 18.04 or newer with a m5ad.xlarge (if using in Production instance) + +* After launching the instance, run the following commands to install docker. + +.. code-block:: console + + # Install any upgrades + sudo apt-get update + sudo apt-get upgrade -y + + # Remove any old docker engines + sudo apt-get remove docker docker-engine docker.io containerd runc + + # Install docker community edition + sudo apt-get update + sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + sudo add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) \ + stable" + + sudo apt-get update + sudo apt-get install -y docker-ce docker-ce-cli containerd.io + # Add your user to the docker group + sudo groupadd docker + sudo usermod -aG docker $USER + newgrp docker + +.. note:: It is okay if the first command fails + +* Verify that the DNS is working correctly. Run the following and verify the response lists IPs (v6 most likely) + +.. code-block:: console + + # verify that the dns resolves + docker run --rm seedplatform/seed getent hosts seed-platform.org + # or + docker run --rm tutum/dnsutils nslookup email.us-west-2.amazonaws.com + +* Install Docker compose + +.. code-block:: console + + sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose + +* Checkout SEED (or install from the releases). + +.. code-block:: console + + git clone + +* Add in the Server setting into profile.d. For example add the content below (appropriately filled out) into /etc/profile.d/seed.sh + +.. code-block:: console + + export POSTGRES_USER=seed + export POSTGRES_DB=seed + export POSTGRES_PASSWORD=GDEus3fasd1askj89QkAldjfX + export POSTGRES_PORT=5432 + export SECRET_KEY="96=7jg%_&1-z9c9qwwu2@w$hb3r322yf3lz@*ekw-1@ly-%+^" + + # The admin user is only valid only until the database is restored + export SEED_ADMIN_USER=user@seed-platform.org + export SEED_ADMIN_PASSWORD="7FeBWal38*&k3jlfa92lakj8ih4" + export SEED_ADMIN_ORG=default + + # For SES + export AWS_ACCESS_KEY_ID= + export AWS_SECRET_ACCESS_KEY= + export AWS_SES_REGION_NAME=us-west-2 + export AWS_SES_REGION_ENDPOINT=email.us-west-2.amazonaws.com + export SERVER_EMAIL=user@seed-platform.org + + +* Before launching the first time, make sure the persistent volumes and the backup directory exist. + +.. code-block:: console + + docker volume create --name=seed_pgdata + docker volume create --name=seed_media + + mkdir -p $HOME/seed-backups + +.. note:: Make sure to have the seed-backups in your path, otherwise the db-postgres container will not launch. + +* Launch the project + +.. code-block:: console + + cd + ./deploy.sh + + +Deploying with Docker +^^^^^^^^^^^^^^^^^^^^^ + +The preferred way to deploy with Docker is using docker swarm and docker stack. +Look at the `deploy.sh script`_ for implementation details. + +The short version is to simply run the command below. Note that the passing of the docker-compose.yml filename is not required if using docker-compose.local.yml. + +```bash +./deploy.sh docker-compose.local.yml +``` + +If deploying using a custom docker-compose yml file, then simple replace the name in the command above. + + +.. _`deploy.sh script`: https://github.com/SEED-platform/seed/blob/develop/deploy.sh +.. _`JSON Type`: https://www.postgresql.org/docs/9.4/datatype-json.html diff --git a/docs/code_documentation/3.1.0/_sources/faq.rst.txt b/docs/code_documentation/3.1.0/_sources/faq.rst.txt new file mode 100644 index 00000000..8c3231be --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/faq.rst.txt @@ -0,0 +1,68 @@ +Frequently Asked Questions +########################## + +Here are some frequently asked questions and/or issues. + +.. contents:: + :local: + :depth: 2 + + + +Questions +========= +.. _whatisseed: + +What is the SEED Platform? +-------------------------- + +The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity. + +The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL. + +The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions. + +Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy. + + +Issues +====== + +.. _domain: + +Why is the domain set to example.com? +------------------------------------- + +If you see example.com in the emails that are sent from your hosted version of SEED then you will +need to update your django sites object in the database. + +.. code-block:: bash + + $ ./manage.py shell + + from django.contrib.sites.models import Site + one = Site.objects.all()[0] + one.domain = 'newdomain.org' + one.name = 'SEED' + one.save() + + +.. _staticfiles: + +Why aren't the static assets being served correctly? +---------------------------------------------------- + +Make sure that your local_untracked.py file does not have STATICFILES_STORAGE set to anything. If so, +then comment out that section and redeploy/recollect/compress your static assets. diff --git a/docs/code_documentation/3.1.0/_sources/getting_started.rst.txt b/docs/code_documentation/3.1.0/_sources/getting_started.rst.txt new file mode 100644 index 00000000..d0ae9497 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/getting_started.rst.txt @@ -0,0 +1,11 @@ +Getting Started +=============== + +Development Setup +----------------- + +.. toctree:: + :maxdepth: 2 + + setup_osx + setup_docker diff --git a/docs/code_documentation/3.1.0/_sources/help.rst.txt b/docs/code_documentation/3.1.0/_sources/help.rst.txt new file mode 100644 index 00000000..add7485b --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/help.rst.txt @@ -0,0 +1,28 @@ +Help +==== + +For SEED Platform Users +^^^^^^^^^^^^^^^^^^^^^^^ + +Please visit our website for information, tutorials, and documentation to help you learn how to use SEED. + +https://seed-platform.org + +The SEED Users Forum is where you can review user announcements, workflow questions, and join to connect with other users. + +https://lists.buildingenergytools.org/g/SEEDusers/topics + +For general inquiries or help on a specific problem, please fill out a request on the building data tools website help desk and select SEED as the relevant tool: + +https://buildingdata.energy.gov/#/help-desk + +For SEED Platform Developers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The open-source code is available on the GitHub organization SEED-Platform and contains various repositories for the different components of the platform such as the main SEED application, a Python SEED client to communicate to SEED's API and various example datasets. + +https://github.com/SEED-platform + +The SEED Developers Forum contains various topics and joining enables you to connect with other developers. It is recommended to join this forum to submit developer questions, features requests, and report issues as needed. Also, submitting issues on GitHub is encouraged. + +https://lists.buildingenergytools.org/g/SEEDdevelopers/topics diff --git a/docs/code_documentation/3.1.0/_sources/index.rst.txt b/docs/code_documentation/3.1.0/_sources/index.rst.txt new file mode 100644 index 00000000..68ea4f7e --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/index.rst.txt @@ -0,0 +1,51 @@ +.. SEED Platform documentation master file, created by + sphinx-quickstart on Tue Mar 1 14:43:22 2016. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Standard Energy Efficiency Data (SEED) Platform +=============================================== + +The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity. + +The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL. + +The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions. + +Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy. + + +.. toctree:: + :maxdepth: 2 + + getting_started + deployment + api + data_model + data_quality + mapping + matching + modules + developer_resources + license + help + faq + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/code_documentation/3.1.0/_sources/kubernetes_deployment.rst.txt b/docs/code_documentation/3.1.0/_sources/kubernetes_deployment.rst.txt new file mode 100644 index 00000000..3f70fdc1 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/kubernetes_deployment.rst.txt @@ -0,0 +1,251 @@ +Kubernetes Deployment Guide with Helm +===================================== + +Kubernetes is a robust container orchestration system for easy application deployment and management. Helm takes that a step further with by packaging up required helm "charts" into one deployment command. + +Setup +----- + +Cluster +^^^^^^^ +In order to deploy the SEED platform on a Kubernetes you will need "cluster" which will be configured by your cloud service of choice. Each installation will be slightly different depending on the service. +Below are links to quick-start guides for provisioning a cluster and connecting. These instructions are specifically for AWS, but after the Kubernetes cluster is launched, the helm commands can be used in +the same way. + +* Amazon Web Services (`AWS`_) +* Google Cloud Platform (`GCP`_) +* Azure (`AKS`_) + +AWS CLI Configuration +~~~~~~~~~~~~~~~~~~~~~ +Download and configure the AWS CLI with instructions: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html + +.. code-block:: console + + aws configure + AWS Access Key ID [None]: (from account) + AWS Secret Access Key [None]: (from account) + Default region name [None]: us-east-1 + Default output format [None]: json + +Kubectl +^^^^^^^ +Download and install Kubectl: + +- `Windows `_ +- Mac (with Homebrew) :code:`brew install kubectl` + ``` + brew install kubectl + ``` + +Kubectl is the main function in which you will be interfacing with your deployed application on your cluster. This CLI is what connects you to your cluster that you have just provisioned. +If your cloud service did not have you configure kubectl in your cluster setup, you can download it `here `_. Once kubectl is installed and configured to your cluster +you can run some simple commands to ensure its working properly: + +.. code-block:: console + + #View the cluster + kubectl cluster-info + + #View pods, services and replicasets (will be empty until deploying an app) + kubectl get all + +All of the common kubectl commands can be found in these `docs `_ + +.. note:: For those unfamiliar with CLIs, there are a number of GUI applications that are able to deploy on your stack with ease. One of which is Kubernetes native application called `Dashboard UI`_ or a third-party application called Octant :code:`brew install octant`. + +Helm +^^^^ +Helm organizes all of your Kubernetes deployment, service, and volume yml files into "charts" that can be deployed, managed, and published with simple commands. +To install Helm: + +* `Windows eksctl `_ +* Mac (with Homebrew) :code:`brew install helm` + +EKS Control (AWS Specific) +^^^^^^^^^^^^^^^^^^^^^^^^^^ +EKSCtl is a command line tool to manage Elastic Kubernetes clusters on AWS. If not using AWS, then disregard this section. + +* `Windows eksctl config `_ +* Mac (with Homebrew) :code:`brew install eksctl` + +To launch a cluster on using EKSCts, run the following command in the terminal (assuming adequate permissions for the user). Also make sure to replace items in the `<>` brackets. + +.. code-block:: yaml + + eksctl create cluster \ + --name \ + --version 1.21 \ + --region us-east-1 \ + --node-type m5.large \ + --nodes 1 \ + --nodes-min 1 \ + --nodes-max 1 \ + --managed \ + --tags environment= + +Charts +^^^^^^ +SEED stores its charts in the `charts directory`_ of the Github Repo. There are two main charts that are deployed when starting SEED on Kubernetes. + +* persistentvolumes - these are the volumes to store SEED media data and SEED Postgres data +* seed - this stores all of the other deployment and service files for the application + +Unlike persistentvolumes, the seed charts must be modified with user environment variables that will be forwarded to the docker container for deployment. +Before deployment, the user **MUST** set these variables to their desired values. + +web-deployment.yaml +******************* +This chart contains the deployment specification for the SEED web container. Replace all the values in <>. + +.. code-block:: yaml + + # Environment variables for the web container + - env: + # AWS Email service variables to send emails to new users - can be removed if not using this functionality. + - name: AWS_ACCESS_KEY_ID + value: + - name: AWS_SECRET_ACCESS_KEY + value: + - name: AWS_SES_REGION_NAME + value: us-west-2 + - name: AWS_SES_REGION_ENDPOINT + value: email.us-west-2.amazonaws.com + - name: SERVER_EMAIL + value: info@seed-platform.org + # Django Variables + - name: DJANGO_SETTINGS_MODULE + value: config.settings.docker + - name: SECRET_KEY + value: + - name: SEED_ADMIN_ORG + value: default + - name: SEED_ADMIN_PASSWORD + value: + - name: SEED_ADMIN_USER + value: + # Postgres variables + - name: POSTGRES_DB + value: seed + - name: POSTGRES_PASSWORD + value: # must match db-postgres-deployment.yaml and web-celery-deployment.yaml + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_USER + value: seeduser + # Bsyncr analysis variables + - name: BSYNCR_SERVER_PORT + value: "5000" + - name: BSYNCR_SERVER_HOST + value: bsyncr + # Sentry monitoring - remove if not applicable + - name: SENTRY_JS_DSN + value: + - name: SENTRY_RAVEN_DSN + value: + # Google self registration security - remove if not applicable + - name: GOOGLE_RECAPTCHA_SITE_KEY + value: + - name: GOOGLE_RECAPTCHA_SECRET_KEY + value: + image: seedplatform/seed: + #versions can be found here https://github.com/SEED-platform/seed/releases/tag/v2.9.3 + +web-celery-deployment.yaml +************************** +This chart contains the deployment specification for the Celery container to connect to Postgres. Replace the Postgres password to match web-deployment. + +.. code-block:: yaml + + - name: POSTGRES_PASSWORD + value: # must match db-postgres-deployment.yaml and web-celery-deployment.yaml + +bsyncr-deployment.yaml +********************** +This chart contains the deployment specification for the bsyncr analysis server. Request a NOAA token from `this website `_. + +.. code-block:: yaml + + - name: NOAA_TOKEN + value: + +Deployment +---------- +Once you are connected to your cluster and have your settings configured with the environment variables of you choice in the charts, you are ready to deploy the app. +First, make sure that the correct context is selected which is needed if there is more than one cluster: + +.. code-block:: bash + + kubectl config get-contexts + kubectl config use-context + +Deploy the site using the helm commands in the root of the charts directory. + +* :code:`helm install --generate-name persistentvolumes` +* :code:`helm install --generate-name seed` + +You will be able to see SEED coming online with statuses like container creating, and running with: + +* :code:`kubectl get all` + +Once all of the pods are running you will be able to hit the external ingress through the URL listed in the web service information. It should look something like + +.. code-block:: bash + + service/web LoadBalancer 10.100.154.227 80:32291/TCP + +Managing Existing Clusters +-------------------------- + +Upgrade/Redeploy the Helm Stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To upgrade or dedeploy a helm chart, first find the helm release that you want to upgrade, then run the upgrade with the selected chart. + +.. code-block:: bash + + helm list + helm upgrade ./seed + +Managing the Kubernetes Cluster (AWS Specific) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Enable kubectl to talk to one of the created clusters by running the following command in the terminal after configuring the AWS credentials and cli. + +.. code-block:: bash + + aws eks --region update-kubeconfig --name + +Logging In +^^^^^^^^^^ +After a successful deployment in order to login you will need to create yourself as a user in the web container. To do this, we will exec into the container and run some Django commands. +* View all deployments and services, :code:`kubectl get all` +* :code:`kubectl get pods` +* :code:`kubectl exec -it -- bash` + +Now that we are in the container, we can make a user. +.. code-block:: bash + + ./manage.py create_default_user --username=admin@my.org --organization=seedorg --password=badpass + +You can now use these credentials to log in to the SEED website. + +Update web and web-celery +^^^^^^^^^^^^^^^^^^^^^^^^^ +The command below will restart the pods and re-pull the docker images. + +.. code-block:: bash + + kubectl rollout restart deployment web && kubectl rollout restart deployment web-celery + + +Other Resources +--------------- +Common kubectl actions can be found `on the kubernetes website `_ + + +.. _AWS: https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html +.. _GCP: https://cloud.google.com/kubernetes-engine/docs/quickstart +.. _AKS: https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough#connect-to-the-cluster + +.. _Dashboard UI: https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/ + +.. _charts directory: https://github.com/SEED-platform/seed/tree/develop/charts diff --git a/docs/code_documentation/3.1.0/_sources/license.rst.txt b/docs/code_documentation/3.1.0/_sources/license.rst.txt new file mode 100644 index 00000000..f29b1ce4 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/license.rst.txt @@ -0,0 +1,5 @@ +============== +License +============== + +.. include:: ../../LICENSE.md diff --git a/docs/code_documentation/3.1.0/_sources/linux.rst.txt b/docs/code_documentation/3.1.0/_sources/linux.rst.txt new file mode 100644 index 00000000..d5b97dc1 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/linux.rst.txt @@ -0,0 +1,331 @@ +General Linux Setup +=================== + +While Amazon Web Services (`AWS`_) provides the preferred hosting for SEED, +running on a bare-bones Linux server follows a similar setup, replacing the +AWS services with their Linux package counterparts, namely: PostgreSQL and +Redis. + +**SEED** is a `Django project`_ and Django's documentation +is an excellent place to general understanding of this project's layout. + +.. _Django project: https://www.djangoproject.com/ + +.. _AWS: http://aws.amazon.com/ + +Prerequisites +^^^^^^^^^^^^^^ + +Ubuntu server/desktop 16.04 or newer (18.04 recommended) + +Install the following base packages to run SEED: + +.. code-block:: console + + sudo add-apt-repository ppa:timescale/timescaledb-ppa + sudo apt update + sudo apt upgrade + sudo apt install libpq-dev python3-dev python3-pip libatlas-base-dev \ + gfortran build-essential nodejs npm libxml2-dev libxslt1-dev git \ + libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python mercurial + sudo apt install gdal-bin postgis + sudo apt install redis-server + sudo apt install timescaledb-postgresql-10 postgresql-contrib + +.. note:: postgresql ``>=9.3`` is required to support `JSON Type`_ + +.. _JSON Type: http://www.postgresql.org/docs/9.3/static/datatype-json.html + +Configure PostgreSQL +^^^^^^^^^^^^^^^^^^^^ + +Replace 'seeddb', 'seeduser' with desired db/user. By +default use password `seedpass` when prompted + +.. code-block:: console + + $ sudo timescaledb-tune + $ sudo service postgresql restart + $ sudo su - postgres + $ createuser -P "seeduser" + $ createdb "seeddb" --owner="seeduser" + $ psql + postgres=# GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO "seeduser"; + postgres=# ALTER USER "seeduser" CREATEDB CREATEROLE SUPERUSER; + postgres=# \q + $ exit + + +Python Dependencies +^^^^^^^^^^^^^^^^^^^ + +clone the **seed** repository from **github** + +.. code-block:: console + + $ git clone git@github.com:SEED-platform/seed.git + +enter the repo and install the python dependencies from `requirements`_ + +.. _requirements: https://github.com/SEED-platform/seed/blob/main/requirements/local.txt + +.. code-block:: console + + $ cd seed + $ pip3 install -r requirements/local.txt + + +JavaScript Dependencies +^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: console + + $ npm install + + +Django Database Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Copy the ``local_untracked.py.dist`` file in the ``config/settings`` directory to +``config/settings/local_untracked.py``, and add a ``DATABASES`` configuration with your database username, password, +host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database instance +you have manually installed within your infrastructure. + +.. code-block:: python + + # Database + DATABASES = { + 'default': { + 'ENGINE': 'django.contrib.gis.db.backends.postgis', + 'NAME': 'seeddb', + 'USER': 'seeduser', + 'PASSWORD': '', + 'HOST': 'localhost', + 'PORT': '5432', + } + } + + +.. note:: + + Other databases could be used such as MySQL, but are not supported + due to the postgres-specific `JSON Type`_ + +In in the above database configuration, ``seed`` is the database name, this is arbitrary and any valid name can be +used as long as the database exists. Enter the database name, user, password you set above. + +The database settings can be tested using the Django management command, ``python3 manage.py dbshell`` to connect to the +configured database. + +create the database tables and migrations: + +.. code-block:: console + + $ python3 manage.py migrate + +Cache and Message Broker +^^^^^^^^^^^^^^^^^^^^^^^^ + +The SEED project relies on `redis`_ for both cache and message brokering, and +is available as an AWS `ElastiCache`_ service or with the ``redis-server`` +Linux package. (``sudo apt install redis-server``) + +``local_untracked.py`` should be updated with the ``CACHES`` and ``CELERY_BROKER_URL`` +settings. + +.. _ElastiCache: https://aws.amazon.com/elasticache/ + +.. _redis: http://redis.io/ + + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + + +Creating the initial user +^^^^^^^^^^^^^^^^^^^^^^^^^ + +create a superuser to access the system + +.. code-block:: console + + $ python3 manage.py create_default_user --username=admin@my.org --organization=lbnl --password=badpass + + +.. note:: + + Of course, you need to save this user/password somewhere, since this is what + you will use to login to the SEED website. + + Every user must be tied to an organization, visit ``/app/#/profile/admin`` + as the superuser to create parent organizations and add users to them. + + + +Running celery the background task worker +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +`Celery`_ is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, ``celery`` +can be started: + +.. code-block:: console + + DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler + +.. _Celery: http://www.celeryproject.org/ + + +Running the development web server +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The Django dev server (not for production use) can be a quick and easy way to +get an instance up and running. The dev server runs by default on port 8000 +and can be run on any port. See Django's `runserver documentation`_ for more +options. + +.. _runserver documentation: https://docs.djangoproject.com/en/1.6/ref/django-admin/#django-admin-runserver + +.. code-block:: console + + $ python3 manage.py runserver --settings=config.settings.dev + + +Running a production web server +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Our recommended web server is uwsgi sitting behind nginx. The python package ``uwsgi`` is needed for this, and +should install to ``/usr/local/bin/uwsgi`` We recommend using ``dj-static`` to load static files. + +.. note:: + + The use of the ``dev`` settings file is production ready, and should be + used for non-AWS installs with ``DEBUG`` set to ``False`` for production use. + + +.. code-block:: console + + $ pip3 install uwsgi dj-static + + +Generate static files: + +.. code-block:: console + + $ python3 manage.py collectstatic --settings=config.settings.prod -i package.json -i package-lock.json -i node_modules/openlayers-ext/index.html + +Update ``config/settings/local_untracked.py``: + +.. code-block:: python + + DEBUG = False + # static files + STATIC_ROOT = 'collected_static' + STATIC_URL = '/static/' + +Start the web server (this also starts celery): + +.. code-block:: console + + $ ./bin/start-seed + +.. warning:: + + Note that uwsgi has port set to ``80``. In a production setting, a dedicated web server such as nginx would be + receiving requests on port 80 and passing requests to uwsgi running on a different port, e.g 8000. + + + + +Environment Variables +^^^^^^^^^^^^^^^^^^^^^ + +The following environment variables can be set within the ``~/.bashrc`` file to +override default Django settings. + +.. code-block:: bash + + export SENTRY_DSN=https://xyz@app.getsentry.com/123 + export DEBUG=False + export ONLY_HTTPS=True + + +Mail Services +^^^^^^^^^^^^^ + +AWS SES Service +--------------- + +In the AWS setup, we can use SES to provide an email service for Django. The service is +configured in the config/settings/local_untracked.py: + +.. code-block:: python + + EMAIL_BACKEND = 'django_ses.SESBackend' + + +In general, the following steps are needed to configure SES: + +1. Access Amazon SES Console - `Quickstart `_ +2. Login to Amazon SES Console. Verify which region we are using (e.g., us-east-1) +3. Decide on email address that will be sending the emails and add them to the `SES Verified Emails `_. +4. Test that SES works as expected (while in the SES sandbox). Note that you will need to add the sender and recipient emails to the verified emails while in the sandbox. +5. Update the local_untracked.py file or set the environment variables for the docker file. +6. Once ready, move the SES instance out of the sandbox. Following instructions `here `_ +7. (Optional) Set up Amazon Simple Notification Service (Amazon SNS) to notify you of bounced emails and other issues. +8. (Optional) Use the AWS Management Console to set up Easy DKIM, which is a way to authenticate your emails. Amazon SES console will have the values for SPF and DKIM that you need to put into your DNS. + +SMTP service +------------ + +Many options for setting up your own `SMTP`_ service/server or using other SMTP +third party services are available and compatible including `gmail`_. SMTP is not configured for working within Docker at the moment. + +.. _SMTP: https://docs.djangoproject.com/en/2.0/ref/settings/#email-backend +.. _gmail: http://stackoverflow.com/questions/19264907/python-django-gmail-smtp-setup + +.. code-block:: python + + EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' + +local_untracked.py +^^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + # PostgreSQL DB config + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'seed', + 'USER': 'your-username', + 'PASSWORD': 'your-password', + 'HOST': 'your-host', + 'PORT': 'your-port', + } + } + + # config for local storage backend + DOMAIN_URLCONFS = {'default': 'config.urls'} + + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + + # SMTP config + EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' + + # static files + STATIC_ROOT = 'collected_static' + STATIC_URL = '/static/' diff --git a/docs/code_documentation/3.1.0/_sources/mapping.rst.txt b/docs/code_documentation/3.1.0/_sources/mapping.rst.txt new file mode 100644 index 00000000..077593ec --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/mapping.rst.txt @@ -0,0 +1,42 @@ +========= +Mapping +========= + +This document describes the set of calls that occur from the web client or API +down to the back-end for the process of mapping data into SEED. + +An overview of the process is: + +1. Import - A file is uploaded to the server +2. Save - The file is batched saved into the database as JSON data +3. Mapping - Mapping occurs on that file +4. Matching / Merging +5. Pairing + +Import +------ + +From the web UI, the import process invokes `seed.views.main.save_raw_data` to save the data. When the data is +done uploading, we need to know whether it is a Portfolio Manager file, so we can add metadata to the record in the +database. The end of the upload happens in `seed.data_importer.views.DataImportBackend.upload_complete`. At this +point, the request object has additional attributes for Portfolio Manager files. These are saved in the model +`seed.data_importer.models.ImportFile`. + +Mapping +------- + +Once files are uploaded, file header columns need to be mapped to SEED columns. Mappings can be specified/decided manually for any particular file import, +or mapping profiles can be created and subsequently applied to any file imports. + +When a column mapping profile is applied to an import file, file header columns defined in the profile must match exactly (spaces, lowercase, uppercase, etc.) +in order for the corresponding SEED column information to be used/mapped. + +Matching +-------- + +.. todo:: document + +Pairing +------- + +.. todo:: document diff --git a/docs/code_documentation/3.1.0/_sources/matching.rst.txt b/docs/code_documentation/3.1.0/_sources/matching.rst.txt new file mode 100644 index 00000000..2d28d935 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/matching.rst.txt @@ -0,0 +1,123 @@ +Matching +======== + +What is it? +----------- +Within SEED, matching refers to a possible relationship between at least 2 properties or at least 2 tax lots. +Two properties **match** if they have the same values for some specified field(s). +These specified fields are referred to as **matching criteria**, and each SEED organization has its +own set of matching criteria which is customizable by users. + +Why does it exist? +------------------ +At a high level, matching is used to identify if two or more property records are actually different +representations of the same property (or tax lots representing one tax lot). For example, within the same cycle, +two matching records, so one persists while the other is used and subsequently discarded to update the persisting record +(say if the building owner's phone number changed). Or across different cycles, it's possible that the +two records capture the same property at different times/cycles - this relationship is referred to as a **link**. + +How and when is it used? +------------------------ + +In-Cycle Merging +"""""""""""""""" +(This is different from manual merging.) + +For records within the same cycle, there really shouldn't be more than one +representation of the same property (or tax lot). As much as possible, the program +is set up to prevent this from happening by automatically **merging** matched +records together whenever they might occur in the same cycle. + +Specifically, a merge of matches might need to occur after any of the following events: + +1. The record has been manually edited. +2. The record was just created as a result of a manual merge (via the 'Actions' on the Properties or Tax Lots page). +3. The record has just been imported. + +The actual execution of merges includes a few additional, unrelated steps but, +in the scope of merging, the following occurs. + +The record in the scenarios listed above is the "target" record. Any and all +matches found, excluding the "target", are merged together first. If there are +overlapping values, priority is given to more recently updated records. + +Once these matches (excluding the target) are merged together, the final step is +to merge the "target" record. In all but one case, choosing between overlapping +values gives priority to the "target". That one case is when a record has just been +imported. Here, overlapping values follow merge protection rules set by +the user for an organization in this final step. + +Linking (Across Cycles) +""""""""""""""""""""""" +For records in different cycles, matches between these are considered links. +Links are used to connect snapshots of the same record year-over-year (at different time periods). +This allows for the analysis of how the record has changed over time. + +In the case of properties, these links are used to associate meters to properties. +This means that adding meters to a property in one cycle will make those meters +accessible to that same property's instance in all other cycles. + +This association can be viewed in aggregate; all of the records within some selected cycles are +grouped and displayed with their links. Alternatively, this association can be viewed for particular linked +group; the linked records of this group are displayed by themselves. + +Putting them Together, Match-Merge-Linking +"""""""""""""""""""""""""""""""""""""""""" +As mentioned earlier, there is a rule or assumption that at most one representation of +the same record can exist in any given cycle. + +This avoids unresolvable situations that would prevent year-over-year analysis. +In the most simple case, a record in `Cycle A` matches two records in `Cycle B`. +SEED wouldn't know which of the two records in `Cycle B` should be +the "snapshot" for this time period. + +For this reason, in-cycle match merging always occurs before cross-cycle match linking. +So when searches for links do happen, ambiguous cases have already been resolved. + +For an individual record, these are the following cases in which a +match-merge-link is automatically run: +1. Explicit triggering (from the Property/TaxLot Detail page) +2. After editing (in the Property/TaxLot Detail page) +3. After manual merging (in the Properties/Tax Lots list page). Explicitly +specified merges happen as chosen by the user. Then, if the resulting record has +matches, merges and/or linking happens. +4. When importing a record. If the incoming record has matches, +merges and/or linking happens. + +For a whole organization, a match-merge-link round for all records in that +organization is run in the following cases: +1. During the original deployment of this feature - This happens in order to +initially normalize the existing data and establish all initial links. +2. Whenever a user changes matching criteria - This happens in order to +re-normalize existing data and reestablish links. As of this writing, before +committing matching criteria changes, a user can view a preview of how their +records will be affected as these are difficult to reverse. + +Note on In-Cycle Not-merged Matches +""""""""""""""""""""""""""""""""""" +Even though the application tries it's best to have only one representative record per property +(or tax lot) per Cycle, it's possible for there to exist matches that were not merged. +This can happen if a user manually unmerges a record after a (manual or automatic) merge occurs. +If this happens, and there exists two records that match each other but are not merged, +both records are **completely unlinked**. Without user intervention such as editing +one of the matching criteria values, these will be merged and linked as described +above next time the system finds them during a match search. + +Match Searching in Depth +------------------------ +Though they accomplish the same goal, the process for merging is very different between the last case, importing, +and the first 2 cases, manual edit or manual merge. + +In the case of manual merging or editing, this process accounts for the fact that these are records that already exist. +Specifically, they may have associations such as labels, notes, pairings, and for properties, meters. +So during a subsequent match search leading to a merge of two or more records, all of these "old" associations are +carried over to the final record once merges are complete. + +In the case of importing, considerations must be taken for the fact that, in most cases, multiple records +are being imported together. Also, since this is the entry point for records, it's possible that a user might +accidentally try to import the same record snapshot twice - where all the record values are the same as another +existing record (as opposed to just having the same values for matching criteria fields). So on import, the process is as follows: + +1. Amongst only the incoming records, duplicates (of other incoming or existing) are flagged and ignored. +2. Amongst only the incoming records, matching records are merged together. +3. Amongst all records in the same Cycle, incoming records that match an existing record gets merged with priority to that existing record. If the incoming record has multiple existing matches, the existing matches are merged together in latest updated order first while also combining any other associations (labels, notes, etc.) just as in the manual merge or edit cases. Since the incoming record is new, it doesn't have any of the other associations. diff --git a/docs/code_documentation/3.1.0/_sources/migrations.rst.txt b/docs/code_documentation/3.1.0/_sources/migrations.rst.txt new file mode 100644 index 00000000..32f35b7f --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/migrations.rst.txt @@ -0,0 +1,299 @@ +Migrations +========== + +Django handles the migration of the database very well; however, there are various changes to SEED that may require some custom (manual) migrations. The migration documentation includes the required changes based on deployment and development for each release. + +Version Develop +--------------- + +In order to support Redis passwords, the configuration of the Redis/Celery settings changed a bit. +You will need to add the following to your local_untracked.py configuration file. If you are using +Docker then you will not need to do this. + +.. code-block:: python + + CELERY_RESULT_BACKEND = CELERY_BROKER_URL + +If you are using a password, then in your local_untracked.py configuration, add the password to +the CELERY_BROKER_URL. Your final configuration should look like the following in your +local_untracked.py file + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://:password@127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + + CELERY_RESULT_BACKEND = CELERY_BROKER_URL + CELERY_TASK_DEFAULT_QUEUE = 'seed-local' + CELERY_TASK_QUEUES = ( + Queue( + CELERY_TASK_DEFAULT_QUEUE, + Exchange(CELERY_TASK_DEFAULT_QUEUE), + routing_key=CELERY_TASK_DEFAULT_QUEUE + ), + ) + +Version 3.1.0 +------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 3.0.0 +------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 3.0.0-beta.0 +-------------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.22.0 +-------------- +- Run ``./manage.py migrate``. +- There is a Redis dependency update in this release that requires users and deployments to modify their settings' ``CACHES`` config. + #. Update your dependencies with pip install -r requirements/base.txt + #. Update the CACHES BACKEND property to ``django_redis.cache.RedisCache`` + #. Update the CACHES LOCATION property to match the redis-py native URL notation for connection strings, including the redis protocol and database number. e.g. ``redis://localhost:6379/1`` + + Since the CELERY_BROKER_URL setting must also be in the same format, it may be helpful to configure that setting first and then reference it in the caches LOCATION parameter. +- See the `PR for an example migration `_. + +Version 2.21.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.20.1 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.20.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. +- There is a single long running migration related to importing census tract disadvantaged community data. This migration should take around 7 minutes to complete. + +Version 2.19.0 +-------------- +- Run `./manage.py migrate`. +- There is a new migration in this release that requires column names to be unique across `organization`, `table_name`, and `is_extra_data`. This migration will fail if there are duplicate column names. If you have duplicate column names, you will need to manually fix them in your database before running the migration. The following steps will help you identify and fix the duplicate column names: + - Check the organization age to gauge the impact of the change. If it is a deprecated org, impact of the change will be low. Often this issue arose in older organizations when units were not part of the columns. The old mapping columns were not upserts with the units, so typically the columns impacted are the ones with units. + - Query the `seed_column` table for the organization and column name displayed on the screen (e.g., `organization_id = 300 and column_name = 'Source EUI (kBtu/ft2)'`). If there is no `table_name` set, it is likely an import file column name and can easily be cleaned up without causing issues. In such cases, there will be two rows, and you want to keep the one with the `units_pint` column set. + - More complex columns may require deleting or updating the `column_id` in the `seed_columnmapping_*` tables. If there is a foreign key constraint with `seed_columnmapping_*`, take note of the ID you want to remove and the ID you want it to be replaced with (preferably keep the one with units_pint). + - If the constraint is on `seed_columnmapping_column_raw`: + - The field should be an import file column (i.e., no `table_name` item). Query for the old column in `seed_columnmapping_column_raw` (e.g., `column_name = `). + - Replace the old ID with the new one. If it errors because it already exists, then the row can be deleted. + - Return to the `seed_column` table and remove the old ID. + - If the constraint is on `seed_columnmapping_column_mapped`: + - The mapped column should have a `table_name` in the field. If not, it is likely an older organization. + - If there is no `table_name`, remove the row from the `seed_columnmapping_column_mapped` table. + - Return to the `seed_column` table and remove the old ID. + +Version 2.18.1 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.18.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.17.4 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.17.3 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.17.2 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.17.1 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.17.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.16.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.15.2 +-------------- +- There are no migrations needed for this version. + +Version 2.15.1 +-------------- +- There are no migrations needed for this version. + +Version 2.15.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.14.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.13.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.12.0 - 2.12.4 +----------------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.11.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.10.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.7.3 to 2.9.0 +---------------------- +- The migrations should work without additional support. Simply run ``./manage.py migrate``. + +Version 2.7.2 +------------- +- The migrations should work without additional support. Simply run ``./manage.py migrate``. There are no manual migrations needed. +- Note the **Important Note** in Version 2.7.1 migration below which may require the need to run a "fake" migration + +Version 2.7.1 +------------- + +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +**Important Note:** + +If upgrading from `< 2.7.0` to `>= 2.7.1` you may encounter a failed migration with ``0118_match_merge_link_all_orgs``. This is expected if the database is several versions behind, and it effectively reorders migration 118 to run after all other migrations have completed to prepare your database to recognize properties and taxlots across multiple cycles. Run the following code manually to fully migrate: + +#. ``./manage.py migrate --fake seed 0118_match_merge_link_all_orgs`` + +#. ``./manage.py migrate`` + +#. ``./manage.py shell`` + + .. code-block:: python + + from seed.lib.superperms.orgs.models import Organization + from seed.utils.match import whole_org_match_merge_link + + for org in Organization.objects.all(): + whole_org_match_merge_link(org.id, 'PropertyState') + whole_org_match_merge_link(org.id, 'TaxLotState') + +Version 2.7.0 +------------- + +- This migration will run a match/merge/pair/link method upon migration. Make sure to run the migration manually and not inside of the docker container using the ./deploy.sh script. +- Make sure to backup the database before performing the migration. +- Run ``./manage.py migrate``. + +Version 2.6.1 +------------- + +- The migrations should work without additional support. Simply run ``./manage.py migrate``. There are no manual migrations needed for the 2.6.1 release. + + +Version 2.6.0 +------------- + +Version 2.6.0 includes support for meters and time series data storage. In order to use this release +you must first install `TimescaleDB`_. + +Docker-based Deployment +^^^^^^^^^^^^^^^^^^^^^^^ +Docker-based deployments shouldn't require running any additional commands for installation. The +timescaledb installation will happen automatically when updating the postgres container. Also, +the installation of the extension occurs in a Django migration. + +Ubuntu +^^^^^^ + +.. code-block:: console + + sudo add-apt-repository ppa:timescale/timescaledb-ppa + sudo apt update + sudo apt install timescaledb-postgresql-10 + sudo timescaledb-tune + sudo service postgresql restart + +Max OSX +^^^^^^^ + +.. code-block:: console + + brew tap timescale/tap + brew install timescaledb + /usr/local/bin/timescaledb_move.sh + timescaledb-tune + brew services restart postgresql + +Version 2.5.2 +------------- + +- There are no manual migrations that are needed. The ``./manage.py migrate`` command may take awhile to run since the migration requires the recalculation of all the normalized addresses to parse bldg correct and to cast the result as a string and not a bytestring. + +Version 2.5.1 +------------- + +- The migrations should work by simply running ``./manage.py migrate``. There are no manual migrations needed for the 2.5.1 release. + +Version 2.5.0 +------------- + +Docker-based Deployment +^^^^^^^^^^^^^^^^^^^^^^^ + +- Add the MapQuest API key to your organization. +- On deployment, the error below is indicative that you need to install the extensions in the postgres database. Run `docker exec update-postgis.sh`. + + django.db.utils.OperationalError: could not open extension control file "/usr/share/postgresql/11/extension/postgis.control": No such file or directory + +- If you are using a copied version of the docker-compose.yml file, then you need to change `127.0.0.1:5000/postgres` to `127.0.0.1:5000/postgres-seed` + +Development +^^^^^^^^^^^ + +- **Delete** your bower directory `rm -rf seed/static/vendors`. +- **Delete** your css directory `rm -rf seed/static/seed/css`. +- **Remove** these lines from `local_untracked.py` if you have them. + +.. code-block:: python + + DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' + STATICFILES_STORAGE = DEFAULT_FILE_STORAGE + +- Run `pip3 install -r requirements/local.txt`. +- Run `npm install` from root checkout of SEED. + +- If testing geocoding, then sign up for as a `MapQuest Developer`_ and create a new `MapQuest Key`_. +- Add the key to the organization that you are using in development. + +- **Update** your DATABASES engine to be `django.contrib.gis.db.backends.postgis` + +.. code-block:: python + + DATABASES = { + 'default': { + 'ENGINE': 'django.contrib.gis.db.backends.postgis', + 'NAME': 'seeddb', + 'USER': 'seeduser', + 'PASSWORD': 'seedpass', + 'HOST': 'localhost', + 'PORT': '5432', + } + } + +- Run ``./manage.py migrate`` + +.. _`MapQuest Developer`: https://developer.mapquest.com/plan_purchase/steps/business_edition/business_edition_free/register + +.. _`MapQuest Key`: https://developer.mapquest.com/user/me/apps + +.. _`TimescaleDB`: https://docs.timescale.com/v1.2/getting-started diff --git a/docs/code_documentation/3.1.0/_sources/modules.rst.txt b/docs/code_documentation/3.1.0/_sources/modules.rst.txt new file mode 100644 index 00000000..4c920b9e --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules.rst.txt @@ -0,0 +1,26 @@ +========= +Modules +========= + +.. toctree:: + :maxdepth: 3 + + modules/config + modules/seed.cleansing + modules/seed.data + modules/seed.data_importer + modules/seed.features + modules/seed.landing + modules/seed.lib + modules/seed.lib.mappings + modules/seed.lib.merging + modules/seed.mappings + modules/seed.managers + modules/seed.models + modules/seed.public + modules/seed + modules/seed.serializers + modules/seed.tests + modules/seed.urls + modules/seed.utils + modules/seed.views diff --git a/docs/code_documentation/3.1.0/_sources/modules/config.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/config.rst.txt new file mode 100644 index 00000000..09215b7d --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/config.rst.txt @@ -0,0 +1,45 @@ +Configuration +============= + +Submodules +---------- + +Template Context +---------------- + +.. automodule:: config.template_context + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: config.tests + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: config.utils + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: config.views + :members: + :undoc-members: + :show-inheritance: + +WSGI +---- + +.. automodule:: config.wsgi + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.cleansing.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.cleansing.rst.txt new file mode 100644 index 00000000..e185fd8e --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.cleansing.rst.txt @@ -0,0 +1,35 @@ +Data Quality Package +==================== + +Inheritance +----------- + +.. inheritance-diagram:: seed.data_quality.models + :parts: 2 + +Submodules +---------- + +Models +------ + +.. automodule:: seed.models.data_quality + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: seed.tests.data_quality + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.views.data_quality + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.data.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.data.rst.txt new file mode 100644 index 00000000..cf066173 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.data.rst.txt @@ -0,0 +1,22 @@ +Data Package +============ + +Submodules +---------- + +BEDES +----- + +.. automodule:: seed.data.bedes + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.data + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.data_importer.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.data_importer.rst.txt new file mode 100644 index 00000000..a446d80d --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.data_importer.rst.txt @@ -0,0 +1,55 @@ +Data Importer Package +===================== + +Submodules +---------- + +Managers +-------- + +.. automodule:: seed.data_importer.managers + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. .. automodule:: seed.data_importer.models +.. :members: +.. :undoc-members: +.. :show-inheritance: + +URLs +---- + +.. automodule:: seed.data_importer.urls + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: seed.data_importer.utils + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.data_importer.views + :members: + :undoc-members: + :show-inheritance: + :noindex: + + +Module contents +--------------- + +.. automodule:: seed.data_importer + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.features.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.features.rst.txt new file mode 100644 index 00000000..ce361d2e --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.features.rst.txt @@ -0,0 +1,22 @@ +Features Package +================ + +Submodules +---------- + +.. Steps +.. -------------------------- + +.. .. automodule:: seed.features.steps +.. :members: +.. :undoc-members: +.. :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.features + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.landing.management.commands.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.landing.management.commands.rst.txt new file mode 100644 index 00000000..57da9c38 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.landing.management.commands.rst.txt @@ -0,0 +1,22 @@ +Landing Management Package +========================== + +Submodules +---------- + +Update EULA +----------- + +.. automodule:: seed.landing.management.commands.update_eula + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.landing.management.commands + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.landing.management.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.landing.management.rst.txt new file mode 100644 index 00000000..c17e2852 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.landing.management.rst.txt @@ -0,0 +1,17 @@ +seed.landing.management package +=============================== + +Subpackages +----------- + +.. toctree:: + + seed.landing.management.commands + +Module contents +--------------- + +.. automodule:: seed.landing.management + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.landing.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.landing.rst.txt new file mode 100644 index 00000000..8103b029 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.landing.rst.txt @@ -0,0 +1,61 @@ +Landing Package +=============== + +Subpackages +----------- + +.. toctree:: + + seed.landing.management + +Submodules +---------- + +Forms +----- + +.. automodule:: seed.landing.forms + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. automodule:: seed.landing.models + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: seed.landing.tests + :members: + :undoc-members: + :show-inheritance: + +URLs +---- + +.. automodule:: seed.landing.urls + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.landing.views + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.landing + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.lib.mappings.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.lib.mappings.rst.txt new file mode 100644 index 00000000..f7bbb15c --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.lib.mappings.rst.txt @@ -0,0 +1,62 @@ +seed.lib.mappings package +========================= + +Submodules +---------- + +seed.lib.mappings.mapper module +------------------------------- + +.. automodule:: seed.lib.mappings.mapper + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.mapping_columns module +---------------------------------------- + +.. automodule:: seed.lib.mappings.mapping_columns + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.mapping_data module +------------------------------------- + +.. automodule:: seed.lib.mappings.mapping_data + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.test_mapper module +------------------------------------ + +.. automodule:: seed.lib.mappings.test_mapper + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.test_mapping_columns module +--------------------------------------------- + +.. automodule:: seed.lib.mappings.test_mapping_columns + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.test_mapping_data module +------------------------------------------ + +.. automodule:: seed.lib.mappings.test_mapping_data + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.lib.mappings + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.lib.merging.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.lib.merging.rst.txt new file mode 100644 index 00000000..98b5be8a --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.lib.merging.rst.txt @@ -0,0 +1,22 @@ +seed.lib.merging package +======================== + +Submodules +---------- + +seed.lib.merging.merging module +------------------------------- + +.. automodule:: seed.lib.merging.merging + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.lib.merging + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.lib.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.lib.rst.txt new file mode 100644 index 00000000..8de8e0e6 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.lib.rst.txt @@ -0,0 +1,23 @@ +Library Packages +================ + +Submodules +---------- + +Module contents +--------------- + +.. automodule:: seed.lib + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: seed.lib.mappings + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: seed.lib.merging + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.management.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.management.rst.txt new file mode 100644 index 00000000..9b600793 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.management.rst.txt @@ -0,0 +1,17 @@ +Management Package +================== + +Subpackages +----------- + +.. toctree:: + + seed.management.commands + +Module contents +--------------- + +.. automodule:: seed.management + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.managers.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.managers.rst.txt new file mode 100644 index 00000000..d77c318c --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.managers.rst.txt @@ -0,0 +1,29 @@ +Managers Package +================ + +Subpackages +----------- + +.. toctree:: + + seed.managers.tests + +Submodules +---------- + +JSON +---- + +.. automodule:: seed.managers.json + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.managers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.managers.tests.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.managers.tests.rst.txt new file mode 100644 index 00000000..2ef2cc25 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.managers.tests.rst.txt @@ -0,0 +1,22 @@ +Manager Tests Package +===================== + +Submodules +---------- + +Test JSON Manager +----------------- + +.. automodule:: seed.managers.tests.test_json_manager + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.managers.tests + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.mappings.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.mappings.rst.txt new file mode 100644 index 00000000..e749754f --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.mappings.rst.txt @@ -0,0 +1,38 @@ +Mapping Package +=============== + +Submodules +---------- + +seed.mappings.mapper module +--------------------------- + +.. automodule:: seed.mappings.mapper + :members: + :undoc-members: + :show-inheritance: + +.. seed.mappings.reconcile_mappings module +.. --------------------------------------- + +.. .. automodule:: seed.mappings.reconcile_mappings +.. :members: +.. :undoc-members: +.. :show-inheritance: + +seed.mappings.seed_mappings module +---------------------------------- + +.. automodule:: seed.mappings.seed_mappings + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.mappings + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.models.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.models.rst.txt new file mode 100644 index 00000000..fb0187a3 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.models.rst.txt @@ -0,0 +1,71 @@ +Models +=================== + +Submodules +---------- + +AuditLog +--------------------------- + +.. automodule:: seed.models.auditlog + :members: + :undoc-members: + :show-inheritance: + +Columns +-------------------------- + +.. automodule:: seed.models.columns + :members: + :undoc-members: + :show-inheritance: + +Cycles +------------------------- + +.. automodule:: seed.models.cycles + :members: + :undoc-members: + :show-inheritance: + +Joins +------------------------ + +.. automodule:: seed.models.joins + :members: + :undoc-members: + :show-inheritance: + +Generic Models +------------------------- + +.. automodule:: seed.models.models + :members: + :undoc-members: + :show-inheritance: + + +Properties +----------------------------- + +.. automodule:: seed.models.properties + :members: + :undoc-members: + :show-inheritance: + +TaxLots +--------------------------- + +.. automodule:: seed.models.tax_lots + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.models + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.public.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.public.rst.txt new file mode 100644 index 00000000..8a292bdc --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.public.rst.txt @@ -0,0 +1,22 @@ +Public Package +============== + +Submodules +---------- + +Models +------ + +.. automodule:: seed.public.models + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.public + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.rst.txt new file mode 100644 index 00000000..771c0324 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.rst.txt @@ -0,0 +1,106 @@ +SEED Package +============ + +Subpackages +----------- + +.. toctree:: + + seed.features + seed.management + seed.mappings + seed.templatetags + seed.test_helpers + seed.tests + + +Inheritance +----------- + +.. inheritance-diagram:: seed.models + :parts: 2 + + +Submodules +---------- + +Decorators +---------- + +.. automodule:: seed.decorators + :members: + :undoc-members: + :show-inheritance: + +Factory +------- + +.. automodule:: seed.factory + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. automodule:: seed.models + :members: + :undoc-members: + :show-inheritance: + +.. Reconcile +.. --------- + +.. .. automodule:: seed.reconcile +.. :members: +.. :undoc-members: +.. :show-inheritance: + +Search +------ + +.. automodule:: seed.search + :members: + :undoc-members: + :show-inheritance: + +Tasks +----- + +.. automodule:: seed.tasks + :members: + :undoc-members: + :show-inheritance: + +Token Generator +--------------- + +.. automodule:: seed.token_generators + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: seed.utils + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.views + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.serializers.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.serializers.rst.txt new file mode 100644 index 00000000..5f3a7dcf --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.serializers.rst.txt @@ -0,0 +1,30 @@ +Serializers Package +=================== + +Submodules +---------- + +Serializers +----------- + +.. automodule:: seed.serializers.celery + :members: + :undoc-members: + :show-inheritance: + +Labels +------ + +.. automodule:: seed.serializers.labels + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.serializers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.templatetags.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.templatetags.rst.txt new file mode 100644 index 00000000..5f799d24 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.templatetags.rst.txt @@ -0,0 +1,13 @@ +Templatetags Package +========================= + +Submodules +---------- + +Breadcrumbs +----------- + +.. automodule:: seed.templatetags.breadcrumbs + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.test_helpers.factory.lib.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.test_helpers.factory.lib.rst.txt new file mode 100644 index 00000000..7cbfda51 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.test_helpers.factory.lib.rst.txt @@ -0,0 +1,13 @@ +Test Helper Factory Lib Package +=============================== + +Submodules +---------- + +Chomsky +------- + +.. automodule:: seed.test_helpers.factory.lib.chomsky + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.test_helpers.factory.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.test_helpers.factory.rst.txt new file mode 100644 index 00000000..3b3a5393 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.test_helpers.factory.rst.txt @@ -0,0 +1,20 @@ +Test Helper Factor Package +========================== + +Subpackages +----------- + +.. toctree:: + + seed.test_helpers.factory.lib + +Submodules +---------- + +Helpers +------- + +.. automodule:: seed.test_helpers.factory.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.test_helpers.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.test_helpers.rst.txt new file mode 100644 index 00000000..d0ebe883 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.test_helpers.rst.txt @@ -0,0 +1,17 @@ +Test Helpers Package +==================== + +Subpackages +----------- + +.. toctree:: + + seed.test_helpers.factory + +Module contents +--------------- + +.. automodule:: seed.test_helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.tests.functional.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.tests.functional.rst.txt new file mode 100644 index 00000000..774c5447 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.tests.functional.rst.txt @@ -0,0 +1,21 @@ +Tests (Functional) Package +========================== + +Submodules +---------- + +Base +---- +.. automodule:: seed.functional.tests.base + :members: + +Page +---- +.. automodule:: seed.functional.tests.page + :members: + +Pages +----- +.. automodule:: seed.functional.tests.pages + :members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.tests.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.tests.rst.txt new file mode 100644 index 00000000..dcbf1b28 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.tests.rst.txt @@ -0,0 +1,80 @@ +Tests Package +============= + +Submodules +---------- + +.. toctree:: + :maxdepth: 2 + + seed.test_helpers + seed.tests.functional + +Admin Views +----------- + +.. automodule:: seed.tests.test_admin_views + :members: + :undoc-members: + :show-inheritance: + +Decorators +---------- + +.. automodule:: seed.tests.test_decorators + :members: + :undoc-members: + :show-inheritance: + +Exporters +--------- + +.. automodule:: seed.tests.test_exporters + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. automodule:: seed.tests.test_models + :members: + :undoc-members: + :show-inheritance: + +Tasks +----- + +.. automodule:: seed.tests.test_tasks + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.tests.test_views + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: seed.tests.tests + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: seed.tests.functional + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: seed.tests.util + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.urls.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.urls.rst.txt new file mode 100644 index 00000000..ab11d6be --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.urls.rst.txt @@ -0,0 +1,29 @@ +URLs Package +============ + +Submodules +---------- + +Accounts +-------- + +.. automodule:: seed.urls.accounts + :members: + :undoc-members: + :show-inheritance: + +APIs +---- + +.. automodule:: seed.urls.api + :members: + :undoc-members: + :show-inheritance: + +Main +---- + +.. automodule:: seed.urls.main + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.utils.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.utils.rst.txt new file mode 100644 index 00000000..27fd9b6c --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.utils.rst.txt @@ -0,0 +1,37 @@ +Utilities Package +================= + +Submodules +---------- + +APIs +---- + +.. automodule:: seed.utils.api + :members: + :undoc-members: + :show-inheritance: + +Buildings +--------- + +.. automodule:: seed.utils.buildings + :members: + :undoc-members: + :show-inheritance: + +Organizations +------------- + +.. automodule:: seed.utils.organizations + :members: + :undoc-members: + :show-inheritance: + +Time +---- + +.. automodule:: seed.utils.time + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/modules/seed.views.rst.txt b/docs/code_documentation/3.1.0/_sources/modules/seed.views.rst.txt new file mode 100644 index 00000000..195e1ed6 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/modules/seed.views.rst.txt @@ -0,0 +1,49 @@ +Views Package +============= + +Submodules +---------- + +Accounts +-------------------------- + +.. automodule:: seed.views.accounts + :members: + :undoc-members: + :show-inheritance: + :noindex: + +APIs +---- + +.. automodule:: seed.views.api + :members: + :undoc-members: + :show-inheritance: + :noindex: + +Main +---- + +.. automodule:: seed.views.main + :members: + :undoc-members: + :show-inheritance: + :noindex: + +Meters +------ + +.. automodule:: seed.views.meters + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.views + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.1.0/_sources/postgres_upgrade.rst.txt b/docs/code_documentation/3.1.0/_sources/postgres_upgrade.rst.txt new file mode 100644 index 00000000..85ae58f5 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/postgres_upgrade.rst.txt @@ -0,0 +1,51 @@ +Upgrade a SEED database from Postgres 12 to Postgres 16 +======================================================= + +Assumptions +----------- + +- This process assumes that you're currently using Postgres 12.7 with TimescaleDB 2.3.0 from ``timescale/timescaledb-postgis:2.3.0-pg12`` or ``timescale/timescaledb-postgis:latest-pg12`` +- This also assumes that you have a directory in the host filesystem, e.g. ``~/share``, that is bind mounted to ``/share`` in your existing database container + +1. Create a dump of the current database + +.. code-block:: bash + + docker exec seed_postgres pg_dump -d seed -U seeduser -Fc -f /share/seed-pg12.dump + +2. Create a temporary Postgres 13 container using the Docker image ``timescale/timescaledb-ha:pg13.14-ts2.14.2-oss`` + +.. code-block:: bash + + docker run --rm --name=seed-pg13 -e POSTGRES_DB=seed -e POSTGRES_USER=seeduser -e POSTGRES_PASSWORD=password -v ~/share:/share timescale/timescaledb-ha:pg13.14-ts2.14.2-oss + +Once the container has finished initializing, open a separate shell + +.. code-block:: bash + + docker exec -it seed-pg13 bash + psql -d seed -U seeduser -c "CREATE EXTENSION postgis;" + psql -d seed -U seeduser -c "DROP EXTENSION timescaledb;" + psql -d seed -U seeduser -c "CREATE EXTENSION timescaledb WITH VERSION '2.3.0';" + psql -d seed -U seeduser -c "SELECT timescaledb_pre_restore();" + pg_restore -d seed -U seeduser /share/seed-pg12.dump + psql -d seed -U seeduser -c "SELECT timescaledb_post_restore();" + psql -d seed -U seeduser -c "ALTER EXTENSION timescaledb UPDATE;" + pg_dump -d seed -U seeduser -Fc -f /share/seed-pg13.dump + +3. Start the new, permanent Postgres 16 container using the Docker image ``timescale/timescaledb-ha:pg16.2-ts2.14.2-oss`` + +.. code-block:: bash + + docker run -d --name=seed-pg16 -e POSTGRES_DB=seed -e POSTGRES_USER=seeduser -e POSTGRES_PASSWORD=password -v ~/share:/share timescale/timescaledb-ha:pg16.2-ts2.14.2-oss + +Once the container has finished initializing, open a separate shell + +.. code-block:: bash + + docker exec -it seed-pg16 bash + psql -d seed -U seeduser -c "CREATE EXTENSION postgis;" + psql -d seed -U seeduser -c "SELECT timescaledb_pre_restore();" + pg_restore -d seed -U seeduser /share/seed-pg13.dump + psql -d seed -U seeduser -c "SELECT timescaledb_post_restore();" + pg_dump -d seed -U seeduser -Fc -f /share/seed-pg16.dump diff --git a/docs/code_documentation/3.1.0/_sources/setup_docker.rst.txt b/docs/code_documentation/3.1.0/_sources/setup_docker.rst.txt new file mode 100644 index 00000000..3f020794 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/setup_docker.rst.txt @@ -0,0 +1,149 @@ +Installation using Docker +========================= + +Docker works natively on Linux, Mac OSX, and Windows 10. If you are using an older version of +Windows (and some older versions of Mac OSX), you will need to install Docker Toolbox. + +Choose either `Docker Native (Windows/OSX)`_ or `Docker Native (Ubuntu)`_ to +install Docker. + +Docker Native (Ubuntu) +---------------------- + +Follow instructions `here `_. + +* `Install Docker Compose `_ + + +Docker Native (Windows/OSX) +--------------------------- + +Following instructions `for Mac `_ or +`for Windows `_. Note that for OSX you must have docker desktop version `3.0 or later `. + +* `Install Docker Compose `_ + + +Building and Running Containers for Non-Development +------------------------------------------------------- + +* Run Docker Compose + + .. code-block:: bash + + docker compose build + + `Be Patient`_ ... If the containers build successfully, then start the containers + + .. code-block:: bash + + docker volume create --name=seed_pgdata + docker volume create --name=seed_media + docker compose up + + **Note that you may need to build the containers a couple times for everything to converge** + +* Login to container + + The docker-compose file creates a default user and password. Below are the defaults but can + be overridden by setting environment variables. + + .. code-block:: bash + + username: user@seed-platform.org + password: super-secret-password + + +.. note:: + + Don't forget that you need to reset your default username and password if you are going + to use these Docker images in production mode! + +Using Docker for Development +---------------------------- + +The development environment is configured for live reloading (i.e., restart webserver when files change) +and debugging. It builds off the base docker-compose.yml, so it's necessary +to specify the files being used in docker-compose commands as seen below. + +Build +^^^^^ + +.. code-block:: bash + + # create volumes for the database and media directory + docker volume create --name=seed_pgdata + docker volume create --name=seed_media + + # build the images + docker compose -f docker-compose.yml -f docker-compose.dev.yml build + +Running the Server +^^^^^^^^^^^^^^^^^^ + +NOTE: the server config is sourced from config.settings.docker_dev, which will include +your local_untracked.py if it exists. If you have a local_untracked.py, make sure it doesn't +overwrite the database or celery configuration! + +.. code-block:: bash + + docker compose -f docker-compose.yml -f docker-compose.dev.yml up + +If the server doesn't start successfully, and :code:`docker compose logs` doesn't help, +the django development server probably failed to start due to an error in your config or code. +Unfortunately docker/django logging doesn't appear to work when the container is first started. +Just try running the server yourself with docker exec, and see what the output is. + +The development docker-compose file has some configurable parameters for specifying volumes to use: + +- SEED_DB_VOLUME: the name of the docker volume to mount for postgres +- SEED_MEDIA_VOLUME: the name of the docker volume to mount for the seed media folder + +Docker will use environment variables from the shell or from a .env file to set these values. + +This is useful if you want to switch between different databases for testing. +For example, if you want to create a separate volume for storing a production backup, you could do the following + +.. code-block:: bash + + docker volume create --name=seed_pgdata_prod + SEED_DB_VOLUME=seed_pgdata_prod docker compose -f docker-compose.yml -f docker-compose.dev.yml up + +NOTE: you'll need to run :code:`docker compose down` to remove the containers before you +can restart the containers connecting to different volumes. + +Running Tests +^^^^^^^^^^^^^ + +While the containers are running (i.e., after running the docker compose up command), use docker exec to run tests in the web container: + +.. code-block:: bash + + docker exec -it seed_web ./manage.py test --settings config.settings.docker_dev + +Add the setting :code:`--nocapture` in order to see :code:`stdout` while running tests. You will need to do this in order to make use of debugging as described below or the output to your debug commands will not display until after the break point has passed and the tests are finished. + +Also worth noting: output from logging (_log.debug, etc) will not display in any situation unless a test fails. + +Debugging +^^^^^^^^^ + +To use pdb on the server, the web container has `remote-pdb `_ installed. +In your code, insert the following + +.. code-block:: bash + + import remote_pdb; remote_pdb.set_trace() + +Once the breakpoint is triggered, you should see the web container log something like "RemotePdb session open at 127.0.0.1:41653, waiting for connection ...". +To connect to the remote session, run netcat from inside the container (using the appropriate port). + +.. code-block:: bash + + docker exec -it seed_web nc 127.0.0.1:41653 + +.. _MacPorts: https://www.macports.org/ +.. _Homebrew: http://brew.sh/ +.. _npm: https://www.npmjs.com/ +.. _nodejs.org: http://nodejs.org/ +.. _Be Patient: https://www.youtube.com/watch?v=f4hkPn0Un_Q diff --git a/docs/code_documentation/3.1.0/_sources/setup_osx.rst.txt b/docs/code_documentation/3.1.0/_sources/setup_osx.rst.txt new file mode 100644 index 00000000..9bc64be9 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/setup_osx.rst.txt @@ -0,0 +1,383 @@ +Installation on OSX +=================== + +.. _virtualenv: https://virtualenv.pypa.io/en/latest/ +.. _pyenv: https://github.com/pyenv/pyenv +.. _virtualenvwrapper: https://virtualenvwrapper.readthedocs.io/en/latest/ +.. _MacPorts: https://www.macports.org/ +.. _Homebrew: http://brew.sh/ +.. _npm: https://www.npmjs.com/ +.. _nodejs.org: http://nodejs.org/ + +These instructions are for installing and running SEED on Mac OSX in +development mode. + +Quick Installation Instructions +------------------------------- + +This section is intended for developers who may already have their machine +ready for general development. If this is not the case, skip to Prerequisites. Note that SEED uses python 3. + +* install Postgres 11.1 and redis for cache and message broker +* install PostGIS 2.5 and enable it on the database using `CREATE EXTENSION postgis;` +* install TimescaleDB 1.5.0 +* use a virtualenv (if desired) +* `git clone git@github.com:seed-platform/seed.git` +* create a `local_untracked.py` in the `config/settings` folder and add CACHE and DB config (example `local_untracked.py.dist`) +* to enable geocoding, get MapQuest API key and attach it to your organization +* `export DJANGO_SETTINGS_MODULE=config.settings.dev` in all terminals used by SEED (celery terminal and runserver terminal) +* `pip install -r requirements/local.txt` + * for condas python, you way need to run this command to get pip install to succeed: `conda install -c conda-forge python-crfsuite` +* npm install +* `./manage.py migrate` +* `./manage.py create_default_user` +* `./manage.py runserver` +* `DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 4 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler` +* navigate to `http://127.0.0.1:8000/app/#/profile/admin` in your browser to add users to organizations +* main app runs at `127.0.0.1:8000/app` + +The `python manage.py create_default_user` will setup a default `superuser` +which must be used to access the system the first time. The management command +can also create other superusers. + +.. code-block:: console + + ./manage.py create_default_user --username=demo@seed-platform.org --organization=lbl --password=demo123 + + +Prerequisites +------------- + +These instructions assume you have MacPorts_ or Homebrew_. Your system +should have the following dependencies already installed: + +* git (`port install git` or `brew install git`) +* graphviz (`brew install graphviz`) +* pyenv_ (Recommended) + + .. note:: + + Although you *could* install Python packages globally, this is the + easiest way to install Python packages. Setting these up first will + help avoid polluting your base Python installation and make it much + easier to switch between different versions of the code. + + .. code-block:: bash + + brew install pyenv + brew install pyenv-virtualenv + pyenv install + pyenv virtualenv seed + pyenv local seed + + +PostgreSQL 11.1 +--------------- + +MacPorts:: + + sudo su - root + port install postgresql94-server postgresql94 postgresql94-doc + # init db + mkdir -p /opt/local/var/db/postgresql94/defaultdb + chown postgres:postgres /opt/local/var/db/postgresql94/defaultdb + su postgres -c '/opt/local/lib/postgresql94/bin/initdb -D /opt/local/var/db/postgresql94/defaultdb' + + # At this point, you may want to add start/stop scripts or aliases to + # ~/.bashrc or your virtualenv ``postactivate`` script + # (in ``~/.virtualenvs/{env-name}/bin/postactivate``). + + alias pg_start='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \ + -D /opt/local/var/db/postgresql94/defaultdb \ + -l /opt/local/var/db/postgresql94/defaultdb/postgresql.log start"' + alias pg_stop='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \ + -D /opt/local/var/db/postgresql94/defaultdb stop"' + + pg_start + + sudo su - postgres + PATH=$PATH:/opt/local/lib/postgresql94/bin/ + +Homebrew:: + + brew install postgres + # follow the post install instructions to add to launchagents or call + # manually with `postgres -D /usr/local/var/postgres` + # Skip the remaining Postgres instructions! + + + +Configure PostgreSQL. Replace 'seeddb', 'seeduser' with desired db/user. By +default use password `seedpass` when prompted. Use the code block below in development only since +the seeduser is a SUPERUSER. + +.. code-block:: bash + + createuser -P seeduser + createdb `whoami` + psql -c 'CREATE DATABASE "seeddb" WITH OWNER = "seeduser";' + psql -c 'GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO seeduser;' + psql -c 'ALTER ROLE seeduser SUPERUSER;' + + + +PostGIS 2.5 +----------- + +MacPorts:: + + # Assuming you're still root from installing PostgreSQL, + port install postgis2 + + + +Homebrew:: + + brew install postgis + + + +Configure PostGIS:: + + psql -d seeddb -c "CREATE EXTENSION postgis;" + + # For testing, give seed user superuser access: + # psql -c 'ALTER USER seeduser CREATEDB;' + + +If upgrading from an existing database or existing local_untracked.py file, make sure to add the +MapQuest API Key and set the database engine to 'ENGINE': 'django.contrib.gis.db.backends.postgis'. + +Now exit any root environments, becoming just yourself (even though it's not +that easy being green), for the remainder of these instructions. + + +TimescaleDB 1.5.0 +----------------- + +Note, as of version 1.5.0, dumping and restoring databases requires that both the source and target +database have the same version of TimescaleDB. + +Downloading From Source:: + + # Note: Installing from source should only be done + # if you have a Postgres installation not maintained by Homebrew. + # This installation requires C compiler (e.g., gcc or clang) and CMake version 3.4 or greater. + + git clone https://github.com/timescale/timescaledb.git + cd timescaledb + git checkout 1.5.0 + + # Bootstrap the build system + ./bootstrap + + # If OpenSSL can't be found by cmake - run the following instead + # ./bootstrap -DOPENSSL_ROOT_DIR= # e.g., -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl + + # To build the extension + cd build && make + + # To install + make install + + # Find postgresql.conf + # Then uncomment the shared_preload_libraries line changing it to the following + # shared_preload_libraries = 'timescaledb' + psql -d postgres -c "SHOW config_file;" + + # Restart PostgreSQL instance + + + +Python Packages +--------------- + +Run these commands as your normal user id. + +Change to a virtualenv (using virtualenvwrapper) or do the following as a +superuser. A virtualenv is usually better for development. Set the virtualenv +to seed. + +.. code-block:: bash + + workon seed + +Make sure PostgreSQL command line scripts are in your PATH (if using MacPorts) + +.. code-block:: bash + + export PATH=$PATH:/opt/local/lib/postgresql94/bin + +Some packages (uWSGI) may need to find your C compiler. Make sure you have +'gcc' on your system, and then also export this to the `CC` environment +variable: + +.. code-block:: bash + + export CC=gcc + +Install requirements with `pip` + +.. code-block:: bash + + pip install -r requirements/local.txt + +NodeJS/npm +---------- + +Install npm_. You can do this by installing from nodejs.org_, MacPorts, or +Homebrew: + +MacPorts:: + + sudo port install npm + +Homebrew:: + + brew install npm + +Configure Django and Databases +------------------------------ + +In the `config/settings` directory, there must be a file called +`local_untracked.py` that sets up databases and a number of other things. +To create and edit this file, start by copying over the template + +.. code-block:: bash + + cd config/settings + cp local_untracked.py.dist local_untracked.py + +Edit `local_untracked.py`. Open the file you created in your favorite editor. The PostgreSQL config section will look something like this: + +.. code-block:: python + + # postgres DB config + DATABASES = { + 'default': { + 'ENGINE': 'django.contrib.gis.db.backends.postgis', + 'NAME': 'seeddb', + 'USER': 'seeduser', + 'PASSWORD': 'seedpass', + 'HOST': 'localhost', + 'PORT': '5432', + } + } + +You may want to comment out the AWS settings. + +For Redis, edit the `CACHES` and `CELERY_BROKER_URL` values to look like this: + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + +MapQuest API Key +---------------- + +Register for a MapQuest API key: +``_ + +Visit the Manage Keys page: +``_ +Either create a new key or use the key initially provided. +Copy the "Consumer Key" into the target organizations MapQuest API Key field under the organization's settings page or directly within the DB. + +Run Django Migrations +--------------------- + +Change back to the root of the repository. Now run the migration script to set +up the database tables + +.. code-block:: bash + + export DJANGO_SETTINGS_MODULE=config.settings.dev + ./manage.py migrate + +Django Admin User +----------------- + +You need a Django admin (super) user. + +.. code-block:: bash + + ./manage.py create_default_user --username=admin@my.org --organization=seedorg --password=badpass + +Of course, you need to save this user/password somewhere, since this is what +you will use to login to the SEED website. + +If you want to do any API testing (and of course you do!), you will need to +add an API KEY for this user. You can do this in postgresql directly: + +.. code-block:: bash + + psql seeddb seeduser + seeddb=> update landing_seeduser set api_key='DEADBEEF' where id=1; + +The 'secret' key DEADBEEF is hard-coded into the test scripts. + +Install Redis +------------- + +You need to manually install Redis for Celery to work. + +MacPorts:: + + sudo port install redis + +Homebrew:: + + brew install redis + # follow the post install instructions to add to launchagents or + # call manually with `redis-server` + +Install JavaScript Dependencies +------------------------------- + +The JS dependencies are installed using node.js package management (npm). + +.. code-block:: bash + + npm install + +Start the Server +---------------- + +You should put the following statement in ~/.bashrc or add it to the +virtualenv post-activation script (e.g., in +`~/.virtualenvs/seed/bin/postactivate`). + +.. code-block:: bash + + export DJANGO_SETTINGS_MODULE=config.settings.dev + +The combination of Redis, Celery, and Django have been encapsulated in a +single shell script, which examines existing processes and does not start +duplicate instances: + +.. code-block:: bash + + ./bin/start-seed.sh + +When this script is done, the Django stand-alone server will be running in +the foreground. + +Login +----- + +Open your browser and navigate to http://127.0.0.1:8000 + +Login with the user/password you created before, e.g., `admin@my.org` and +`badpass`. + +.. note:: + + these steps have been combined into a script called `start-seed.sh`. + The script will also not start Celery or Redis if they already seem + to be running. diff --git a/docs/code_documentation/3.1.0/_sources/translation.rst.txt b/docs/code_documentation/3.1.0/_sources/translation.rst.txt new file mode 100644 index 00000000..b40ae388 --- /dev/null +++ b/docs/code_documentation/3.1.0/_sources/translation.rst.txt @@ -0,0 +1,88 @@ +Translating SEED +================ + +1. Update translations on `lokalise`_. + +2. Copy lokalise.yml.example to lokalise.yml. Update API token. + +3. Install lokalise locally + + .. code:: bash + + brew tap lokalise/cli-2 + brew install lokalise2 + +3. Run scripts if you have Lokalise CLI installed. If not, see scripts for manual steps. + + .. code:: bash + + script/get_python_translations.sh + script/get_angular_translations.sh + +4. Uncomment the ``useMissingTranslationHandlerLog`` line seed.js to log untranslated strings to the console for review + +5. Verify and commit changes + +**Note: The lokalize website is the canonical source of data. If you +change the locale files locally, then you need to push them to +lokalize.** + +TL;DR + +SEED is localized for more than just English, so a little more care is +needed as we add new UI. All translatable strings are held in either +per-language ``.json`` files (for Angular-controlled strings, which are +the majority), or ``.mo`` files (for strings supplied by Django). + +At render time, SEED will sniff out the browser's ``Accept:`` header. +Based on that, we choose the right file. The language files themselves +are key->value mappings from a translation "key" to a translated value. +Either Angular or Django will then swap that value into the DOM wherever +it sees the key. If no translation is available, the key remains in the +DOM. (There are some wrinkles with HTML styling and pluralization that +we'll review below). + +So, the basic flow on top of any new UI features is now: + +1. Tag any user-visible strings in the UI as "translatable." There are + currently 12 (!) ways in which to do this; see below. +2. Create the translation key at `lokalise`_. We're using lokalise + because it can smooth over differences in the file formats that + Angular and Django require, and is a nice tool for managing the + process of getting translations done by a native speaker: we can put + up screenshots to clarify how the translated phrase is used, track + translation progress, etc. +3. Get a translation done. As a placeholder, lokalise can provide an + auto-filled translation from Google Translate or a few other + services, but it's fairly straightforward to order a professional + translation through lokalise. +4. Pull new translation files into the right places in the source tree + and commit them. There are scripts under ``/scripts`` to make this + mostly automatic. +5. Visually check that the containing UI looks OK with the translated + string(s). Some languages (e.g., French, German) can be wordy relative + to English and cause UI elements like buttons to expand oddly. Adjust + the layout or adjust the translation as needed. + +.. _general-philosophies--style: + +General philosophies / style +---------------------------- + +Don't go crazy with indirection and interpolation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +It's probably better to err on the side of too many keys than to get +clever with interpolation or Angular expressions to avoid +near-duplicates of keys. The aim should be that there is at least one +place where a competent translator can see the whole string at once. + +Compare: + +:: + +

{$:: inventory_type == 'taxlots' ? + translations['INCLUDE_SHARED_TAXLOTS'] : + translations['INCLUDE_SHARED'] + +.. _lokalise: https://lokalise.com/project/3537487659ca9b1dce98a7.36378626/?view=multi diff --git a/docs/code_documentation/3.1.0/_static/_sphinx_javascript_frameworks_compat.js b/docs/code_documentation/3.1.0/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/docs/code_documentation/3.1.0/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/docs/code_documentation/3.1.0/_static/basic.css b/docs/code_documentation/3.1.0/_static/basic.css new file mode 100644 index 00000000..30fee9d0 --- /dev/null +++ b/docs/code_documentation/3.1.0/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/_static/css/badge_only.css b/docs/code_documentation/3.1.0/_static/css/badge_only.css new file mode 100644 index 00000000..c718cee4 --- /dev/null +++ b/docs/code_documentation/3.1.0/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/Roboto-Slab-Bold.woff b/docs/code_documentation/3.1.0/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/Roboto-Slab-Bold.woff2 b/docs/code_documentation/3.1.0/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/Roboto-Slab-Regular.woff b/docs/code_documentation/3.1.0/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/Roboto-Slab-Regular.woff2 b/docs/code_documentation/3.1.0/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/fontawesome-webfont.eot b/docs/code_documentation/3.1.0/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/fontawesome-webfont.svg b/docs/code_documentation/3.1.0/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/docs/code_documentation/3.1.0/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/fontawesome-webfont.ttf b/docs/code_documentation/3.1.0/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/fontawesome-webfont.woff b/docs/code_documentation/3.1.0/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/fontawesome-webfont.woff2 b/docs/code_documentation/3.1.0/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/lato-bold-italic.woff b/docs/code_documentation/3.1.0/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/css/fonts/lato-bold-italic.woff differ diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/lato-bold-italic.woff2 b/docs/code_documentation/3.1.0/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/lato-bold.woff b/docs/code_documentation/3.1.0/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/css/fonts/lato-bold.woff differ diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/lato-bold.woff2 b/docs/code_documentation/3.1.0/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/css/fonts/lato-bold.woff2 differ diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/lato-normal-italic.woff b/docs/code_documentation/3.1.0/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/css/fonts/lato-normal-italic.woff differ diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/lato-normal-italic.woff2 b/docs/code_documentation/3.1.0/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/lato-normal.woff b/docs/code_documentation/3.1.0/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/css/fonts/lato-normal.woff differ diff --git a/docs/code_documentation/3.1.0/_static/css/fonts/lato-normal.woff2 b/docs/code_documentation/3.1.0/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/css/fonts/lato-normal.woff2 differ diff --git a/docs/code_documentation/3.1.0/_static/css/theme.css b/docs/code_documentation/3.1.0/_static/css/theme.css new file mode 100644 index 00000000..19a446a0 --- /dev/null +++ b/docs/code_documentation/3.1.0/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/_static/doctools.js b/docs/code_documentation/3.1.0/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/docs/code_documentation/3.1.0/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs/code_documentation/3.1.0/_static/documentation_options.js b/docs/code_documentation/3.1.0/_static/documentation_options.js new file mode 100644 index 00000000..3d35b36a --- /dev/null +++ b/docs/code_documentation/3.1.0/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '3.1.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/_static/file.png b/docs/code_documentation/3.1.0/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/file.png differ diff --git a/docs/code_documentation/3.1.0/_static/graphviz.css b/docs/code_documentation/3.1.0/_static/graphviz.css new file mode 100644 index 00000000..8d81c02e --- /dev/null +++ b/docs/code_documentation/3.1.0/_static/graphviz.css @@ -0,0 +1,19 @@ +/* + * graphviz.css + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- graphviz extension. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +img.graphviz { + border: 0; + max-width: 100%; +} + +object.graphviz { + max-width: 100%; +} diff --git a/docs/code_documentation/3.1.0/_static/jquery.js b/docs/code_documentation/3.1.0/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/docs/code_documentation/3.1.0/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/_static/js/html5shiv.min.js b/docs/code_documentation/3.1.0/_static/js/html5shiv.min.js new file mode 100644 index 00000000..cd1c674f --- /dev/null +++ b/docs/code_documentation/3.1.0/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/_static/js/theme.js b/docs/code_documentation/3.1.0/_static/js/theme.js new file mode 100644 index 00000000..1fddb6ee --- /dev/null +++ b/docs/code_documentation/3.1.0/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/docs/code_documentation/3.1.0/_static/minus.png b/docs/code_documentation/3.1.0/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/minus.png differ diff --git a/docs/code_documentation/3.1.0/_static/plus.png b/docs/code_documentation/3.1.0/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/docs/code_documentation/3.1.0/_static/plus.png differ diff --git a/docs/code_documentation/3.1.0/_static/pygments.css b/docs/code_documentation/3.1.0/_static/pygments.css new file mode 100644 index 00000000..0d49244e --- /dev/null +++ b/docs/code_documentation/3.1.0/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/_static/searchtools.js b/docs/code_documentation/3.1.0/_static/searchtools.js new file mode 100644 index 00000000..7918c3fa --- /dev/null +++ b/docs/code_documentation/3.1.0/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/docs/code_documentation/3.1.0/_static/sphinx_highlight.js b/docs/code_documentation/3.1.0/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/docs/code_documentation/3.1.0/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/docs/code_documentation/3.1.0/api.html b/docs/code_documentation/3.1.0/api.html new file mode 100644 index 00000000..562a200f --- /dev/null +++ b/docs/code_documentation/3.1.0/api.html @@ -0,0 +1,185 @@ + + + + + + + API — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

API

+
+

Authentication

+

Authentication is handled via an encoded authorization token set in a HTTP header. +To request an API token, go to /app/#/profile/developer and click ‘Get a New API Key’.

+

Authenticate every API request with your username (email, all lowercase) and the API key via Basic Auth. +The header is sent in the form of Authorization: Basic <credentials>, where credentials is the base64 encoding of the email and key joined by a single colon :.

+

Using Python, use the requests library:

+
import requests
+
+result = requests.get('https://seed-platform.org/api/version/', auth=(user_email, api_key))
+print result.json()
+
+
+

Using curl, pass the username and API key as follows:

+
curl -u user_email:api_key http://seed-platform.org/api/version/
+
+
+

If authentication fails, the response’s status code will be 302, redirecting the user to /app/login.

+
+
+

Payloads

+

Many requests require a JSON-encoded payload and parameters in the query string of the url. A frequent +requirement is including the organization_id of the org you belong to. For example:

+
curl -u user_email:api_key https://seed-platform.org/api/v2/organizations/12/
+
+
+

Or in a JSON payload:

+
curl -u user_email:api_key \
+  -d '{"organization_id":6, "role": "viewer"}' \
+  https://seed-platform.org/api/v2/users/12/update_role/
+
+
+

Using Python:

+
params = {'organization_id': 6, 'role': 'viewer'}
+result = requests.post('https://seed-platform.org/api/v2/users/12/update_role/',
+                       data=json.dumps(params),
+                       auth=(user_email, api_key))
+print result.json()
+
+
+
+
+

Responses

+

Responses from all requests will be JSON-encoded objects, as specified in each endpoint’s documentation. +In the case of an error, most endpoints will return this instead of the expected payload (or an HTTP status code):

+
{
+    "status": "error",
+    "message": "explanation of the error here"
+}
+
+
+
+
+

API Endpoints

+

A list of interactive endpoints are available by accessing the API menu item on the left navigation +pane within you account on your SEED instance.

+

To view a list of non-interactive endpoints without an account, view swagger on the development server.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/aws.html b/docs/code_documentation/3.1.0/aws.html new file mode 100644 index 00000000..ad34d15d --- /dev/null +++ b/docs/code_documentation/3.1.0/aws.html @@ -0,0 +1,275 @@ + + + + + + + AWS Setup — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

AWS Setup

+

Amazon Web Services (AWS) provides the preferred hosting for the SEED Platform.

+

seed is a Django Project and Django’s documentation is an excellent place for general +understanding of this project’s layout.

+
+

Prerequisites

+

Ubuntu server 18.04 LTS

+
+

Note

+

These instructions have not been updated for Ubuntu 18.04. It is recommended to use Docker-based deployments.

+
+
sudo apt-get update
+sudo apt-get upgrade
+sudo apt-get install -y libpq-dev python-dev python-pip libatlas-base-dev \
+gfortran build-essential g++ npm libxml2-dev libxslt1-dev git mercurial \
+libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python
+
+
+

PostgreSQL and Redis are not included in the above commands. For a quick installation on AWS it +is okay to install PostgreSQL and Redis locally on the AWS instance. If a more permanent and +scalable solution, it is recommended to use AWS’s hosted Redis (ElastiCache) and PostgreSQL service.

+
+

Note

+

postgresql >=9.4 is required to support JSON Type

+
+
# To install PostgreSQL and Redis locally
+sudo apt-get install redis-server
+sudo apt-get install postgresql postgresql-contrib
+
+
+
+

Amazon Web Services (AWS) Dependencies

+

The following AWS services can be used for SEED but are not required:

+
    +
  • RDS (PostgreSQL >=9.4)

  • +
  • ElastiCache (redis)

  • +
  • SES

  • +
+
+
+
+

Python Dependencies

+

Clone the SEED repository from github

+
$ git clone git@github.com:SEED-platform/seed.git
+
+
+

enter the repo and install the python dependencies from requirements

+
$ cd seed
+$ sudo pip install -r requirements/aws.txt
+
+
+
+
+

JavaScript Dependencies

+

npm is required to install the JS dependencies.

+
$ sudo apt-get install build-essential
+$ sudo apt-get install curl
+
+
+
$ npm install
+
+
+
+
+

Database Configuration

+

Copy the local_untracked.py.dist file in the config/settings directory to +config/settings/local_untracked.py, and add a DATABASES configuration with your database username, +password, host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database +instance you have manually installed within your infrastructure.

+
# Database
+DATABASES = {
+    'default': {
+        'ENGINE':'django.db.backends.postgresql_psycopg2',
+        'NAME': 'seed',
+        'USER': '',
+        'PASSWORD': '',
+        'HOST': '',
+        'PORT': '',
+    }
+}
+
+
+
+

Note

+

In the above database configuration, seed is the database name, this +is arbitrary and any valid name can be used as long as the database exists.

+
+

create the database within the postgres psql shell:

+
CREATE DATABASE seed;
+
+
+

or from the command line:

+
createdb seed
+
+
+

create the database tables and migrations:

+
python manage.py syncdb
+python manage.py migrate
+
+
+

create a superuser to access the system

+
$ python manage.py create_default_user --username=demo@example.com --organization=example --password=demo123
+
+
+
+

Note

+

Every user must be tied to an organization, visit /app/#/profile/admin +as the superuser to create parent organizations and add users to them.

+
+
+
+

Cache and Message Broker

+

The SEED project relies on redis for both cache and message brokering, and +is available as an AWS ElastiCache service. +local_untracked.py should be updated with the CACHES and CELERY_BROKER_URL +settings.

+
CELERY_BROKER_URL = 'redis://seed-core-cache.ntmprk.0001.usw2.cache.amazonaws.com:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+
+
+
+

Running Celery the Background Task Worker

+

Celery is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, celery +can be started:

+
celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/data_model.html b/docs/code_documentation/3.1.0/data_model.html new file mode 100644 index 00000000..56ff0a3b --- /dev/null +++ b/docs/code_documentation/3.1.0/data_model.html @@ -0,0 +1,606 @@ + + + + + + + Data Model — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Data Model

+_images/case-a.webp +_images/case-b.webp +_images/case-c.webp +_images/case-d.webp +_images/data-model.webp +
+

Todo

+

Documentation below is out of state and needs updated.

+
+

Our primary data model is based on a tree structure with BuildingSnapshot +instances as nodes of the tree and the tip of the tree referenced by a +CanonicalBuilding.

+

Take the following example: a user has loaded a CSV file containing information +about one building and created the first BuildingSnapshot (BS0). At this point +in time, BS0 is linked to the first CanonicalBuilding (CB0), and CB0 is also +linked to BS0.

+
BS0 <-- CB0
+BS0 --> CB0
+
+
+

These relations are represented in the database as foreign keys from the +BuildingSnapshot table to the CanonicalBuilding table, and from the +CanonicalBuilding table to the BuildingSnapshot table.

+

The tree structure comes to fruition when a building, BS0 in our case, is +matched with a new building, say BS1, enters the system and is auto-matched.

+

Here BS1 entered the system and was matched with BS0. When a match occurs, +a new BuildingSnapshot is created, BS2, with the fields from the existing +BuildingSnapshot, BS0, and the new BuildingSnapshot, BS1, merged +together. If both the existing and new BuildingSnapshot have data for a +given field, the new record’s fields are preferred and merged into the child, B3.

+

The fields from new snapshot are preferred because that is the newer of the +two records from the perspective of the system. By preferring the most recent fields +this allows for evolving building snapshots over time. For example, if an existing +canonical record has a Site EUI value of 75 and some changes happen to a building +that cause this to change to 80 the user can submit a new record with that change.

+

All BuildingSnapshot instances point to a CanonicalBuilding.

+
BS0  BS1
+  \ /
+  BS2 <-- CB0
+
+BS0 --> CB0
+BS1 --> CB0
+BS2 --> CB0
+
+
+
+

parents and children

+

BuildingSnapshots also have linkage to other BuildingSnapshots in order to +keep track of their parents and children. This is represented in the +Django model as a many-to-many relation from BuildingSnapshot to BuildingSnapshot. +It is represented in the PostgreSQL database as an additional seed_buildingsnapshot_children +table.

+

In our case here, BS0 and BS1 would both have children BS2, and BS2 would +have parents BS0 and BS1.

+
+

Note

+

throughout most of the application, the search_buildings endpoint +is used to search or list active building. This is to say, buildings that +are pointed to by an active CanonicalBuilding. +The search_mapping_results endpoint allows the search of buildings +regardless of whether the BuildingSnapshot is pointed to by an active +CanonicalBuilding or not and this search is needed during the mapping +preview and matching sections of the application.

+
+

For illustration purposes let’s suppose BS2 and a new building BS3 match to form a child BS4.

+ + + + + + + + + + + + + + + + + + + + +

parent

child

BS0

BS2

BS1

BS2

BS2

BS4

BS3

BS4

+

And the corresponding tree would look like:

+
BS0  BS1
+  \ /
+  BS2  BS3
+    \  /
+     BS4 <-- CB0
+
+BS0 --> CB0
+BS1 --> CB0
+BS2 --> CB0
+BS3 --> CB0
+BS4 --> CB0
+
+
+
+

matching

+

During the auto-matching process, if a raw BuildingSnapshot matches an +existing BuildingSnapshot instance, then it will point to the existing +BuildingSnapshot instance’s CanonicalBuilding. In the case where there is no +existing BuildingSnapshot to match, a new CanonicalBuilding will be created, as +happened to B0 and C0 above.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

field

BS0

BS1

BS2 (child)

id1

11

11

11

id2

12

12

id3

13

13

id4

14

15

15

+
+
+
+

manual-matching vs auto-matching

+

Since BuildingSnapshots can be manually matched, there is the possibility for +two BuildingSnapshots each with an active CanonicalBuilding to match and the +system has to choose to move only one CanonicalBuilding to the tip of the tree +for the primary BuildingSnapshot and deactivate the secondary +BuildingSnapshot’s CanonicalBuilding.

+

Take for example:

+
BS0  BS1
+  \ /
+  BS2  BS3
+    \  /
+     BS4 <-- CB0 (active: True)         BS5 <-- CB1 (active: True)
+
+
+

If a user decides to manually match BS4 and BS5, the system will take the +primary BuildingSnapshot’s CanonicalBuilding and have it point to their +child and deactivate CB1. The deactivation is handled by setting a field +on the CanonicalBuilding instance, active, from True to False.

+

Here is what the tree would look like after the manual match of BS4 and +BS5:

+
BS0  BS1
+  \ /
+  BS2  BS3
+    \  /
+     BS4  BS5 <-- CB1 (active: False)
+       \  /
+        BS6 <-- CB0 (active: True)
+
+
+

Even though BS5 is pointed to by a CanonicalBuilding, CB1, BS5 will not be +returned by the normal search_buildings endpoint because the +CanonicalBuilding pointing to it has its field active set to False.

+
+

Note

+

anytime a match is unmatched the system will create a new +CanonicalBuilding or set an existing CanonicalBuilding’s active field to +True for any leaf BuildingSnapshot trees.

+
+
+
+

what really happens to the BuildingSnapshot table on import (and when)

+

The above is conceptually what happens but sometimes the devil is in the details. +Here is what happens to the BuildingSnapshot table in the database when records +are imported.

+

Every time a record is added at least two BuildingSnapshot records are created.

+

Consider the following simple record:

+ + + + + + + + + + + + + + + + + +

Property Id

Year Ending

Property Floor Area

Address 1

Release Date

499045

2000

1234

1 fake st

12/12/2000

+

The first thing the user is upload the file. When the user sees the +“Successful Upload!” dialog one record has been added to the +BuildingSnapshot table.

+

This new record has an id (73700 in this case) and a created and +modified timestamp. Then there are a lot of empty fields and a +source_type of 0. Then there is the extra_data column which contains +the contents of the record in key-value form:

+
+
Address 1:
+

“1 fake st”

+
+
Property Id:
+

“499045”

+
+
Year Ending:
+

“2000”

+
+
Release Date:
+

“12/12/2000”

+
+
Property Floor Area:
+

“1234”

+
+
+

And a corresponding extra_data_sources that looks like

+
+
Address 1:
+

73700

+
+
Property Id:
+

73700

+
+
Year Ending:
+

73700

+
+
Release Date:
+

73700

+
+
Property Floor Area:
+

73700

+
+
+

All of the fields that look like _source_id are also populated +with 73700 E.G. owner_postal_code_source_id.

+

The other fields of interest are the organization field which +is populated with the user’s default organization and the import_file_id +field which is populated with a reference to a data_importer_importfile record.

+

At this point the record has been created before the user hits the +“Continue to data mapping” button.

+

The second record (id = 73701) is created by the time the user gets to the screen +with the “Save Mappings” button. This second record has the following fields populated:

+
    +
  • id

  • +
  • created

  • +
  • modified

  • +
  • pm_property_id

  • +
  • year_ending

  • +
  • gross_floor_area

  • +
  • address_line_1

  • +
  • release_date

  • +
  • source_type (this is 2 instead of 0 as with the other record)

  • +
  • import_file_id

  • +
  • organization_id.

  • +
+

That is all. All other fields are empty. In this case that is all that happens.

+

Now consider the same user uploading a new file from the next year that looks like

+ + + + + + + + + + + + + + + + + +

Property Id

Year Ending

Property Floor Area

Address 1

Release Date

499045

2000

1234

1 fake st

12/12/2001

+

As before one new record is created on upload. This has id 73702 and follows the same +pattern as 73700. And similarly 73703 is created like 73701 before the “Save Mappings” +button appears.

+

However this time the system was able to make a match with an existing record. +After the user clicks the “Confirm mappings & start matching” button a new record +is created with ID 73704.

+

73704 is identical to 73703 (in terms of contents of the BuildingSnapshot table only) +with the following exceptions:

+
    +
  • created and modified timestamps are different

  • +
  • match type is populated and has a value of 1

  • +
  • confidence is populated and has a value of .9

  • +
  • source_type is 4 instead of 2

  • +
  • canonical_building_id is populated with a value

  • +
  • import_file_id is NULL

  • +
  • last_modified_by_id is populated with value 2 (This is a key into the landing_seeduser table)

  • +
  • address_line_1_source_id is 73701

  • +
  • gross_floor_area_source_id is populated with value 73701

  • +
  • pm_property_id_source_id is populated with 73701

  • +
  • release_date_source_id is populated with 73701

  • +
  • year_ending_source_id is populated with 73701

  • +
+
+
+

what really happens to the CanonicalBuilding table on import (and when)

+

In addition to the BuildingSnapshot table the CanonicalBuilding table is also updated +during the import process. To summarize the above 5 records were created in the +BuildingSnapshot table:

+
    +
  1. 73700 is created from the raw 2000 data

  2. +
  3. 73701 is the mapped 2000 data,

  4. +
  5. 73702 is created from the raw 2001 data

  6. +
  7. 73703 is the mapped 2001 data

  8. +
  9. 73704 is the result of merging the 2000 and 2001 data.

  10. +
+

In this process CanonicalBuilding is updated twice. First when the 2000 record is imported the +CanonicalBuilding gets populated with one new row at the end of the matching step. +I.E. when the user sees the “Load More Data” screen. At this point there is a new row that looks like

+ + + + + + + + + + + + + +

id

active

canonical_building_id

20505

TRUE

73701

+

At this point there is one new canonical building and that is the BuildingSnapshot with +id 73701. Next the user uploads the 2001 data. When the “Matching Results” screen +appears the CanonicalBuilding table has been updated. Now it looks like

+ + + + + + + + + + + + + +

id

active

canonical_building_id

20505

TRUE

73704

+

There is still only one canonical building but now it is the BuildingSnapshot record +that is the result of merging the 2000 and 2001 data: id = 73704.

+
+
+

organization

+

BuildingSnapshots belong to an Organization field that is a foreign key into the organization +model (orgs_organization in Postgres).

+

Many endpoints filter the buildings based on the organizations the requesting user +belongs to. E.G. get_buildings changes which fields are returned based on the +requesting user’s membership in the BuildingSnapshot’s organization.

+
+
+

*_source_id fields

+

Any field in the BuildingSnapshot table that is populated with data from a +submitted record will have a corresponding _source_id field. E.G +pm_property_id has pm_property_id_source_id, +address_line_1 has address_line_1_source_id, +etc…

+

These are foreign keys into the BuildingSnapshot that is the source of that +value. To extend the above table

+ + + + + + + + + + + + + + + + + + + + + + + +

field

BS0

BS1

BS2 (child)

BS2 (child) _source_id

id1

11

11

BS0

id2

12

12

BS1

+

NOTE: The BuildingSnapshot records made from the raw input file have all the +_source_id fields populated with that record’s ID. The non-canonical BuildingSnapshot +records created from the mapped data have none set. The canonical BuildingSnapshot +records that are the result of merging two records have only the _source_id fields +set where the record itself has data. E.G. in the above address_line_1 is set to +“1 fake st.” so there is a value in the canonical BuildingSnapshot’s address_line_1_source_id +field. However there is no block number so block_number_source_id is empty. This +is unlike the two raw BuildingSnapshot records who also have no block_number but +nevertheless have a block_number_source_id populated.

+
+
+

extra_data

+

The BuildingSnapshot model has many “named” fields. Fields like “address_line_1”, +“year_built”, and “pm_property_id”. However the users are allowed to submit files +with arbitrary fields. Some of those arbitrary fields can be mapped to “named” +fields. E.G. “Street Address” can usually be mapped to “Address Line 1”. +For all the fields that cannot be mapped like that there is the extra_data field.

+

extra_data is Django json field that serves as key-value storage for other +user-submitted fields. As with the other “named” fields there is a corresponding +extra_data_sources field that serves the same role as the other _source_id fields. +E.G. If a BuildingSnapshot has an extra_data field that looks like

+
+
an_unknown_field:
+

1

+
+
something_else:
+

2

+
+
+

It should have an extra_data_sources field that looks like

+
+
an_unknown_field:
+

some_BuildingSnapshot_id

+
+
something_else:
+

another_BuildingSnapshot_id

+
+
+
+
+

saving and possible data loss

+

When saving a Property file some fields that are truncated if too long. +The following are truncated to 255 characters

+
    +
  • jurisdiction_tax_lot_id

  • +
  • pm_property_id

  • +
  • custom_id_1

  • +
  • ubid

  • +
  • lot_number

  • +
  • block_number

  • +
  • district

  • +
  • owner

  • +
  • owner_email

  • +
  • owner_telephone

  • +
  • owner_address

  • +
  • owner_city_state

  • +
  • owner_postal_code

  • +
+

And the following are truncated to 255:

+
    +
  • property_name

  • +
  • address_line_1

  • +
  • address_line_2

  • +
  • city

  • +
  • postal_code

  • +
  • state_province

  • +
  • building_certification

  • +
+

No truncation happens to any of the fields stored in extra_data.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/data_quality.html b/docs/code_documentation/3.1.0/data_quality.html new file mode 100644 index 00000000..42c2b780 --- /dev/null +++ b/docs/code_documentation/3.1.0/data_quality.html @@ -0,0 +1,126 @@ + + + + + + + Data Quality — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Data Quality

+

Data quality checks are run after the data are paired, during import of Properties/TaxLots, or on-demand by selecting rows in the inventory +page and clicking the action button. This checks whether any default or user-defined Rules are broken or satisfied by Property/TaxLot records.

+

Notably, in most cases when data quality checks are run, Labels can be applied for any broken Rules that have a Label. +To elaborate, Rules can have an attached Label. When a data quality check is run, records that break one of these “Labeled Rules” +are then given that Label. The case where this Label attachment does not happen is during import due to performance reasons.

+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/deployment.html b/docs/code_documentation/3.1.0/deployment.html new file mode 100644 index 00000000..63056433 --- /dev/null +++ b/docs/code_documentation/3.1.0/deployment.html @@ -0,0 +1,212 @@ + + + + + + + Deployment Guide — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Deployment Guide

+

SEED is intended to be installed on Linux instances in the cloud (e.g., AWS), and on local hardware. SEED Platform does not officially support Windows for production deployment. If this is desired, see the Django notes.

+ +
+

Migrations

+

Migrations are handles through Django; however, various versions have customs actions for the migrations. See the migrations page for more information.

+
+
+

Monitoring

+
+

Sentry

+

Sentry can monitor your webservers for any issues. To enable sentry add the following to +your local_untracked.py files after setting up your Sentry account on sentry.io.

+

The RAVEN_CONFIG is used for the backend and the SENTRY_JS_DSN is used for the frontend. At the moment, +it is recommended to setup two sentry projects, one for backend and one for frontend.

+
import sentry_sdk
+from sentry_sdk.integrations.django import DjangoIntegration
+from sentry_sdk.integrations.celery import CeleryIntegration
+
+sentry_sdk.init(
+    dsn="https://<user>@<key>.ingest.sentry.io/<job>",
+    integrations=[
+        DjangoIntegration(),
+        CeleryIntegration(),
+    ],
+
+    # Set traces_sample_rate to 1.0 to capture 100%
+    # of transactions for performance monitoring.
+    # We recommend adjusting this value in production.
+    traces_sample_rate=1.0,
+
+    # If you wish to associate users to errors (assuming you are using
+    # django.contrib.auth) you may enable sending PII data.
+    send_default_pii=True
+)
+
+SENTRY_JS_DSN = 'https://<key>@sentry.io/<job_id>'
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/developer_resources.html b/docs/code_documentation/3.1.0/developer_resources.html new file mode 100644 index 00000000..46c10b43 --- /dev/null +++ b/docs/code_documentation/3.1.0/developer_resources.html @@ -0,0 +1,610 @@ + + + + + + + Developer Resources — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Developer Resources

+ +
+

General Notes

+
+

Pre-commit

+

We use precommit commits for formatting. Set it up locally with

+
pre-commit install
+
+
+
+
+

Ruff Settings

+

Ruff is used to statically verify code syntax. To run ruff locally call:

+
tox -e precommit -- ruff
+tox -e precommit -- ruff-format
+
+
+
+
+

Python Type Hints

+

Python type hints are beginning to be added to the SEED codebase. The benefits are +eliminating some accidental typing mistakes to prevent bugs as well as a better IDE +experience.

+
+

Usage

+

SEED does not require exhaustive type annotations, but it is recommended you add them if you +create any new functions or refactor any existing code where it might be beneficial (e.g. types +that appear ambiguous or that the IDE can’t determine) and not require a ton of additional effort.

+

When applicable, we recommend you use built-in collection types +such as list, dict or tuple instead of the capitalized types +from the typing module. You can also use TypedDict and NotRequired from the typing_extensions +package to specify the types of required/optional keys of dictionaries.

+

Common gotchas:

+
    +
  • If trying to annotate a class method with the class itself, import from __future__ import annotations

  • +
  • If you’re getting warnings about runtime errors due to a type name, make sure your IDE is set up to point to an environment with python 3.9

  • +
  • If you’re wasting time trying to please the type checker, feel free to throw # type: ignore on the problematic line (or at the top of the file to ignore all issues for that file)

  • +
+
+
+

Type Checking

+

CI currently runs static type checking on the codebase using mypy. For +your own IDE, we recommend the following extensions:

+
    +
  • VSCode: Pylance (uses Microsoft’s Pyright type checking)

  • +
+

To run the same typechecking applied in CI (i.e., using mypy) you can run the following

+
tox -e mypy
+
+
+
+
+
+
+

Django Notes

+
+

Adding New Fields to Database

+

Adding new fields to SEED can be complicated since SEED has a mix of typed fields (database fields) and extra data +fields. Follow the steps below to add new fields to the SEED database:

+
    +
  1. Add the field to the PropertyState or the TaxLotState model. Adding fields to the Property or TaxLot models is more complicated and not documented yet.

  2. +
  3. Add field to list in the following locations:

  4. +
+
    +
  • models/columns.py: Column.DATABASE_COLUMNS

  • +
  • TaxLotState.coparent or PropertyState.coparent: SQL query and keep_fields

  • +
+
    +
  1. Run ./manage.py makemigrations

  2. +
  3. Add in a Python script in the new migration to add in the new column into every organizations list of columns. Note that the new_db_fields will be the same as the data in the Column.DATABASE_COLUMNS that were added.

    +
    +
    def forwards(apps, schema_editor):
    +    Column = apps.get_model("seed", "Column")
    +    Organization = apps.get_model("orgs", "Organization")
    +
    +    new_db_fields = [
    +        {
    +            'column_name': 'geocoding_confidence',
    +            'table_name': 'PropertyState',
    +            'display_name': 'Geocoding Confidence',
    +            'column_description': 'Geocoding Confidence',
    +            'data_type': 'number',
    +        }, {
    +            'column_name': 'geocoding_confidence',
    +            'table_name': 'TaxLotState',
    +            'display_name': 'Geocoding Confidence',
    +            'column_description': 'Geocoding Confidence',
    +            'data_type': 'number',
    +        }
    +    ]
    +
    +    # Go through all the organizations
    +    for org in Organization.objects.all():
    +        for new_db_field in new_db_fields:
    +            columns = Column.objects.filter(
    +                organization_id=org.id,
    +                table_name=new_db_field['table_name'],
    +                column_name=new_db_field['column_name'],
    +                is_extra_data=False,
    +            )
    +
    +            if not columns.count():
    +                new_db_field['organization_id'] = org.id
    +                Column.objects.create(**new_db_field)
    +            elif columns.count() == 1:
    +                # If the column exists, then update the display_name and data_type if empty
    +                c = columns.first()
    +                if c.display_name is None or c.display_name == '':
    +                    c.display_name = new_db_field['display_name']
    +                if c.data_type is None or c.data_type == '' or c.data_type == 'None':
    +                    c.data_type = new_db_field['data_type']
    +                        for col in columns:
    +                # If the column exists, then update the column_description if empty
    +                if c.column_description is None or c.column_description == '':
    +                    c.column_description = new_db_field['column_description']
    +                c.save()
    +            else:
    +                print("  More than one column returned")
    +
    +
    +class Migration(migrations.Migration):
    +    dependencies = [
    +        ('seed', '0090_auto_20180425_1154'),
    +    ]
    +
    +    operations = [
    +        ... existing db migrations ...,
    +        migrations.RunPython(forwards),
    +    ]
    +
    +
    +
    +
  4. +
  5. Run migrations ./manage.py migrate

  6. +
  7. Run unit tests, fix failures. Below is a list of files that need to be fixed (this is not an exhaustive list)

  8. +
+
    +
  • test_mapping_data.py:test_keys

  • +
  • test_columns.py:test_column_retrieve_schema

  • +
  • test_columns.py:test_column_retrieve_db_fields

  • +
+
    +
  1. (Optional) Update example files to include new fields

  2. +
  3. Test import workflow with mapping to new fields

  4. +
+
+
+
+

NGINX Notes

+

Toggle maintenance mode to display a maintenance page and prevent access to all site resources including API endpoints:

+
docker exec seed_web ./docker/maintenance.sh on
+docker exec seed_web ./docker/maintenance.sh off
+
+
+
+
+

AngularJS Integration Notes

+
+

Template Tags

+

Angular and Django both use {{ and }} as variable delimiters, and thus the AngularJS variable delimiters are +renamed {$ and $}.

+
window.SEED.apps.seed = angular.module('SEED', ['$interpolateProvider', ($interpolateProvider) => {
+  $interpolateProvider.startSymbol('{$');
+  $interpolateProvider.endSymbol('$}');
+}]);
+
+
+
+
+

Django CSRF Token and AJAX Requests

+

For ease of making angular $http requests, we automatically add the CSRF token to all $http requests as +recommended by http://django-angular.readthedocs.io/en/latest/integration.html#xmlhttprequest

+
window.SEED.apps.seed.run(($http, $cookies) => {
+  $http.defaults.headers.common['X-CSRFToken'] = $cookies['csrftoken'];
+});
+
+
+
+
+

Routes and Partials or Views

+

Routes in static/seed/js/seed.js (the normal angularjs app.js)

+
SEED_app.config(['stateHelperProvider', '$urlRouterProvider', '$locationProvider', (stateHelperProvider, $urlRouterProvider, $locationProvider) => {
+  stateHelperProvider
+    .state({
+      name: 'home',
+      url: '/',
+      templateUrl: static_url + 'seed/partials/home.html'
+    })
+    .state({
+      name: 'profile',
+      url: '/profile',
+      templateUrl: static_url + 'seed/partials/profile.html',
+      controller: 'profile_controller',
+      resolve: {
+        auth_payload: ['auth_service', '$q', 'user_service', function (auth_service, $q, user_service) {
+          var organization_id = user_service.get_organization().id;
+          return auth_service.is_authorized(organization_id, ['requires_superuser']);
+        }],
+        user_profile_payload: ['user_service', function (user_service) {
+          return user_service.get_user_profile();
+        }]
+      }
+    });
+}]);
+
+
+

HTML partials in static/seed/partials/

+
+
+
+

Logging

+

Information about error logging can be found here - https://docs.djangoproject.com/en/1.7/topics/logging/

+

Below is a standard set of error messages from Django.

+

A logger is configured to have a log level. This log level describes the severity of +the messages that the logger will handle. Python defines the following log levels:

+
DEBUG: Low level system information for debugging purposes
+INFO: General system information
+WARNING: Information describing a minor problem that has occurred.
+ERROR: Information describing a major problem that has occurred.
+CRITICAL: Information describing a critical problem that has occurred.
+
+
+

Each message that is written to the logger is a Log Record. The log record is stored +in the web server & Celery

+
+
+

BEDES Compliance and Managing Columns

+

Columns that do not represent hardcoded fields in the application are represented using +a Django database model defined in the seed.models module. The goal of adding new columns +to the database is to create seed.models.Column records in the database for each column to +import. Currently, the list of Columns is dynamically populated by importing data.

+

There are default mappings for ESPM are located here:

+
+
+
+
+

Resetting the Database

+

This is a brief description of how to drop and re-create the database +for the seed application.

+

The first two commands below are commands distributed with the +Postgres database, and are not part of the SEED application. The third +command below will create the required database tables for SEED and +setup initial data that the application expects (e.g. initial columns for +BEDES). The last command below (spanning multiple lines) will create a +new superuser and organization that you can use to login to the +application, and from there create any other users or organizations +that you require.

+

Below are the commands for resetting the database and creating a new +user:

+
createuser -U seed seeduser
+
+psql -d postgres -U seeduser -c 'DROP DATABASE seed;'
+psql -d postgres -U seeduser -c 'CREATE DATABASE seed;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;'
+
+./manage.py migrate
+./manage.py create_default_user \
+    --username=demo@seed-platform.org \
+    --password=password \
+    --organization=testorg
+
+
+
+
+

Restoring a Database Dump

+
psql -d postgres -U seeduser -c 'DROP DATABASE seed;'
+psql -d postgres -U seeduser -c 'CREATE DATABASE seed;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;'
+psql -d seed -U seeduser -c 'SELECT timescaledb_pre_restore();'
+
+# restore a previous database dump (must be pg_restore 12+)
+pg_restore -d seed -U seeduser /backups/prod-backups/prod_20191203_000002.dump
+# if any errors appear during the pg_restore process check that the `installed_version` of the timescaledb extension where the database was dumped matches the extension version where it's being restored
+# `SELECT default_version, installed_version FROM pg_available_extensions WHERE name = 'timescaledb';`
+
+psql -d seed -U seeduser -c 'SELECT timescaledb_post_restore();'
+
+./manage.py migrate
+
+# if needed add a user to the database
+./manage.py create_default_user \
+    --username=demo@seed-platform.org \
+    --password=password \
+    --organization=testorg
+
+
+

If restoring a production backup to a different deployment update the site settings for password reset emails, and disable celerybeat Salesforce updates/emails:

+
./manage.py shell
+
+from django.contrib.sites.models import Site
+site = Site.objects.first()
+site.domain = 'dev1.seed-platform.org'
+site.name = 'SEED Dev1'
+site.save()
+
+from seed.models import Organization
+Organization.objects.filter(salesforce_enabled=True).update(salesforce_enabled=False)
+
+from django_celery_beat.models import PeriodicTask, PeriodicTasks
+PeriodicTask.objects.filter(enabled=True, name__startswith='salesforce_sync_org-').update(enabled=False)
+PeriodicTasks.update_changed()
+
+
+
+
+

Migrating the Database

+

Migrations are handles through Django; however, various versions have customs actions for the migrations. See the migrations page for more information based on the version of SEED.

+
+
+

Testing

+

JS tests can be run with Jasmine at the url /angular_js_tests/.

+

Python unit tests are run with

+
python manage.py test --settings=config.settings.test
+
+
+
+
Note on geocode-related testing:

Most of these tests use VCR.py and cassettes to capture and reuse recordings of HTTP requests and responses. Given that, unless you want to make changes and/or refresh the cassettes/recordings, there isn’t anything needed to run the geocode tests.

+

In the case that the geocoding logic/code is changed or you’d like to the verify the MapQuest API is still working as expected, you’ll need to run the tests with a small change. Namely, you’ll want to provide the tests with an API key via an environment variable called “TESTING_MAPQUEST_API_KEY” or within your local_untracked.py file with that same variable name.

+

In order to refresh the actual cassettes, you’ll just need to delete or move the old ones which can be found at “.seed/tests/data/vcr_cassettes”. The API key should be hidden within the cassettes, so these new cassettes can and should be pushed to GitHub.

+
+
+

Run coverage using

+
coverage run manage.py test --settings=config.settings.test
+coverage report --fail-under=83
+
+
+

Python compliance uses Ruff

+
tox -e precommit -- ruff
+tox -e precommit -- ruff-format
+
+
+

JavaScript compliance uses ESLint, SCSS compliance uses StyleLint, and HTML compliance uses Prettier

+
npm run lint
+npm run lint:fix
+
+
+
+
+

Building Documentation

+

Older versions of the source code documentation are (still) on readthedocs; however, newer versions are built and pushed to the seed-website repository manually. To build the documentation follow the script below:

+
cd docs
+rm -rf htmlout
+sphinx-build -b html source htmlout
+
+
+

For releasing, copy the htmlout directory into the seed-platform’s website repository under docs/code_documentation/<new_version>. Make sure to add the new documentation to the table in the docs/developer_resources.md.

+
+
+

Contribution Instructions / Best Practices

+

If this is the first time contributing and you are outside of the DOE National Lab system, then you will need to review and fill out the contribution agreement which is found in SEED’s Contribution Agreement in the GitHub repository

+

The desired workflow for development and submitting changes is the following:

+
    +
  1. Fork the repository on GitHub if you do not have access to the repository, otherwise, work within the https://github.com/seed-platform/seed repository.

  2. +
  3. Ensure there is a ticket/issue created for the work you are doing. Verify that the ticket is assigned to you and that it is part of the latest project board on the GitHub site (https://github.com/orgs/SEED-platform/projects).

  4. +
  5. Move the ticket/issue to ‘In Progress’ in the GitHub project tracker when you begin work

  6. +
  7. Create a branch off of develop (unless it is a hotfix, then branch of the appropriate tag). The recommended naming convention is <issue_id>-short-descriptive-name.

  8. +
  9. Make changes and write a test for the code added.

  10. +
  11. Make sure tests pass locally. Most branches created and pushed to GitHub will be tested automatically.

  12. +
  13. Upon completion of the work, create a pull request (PR) against the develop branch (or hotfix branch if applicable). In the PR description fill out the requested information and include the issue number (e.g., #1234).

  14. +
  15. +
    Assign one label to the PR (not the ticket/issue) in order to auto-populate change logs (e.g., Bug, Feature, Maintenance, Performance, DoNotPublish) This is required and CI will fail if not present.
      +
    • Bug (these will appear as “Bug Fixes” in the change log)

    • +
    • Feature (features will appear as “New Features” item in the change log)

    • +
    • Enhancement (these will appear as “Improvements” in the change log)

    • +
    • Maintenance (these will appear under “Maintenance” in the change log)

    • +
    • Performance (these will appear under “Maintenance” in the change log)

    • +
    • Documentation (these will appear under “Maintenance” in the change log)

    • +
    • Do not publish (these will no appear in the change log)

    • +
    +
    +
    +
  16. +
  17. Ensure all tests pass.

  18. +
  19. Assign a reviewer to the PR.

  20. +
  21. If the reviewer requests changes, then addresses changes and re-assign the reviewer as needed.

  22. +
  23. Once approved, merge the PR!

  24. +
  25. Move the related ticket(s)/issue(s) to the ‘Ready to Deploy’ column in the GitHub project tracker.

  26. +
+
+
+

Release Instructions

+

To make a release do the following:

+
    +
  1. Create a branch from develop to prepare the updates (e.g., 2.21.0-release-prep).

  2. +
  3. Update the root package.json file with the release version number, and then run npm install. Always use MAJOR.MINOR.RELEASE.

  4. +
  5. Update the docs/sources/migrations.rst file with any required actions.

  6. +
  7. Commit the changes and push the release prep branch to GitHub, then go to the Releases page to draft a new release which will generate the changelog.

  8. +
  9. Copy the GitHub changelog results into CHANGELOG.md. Cleanup the formatting and items as needed (make sure the spelling is correct, starts with a capital letter, if any PRs were missing the Do not publish label, etc.) and push the changelog update.

  10. +
  11. Make sure that any new UI needing localization has been tagged for translation, and that any new translation keys exist in the lokalise.com project. (see translation documentation).

  12. +
  13. Create PR for release preparation and merge after tests/reviews pass.

  14. +
  15. Create a new Release using the develop branch and new release number as the tag (https://github.com/SEED-platform/seed/releases). Include list of changes since previous release (e.g., the additions to CHANGELOG.md).

  16. +
  17. Locally, merge the develop branch into the main branch and push.

  18. +
  19. Verify that the Docker versions are built and pushed to Docker Hub (https://hub.docker.com/r/seedplatform/seed/tags/).

  20. +
  21. Publish the new documentation in the seed-platform website repository (see instructions above under Building Documentation).

  22. +
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/docker.html b/docs/code_documentation/3.1.0/docker.html new file mode 100644 index 00000000..a42eabce --- /dev/null +++ b/docs/code_documentation/3.1.0/docker.html @@ -0,0 +1,246 @@ + + + + + + + Docker Deployment on AWS — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Docker Deployment on AWS

+

Amazon Web Services (AWS) provides the preferred hosting for the SEED Platform.

+

seed is a Django Project and Django’s documentation is an excellent place for general +understanding of this project’s layout.

+
+

Installation

+

Ubuntu server 18.04 or newer with a m5ad.xlarge (if using in Production instance)

+
    +
  • After launching the instance, run the following commands to install docker.

  • +
+
# Install any upgrades
+sudo apt-get update
+sudo apt-get upgrade -y
+
+# Remove any old docker engines
+sudo apt-get remove docker docker-engine docker.io containerd runc
+
+# Install docker community edition
+sudo apt-get update
+sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
+curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
+sudo add-apt-repository \
+    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
+    $(lsb_release -cs) \
+    stable"
+
+sudo apt-get update
+sudo apt-get install -y docker-ce docker-ce-cli containerd.io
+# Add your user to the docker group
+sudo groupadd docker
+sudo usermod -aG docker $USER
+newgrp docker
+
+
+
+

Note

+

It is okay if the first command fails

+
+
    +
  • Verify that the DNS is working correctly. Run the following and verify the response lists IPs (v6 most likely)

  • +
+
# verify that the dns resolves
+docker run --rm seedplatform/seed getent hosts seed-platform.org
+# or
+docker run --rm tutum/dnsutils nslookup email.us-west-2.amazonaws.com
+
+
+
    +
  • Install Docker compose

  • +
+
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
+sudo chmod +x /usr/local/bin/docker-compose
+
+
+
    +
  • Checkout SEED (or install from the releases).

  • +
+
git clone
+
+
+
    +
  • Add in the Server setting into profile.d. For example add the content below (appropriately filled out) into /etc/profile.d/seed.sh

  • +
+
export POSTGRES_USER=seed
+export POSTGRES_DB=seed
+export POSTGRES_PASSWORD=GDEus3fasd1askj89QkAldjfX
+export POSTGRES_PORT=5432
+export SECRET_KEY="96=7jg%_&1-z9c9qwwu2@w$hb3r322yf3lz@*ekw-1@ly-%+^"
+
+# The admin user is only valid only until the database is restored
+export SEED_ADMIN_USER=user@seed-platform.org
+export SEED_ADMIN_PASSWORD="7FeBWal38*&k3jlfa92lakj8ih4"
+export SEED_ADMIN_ORG=default
+
+# For SES
+export AWS_ACCESS_KEY_ID=<AWS_ACCESS_KEY>
+export AWS_SECRET_ACCESS_KEY=<AWS_SECRET_KEY>
+export AWS_SES_REGION_NAME=us-west-2
+export AWS_SES_REGION_ENDPOINT=email.us-west-2.amazonaws.com
+export SERVER_EMAIL=user@seed-platform.org
+
+
+
    +
  • Before launching the first time, make sure the persistent volumes and the backup directory exist.

  • +
+
docker volume create --name=seed_pgdata
+docker volume create --name=seed_media
+
+mkdir -p $HOME/seed-backups
+
+
+
+

Note

+

Make sure to have the seed-backups in your path, otherwise the db-postgres container will not launch.

+
+
    +
  • Launch the project

  • +
+
cd <checkout dir>
+./deploy.sh
+
+
+
+
+

Deploying with Docker

+

The preferred way to deploy with Docker is using docker swarm and docker stack. +Look at the deploy.sh script for implementation details.

+

The short version is to simply run the command below. Note that the passing of the docker-compose.yml filename is not required if using docker-compose.local.yml.

+

`bash +./deploy.sh docker-compose.local.yml +`

+

If deploying using a custom docker-compose yml file, then simple replace the name in the command above.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/faq.html b/docs/code_documentation/3.1.0/faq.html new file mode 100644 index 00000000..49005abd --- /dev/null +++ b/docs/code_documentation/3.1.0/faq.html @@ -0,0 +1,190 @@ + + + + + + + Frequently Asked Questions — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Frequently Asked Questions

+

Here are some frequently asked questions and/or issues.

+ +
+

Questions

+
+

What is the SEED Platform?

+

The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity.

+

The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL.

+

The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions.

+

Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy.

+
+
+
+

Issues

+
+

Why is the domain set to example.com?

+

If you see example.com in the emails that are sent from your hosted version of SEED then you will +need to update your django sites object in the database.

+
$ ./manage.py shell
+
+from django.contrib.sites.models import Site
+one = Site.objects.all()[0]
+one.domain = 'newdomain.org'
+one.name = 'SEED'
+one.save()
+
+
+
+
+

Why aren’t the static assets being served correctly?

+

Make sure that your local_untracked.py file does not have STATICFILES_STORAGE set to anything. If so, +then comment out that section and redeploy/recollect/compress your static assets.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/genindex.html b/docs/code_documentation/3.1.0/genindex.html new file mode 100644 index 00000000..f1a394d9 --- /dev/null +++ b/docs/code_documentation/3.1.0/genindex.html @@ -0,0 +1,2910 @@ + + + + + + Index — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | J + | K + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | U + | V + | W + | X + | Y + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

J

+ + + +
+ +

K

+ + + +
+ +

L

+ + + +
+ +

M

+ + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

Q

+ + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + + +
+ +

X

+ + +
+ +

Y

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/getting_started.html b/docs/code_documentation/3.1.0/getting_started.html new file mode 100644 index 00000000..fb417172 --- /dev/null +++ b/docs/code_documentation/3.1.0/getting_started.html @@ -0,0 +1,160 @@ + + + + + + + Getting Started — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/help.html b/docs/code_documentation/3.1.0/help.html new file mode 100644 index 00000000..a84d854c --- /dev/null +++ b/docs/code_documentation/3.1.0/help.html @@ -0,0 +1,141 @@ + + + + + + + Help — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Help

+
+

For SEED Platform Users

+

Please visit our website for information, tutorials, and documentation to help you learn how to use SEED.

+

https://seed-platform.org

+

The SEED Users Forum is where you can review user announcements, workflow questions, and join to connect with other users.

+

https://lists.buildingenergytools.org/g/SEEDusers/topics

+

For general inquiries or help on a specific problem, please fill out a request on the building data tools website help desk and select SEED as the relevant tool:

+

https://buildingdata.energy.gov/#/help-desk

+
+
+

For SEED Platform Developers

+

The open-source code is available on the GitHub organization SEED-Platform and contains various repositories for the different components of the platform such as the main SEED application, a Python SEED client to communicate to SEED’s API and various example datasets.

+

https://github.com/SEED-platform

+

The SEED Developers Forum contains various topics and joining enables you to connect with other developers. It is recommended to join this forum to submit developer questions, features requests, and report issues as needed. Also, submitting issues on GitHub is encouraged.

+

https://lists.buildingenergytools.org/g/SEEDdevelopers/topics

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/index.html b/docs/code_documentation/3.1.0/index.html new file mode 100644 index 00000000..0937776b --- /dev/null +++ b/docs/code_documentation/3.1.0/index.html @@ -0,0 +1,244 @@ + + + + + + + Standard Energy Efficiency Data (SEED) Platform — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Standard Energy Efficiency Data (SEED) Platform

+

The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity.

+

The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL.

+

The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions.

+

Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy.

+
+ +
+
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/kubernetes_deployment.html b/docs/code_documentation/3.1.0/kubernetes_deployment.html new file mode 100644 index 00000000..2a7239fc --- /dev/null +++ b/docs/code_documentation/3.1.0/kubernetes_deployment.html @@ -0,0 +1,371 @@ + + + + + + + Kubernetes Deployment Guide with Helm — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Kubernetes Deployment Guide with Helm

+

Kubernetes is a robust container orchestration system for easy application deployment and management. Helm takes that a step further with by packaging up required helm “charts” into one deployment command.

+
+

Setup

+
+

Cluster

+

In order to deploy the SEED platform on a Kubernetes you will need “cluster” which will be configured by your cloud service of choice. Each installation will be slightly different depending on the service. +Below are links to quick-start guides for provisioning a cluster and connecting. These instructions are specifically for AWS, but after the Kubernetes cluster is launched, the helm commands can be used in +the same way.

+
    +
  • Amazon Web Services (AWS)

  • +
  • Google Cloud Platform (GCP)

  • +
  • Azure (AKS)

  • +
+
+

AWS CLI Configuration

+

Download and configure the AWS CLI with instructions: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html

+
aws configure
+AWS Access Key ID [None]: <insert key> (from account)
+AWS Secret Access Key [None]: <insert secret key> (from account)
+Default region name [None]: us-east-1
+Default output format [None]: json
+
+
+
+
+
+

Kubectl

+

Download and install Kubectl:

+
    +
  • Windows

  • +
  • +
    Mac (with Homebrew) brew install kubectl

    ` +brew install kubectl +`

    +
    +
    +
  • +
+

Kubectl is the main function in which you will be interfacing with your deployed application on your cluster. This CLI is what connects you to your cluster that you have just provisioned. +If your cloud service did not have you configure kubectl in your cluster setup, you can download it here. Once kubectl is installed and configured to your cluster +you can run some simple commands to ensure its working properly:

+
#View the cluster
+kubectl cluster-info
+
+#View pods, services and replicasets (will be empty until deploying an app)
+kubectl get all
+
+
+

All of the common kubectl commands can be found in these docs

+
+

Note

+

For those unfamiliar with CLIs, there are a number of GUI applications that are able to deploy on your stack with ease. One of which is Kubernetes native application called Dashboard UI or a third-party application called Octant brew install octant.

+
+
+
+

Helm

+

Helm organizes all of your Kubernetes deployment, service, and volume yml files into “charts” that can be deployed, managed, and published with simple commands. +To install Helm:

+ +
+
+

EKS Control (AWS Specific)

+

EKSCtl is a command line tool to manage Elastic Kubernetes clusters on AWS. If not using AWS, then disregard this section.

+ +

To launch a cluster on using EKSCts, run the following command in the terminal (assuming adequate permissions for the user). Also make sure to replace items in the <> brackets.

+
eksctl create cluster \
+--name <cluster-name> \
+--version 1.21 \
+--region us-east-1 \
+--node-type m5.large \
+--nodes 1 \
+--nodes-min 1 \
+--nodes-max 1 \
+--managed \
+--tags environment=<env-type, e.g., dev, prod>
+
+
+
+
+

Charts

+

SEED stores its charts in the charts directory of the Github Repo. There are two main charts that are deployed when starting SEED on Kubernetes.

+
    +
  • persistentvolumes - these are the volumes to store SEED media data and SEED Postgres data

  • +
  • seed - this stores all of the other deployment and service files for the application

  • +
+

Unlike persistentvolumes, the seed charts must be modified with user environment variables that will be forwarded to the docker container for deployment. +Before deployment, the user MUST set these variables to their desired values.

+

This chart contains the deployment specification for the SEED web container. Replace all the values in <>.

+
# Environment variables for the web container
+- env:
+    # AWS Email service variables to send emails to new users - can be removed if not using this functionality.
+    - name: AWS_ACCESS_KEY_ID
+      value: <access_key_id>
+    - name: AWS_SECRET_ACCESS_KEY
+      value: <secret_access_key>
+    - name: AWS_SES_REGION_NAME
+      value: us-west-2
+    - name: AWS_SES_REGION_ENDPOINT
+      value: email.us-west-2.amazonaws.com
+    - name: SERVER_EMAIL
+      value: info@seed-platform.org
+    # Django Variables
+    - name: DJANGO_SETTINGS_MODULE
+      value: config.settings.docker
+    - name: SECRET_KEY
+      value: <replace-secret-key>
+    - name: SEED_ADMIN_ORG
+      value: default
+    - name: SEED_ADMIN_PASSWORD
+      value: <super-secret-password>
+    - name: SEED_ADMIN_USER
+      value: <user@seed-platform.org>
+    # Postgres variables
+    - name: POSTGRES_DB
+      value: seed
+    - name: POSTGRES_PASSWORD
+      value: <super-secret-password> # must match db-postgres-deployment.yaml and web-celery-deployment.yaml
+    - name: POSTGRES_PORT
+      value: "5432"
+    - name: POSTGRES_USER
+      value: seeduser
+    # Bsyncr analysis variables
+    - name: BSYNCR_SERVER_PORT
+      value: "5000"
+    - name: BSYNCR_SERVER_HOST
+      value: bsyncr
+    # Sentry monitoring - remove if not applicable
+    - name: SENTRY_JS_DSN
+      value: <enter-dsn>
+    - name: SENTRY_RAVEN_DSN
+      value: <enter-dsn>
+    # Google self registration security - remove if not applicable
+    - name: GOOGLE_RECAPTCHA_SITE_KEY
+      value: <reCAPTCHA-site-key>
+    - name: GOOGLE_RECAPTCHA_SECRET_KEY
+      value: <reCAPTCHA-key>
+    image: seedplatform/seed:<insert deployment image version>
+    #versions can be found here https://github.com/SEED-platform/seed/releases/tag/v2.9.3
+
+
+

This chart contains the deployment specification for the Celery container to connect to Postgres. Replace the Postgres password to match web-deployment.

+
- name: POSTGRES_PASSWORD
+  value: <super-secret-password>  # must match db-postgres-deployment.yaml and web-celery-deployment.yaml
+
+
+

This chart contains the deployment specification for the bsyncr analysis server. Request a NOAA token from this website.

+
- name: NOAA_TOKEN
+  value: <token>
+
+
+
+
+
+

Deployment

+

Once you are connected to your cluster and have your settings configured with the environment variables of you choice in the charts, you are ready to deploy the app. +First, make sure that the correct context is selected which is needed if there is more than one cluster:

+
kubectl config get-contexts
+kubectl config use-context <context-name>
+
+
+

Deploy the site using the helm commands in the root of the charts directory.

+
    +
  • helm install --generate-name persistentvolumes

  • +
  • helm install --generate-name seed

  • +
+

You will be able to see SEED coming online with statuses like container creating, and running with:

+
    +
  • kubectl get all

  • +
+

Once all of the pods are running you will be able to hit the external ingress through the URL listed in the web service information. It should look something like

+
service/web           LoadBalancer   10.100.154.227   <my-unique-url>   80:32291/TCP
+
+
+
+
+

Managing Existing Clusters

+
+

Upgrade/Redeploy the Helm Stack

+

To upgrade or dedeploy a helm chart, first find the helm release that you want to upgrade, then run the upgrade with the selected chart.

+
helm list
+helm upgrade <cluster-name> ./seed
+
+
+
+
+

Managing the Kubernetes Cluster (AWS Specific)

+

Enable kubectl to talk to one of the created clusters by running the following command in the terminal after configuring the AWS credentials and cli.

+
aws eks --region <aws-region> update-kubeconfig --name <cluster-name>
+
+
+
+
+

Logging In

+

After a successful deployment in order to login you will need to create yourself as a user in the web container. To do this, we will exec into the container and run some Django commands. +* View all deployments and services, kubectl get all +* kubectl get pods +* kubectl exec -it <pod-id> -- bash

+

Now that we are in the container, we can make a user. +.. code-block:: bash

+
+

./manage.py create_default_user –username=admin@my.org –organization=seedorg –password=badpass

+
+

You can now use these credentials to log in to the SEED website.

+
+
+

Update web and web-celery

+

The command below will restart the pods and re-pull the docker images.

+
kubectl rollout restart deployment web && kubectl rollout restart deployment web-celery
+
+
+
+
+
+

Other Resources

+

Common kubectl actions can be found on the kubernetes website

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/license.html b/docs/code_documentation/3.1.0/license.html new file mode 100644 index 00000000..df19ca22 --- /dev/null +++ b/docs/code_documentation/3.1.0/license.html @@ -0,0 +1,187 @@ + + + + + + + License — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

License

+

SEED Platform™, Copyright (c) 2017, 2024 Alliance for Sustainable Energy, LLC, and other contributors. +All rights reserved.

+

Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met:

+

(1) Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer.

+

(2) Redistributions in binary form must reproduce the above copyright notice, this list of +conditions and the following disclaimer in the documentation and/or other materials provided +with the distribution.

+

(3) Neither the name of the copyright holder nor the names of its contributors may be used +to endorse or promote products derived from this software without specific prior written +permission.

+

(4) Other than as required in clauses (1) and (2), distributions in any form of modifications +or other derivative works may not use the “SEED Platform” trademark, “Standard Energy +Efficiency Data Platform”, “Standard Energy Efficiency Data”, “SEED”, or any other confusingly +similar designation without specific prior written permission from the U.S. Department of Energy.

+

(5) The name of the copyright holder(s), any contributors, the United States Government, the +United States Department of Energy, or any of their employees may not be used to endorse or +promote products derived from this software without specific prior written permission from the +respective party.

+

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS “AS IS” AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED STATES +DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE.

+

+

This program also includes the following licenses:

+

Copyright (c) 2014 - 2017 The Regents of the University of California, through +Lawrence Berkeley National Laboratory (subject to receipt of any required approvals +from the U.S. Department of Energy) and contributors. All rights reserved.

+
    +
  1. Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met:

    +
    +

    (1) Redistributions of source code must retain the copyright notice, this +list of conditions and the following disclaimer.

    +

    (2) Redistributions in binary form must reproduce the copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution.

    +

    (3) Neither the name of the University of California, Lawrence Berkeley +National Laboratory, U.S. Dept. of Energy nor the names of its +contributors may be used to endorse or promote products derived from this +software without specific prior written permission.

    +

    (4) Neither the names Standard Energy Efficiency Data Platform, Standard +Energy Efficiency Data, SEED Platform, SEED, derivatives thereof nor +designations containing these names, may be used to endorse or promote +products derived from this software without specific prior written +permission from the U.S. Dept. of Energy.

    +
    +
  2. +
  3. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  4. +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/linux.html b/docs/code_documentation/3.1.0/linux.html new file mode 100644 index 00000000..40100b81 --- /dev/null +++ b/docs/code_documentation/3.1.0/linux.html @@ -0,0 +1,400 @@ + + + + + + + General Linux Setup — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

General Linux Setup

+

While Amazon Web Services (AWS) provides the preferred hosting for SEED, +running on a bare-bones Linux server follows a similar setup, replacing the +AWS services with their Linux package counterparts, namely: PostgreSQL and +Redis.

+

SEED is a Django project and Django’s documentation +is an excellent place to general understanding of this project’s layout.

+
+

Prerequisites

+

Ubuntu server/desktop 16.04 or newer (18.04 recommended)

+

Install the following base packages to run SEED:

+
sudo add-apt-repository ppa:timescale/timescaledb-ppa
+sudo apt update
+sudo apt upgrade
+sudo apt install libpq-dev python3-dev python3-pip libatlas-base-dev \
+gfortran build-essential nodejs npm libxml2-dev libxslt1-dev git \
+libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python mercurial
+sudo apt install gdal-bin postgis
+sudo apt install redis-server
+sudo apt install timescaledb-postgresql-10 postgresql-contrib
+
+
+
+

Note

+

postgresql >=9.3 is required to support JSON Type

+
+
+
+

Configure PostgreSQL

+

Replace ‘seeddb’, ‘seeduser’ with desired db/user. By +default use password seedpass when prompted

+
$ sudo timescaledb-tune
+$ sudo service postgresql restart
+$ sudo su - postgres
+$ createuser -P "seeduser"
+$ createdb "seeddb" --owner="seeduser"
+$ psql
+postgres=# GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO "seeduser";
+postgres=# ALTER USER "seeduser" CREATEDB CREATEROLE SUPERUSER;
+postgres=# \q
+$ exit
+
+
+
+
+

Python Dependencies

+

clone the seed repository from github

+
$ git clone git@github.com:SEED-platform/seed.git
+
+
+

enter the repo and install the python dependencies from requirements

+
$ cd seed
+$ pip3 install -r requirements/local.txt
+
+
+
+
+

JavaScript Dependencies

+
$ npm install
+
+
+
+
+

Django Database Configuration

+

Copy the local_untracked.py.dist file in the config/settings directory to +config/settings/local_untracked.py, and add a DATABASES configuration with your database username, password, +host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database instance +you have manually installed within your infrastructure.

+
# Database
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.contrib.gis.db.backends.postgis',
+        'NAME': 'seeddb',
+        'USER': 'seeduser',
+        'PASSWORD': '<PASSWORD>',
+        'HOST': 'localhost',
+        'PORT': '5432',
+    }
+}
+
+
+
+

Note

+

Other databases could be used such as MySQL, but are not supported +due to the postgres-specific JSON Type

+
+

In in the above database configuration, seed is the database name, this is arbitrary and any valid name can be +used as long as the database exists. Enter the database name, user, password you set above.

+

The database settings can be tested using the Django management command, python3 manage.py dbshell to connect to the +configured database.

+

create the database tables and migrations:

+
$ python3 manage.py migrate
+
+
+
+
+

Cache and Message Broker

+

The SEED project relies on redis for both cache and message brokering, and +is available as an AWS ElastiCache service or with the redis-server +Linux package. (sudo apt install redis-server)

+

local_untracked.py should be updated with the CACHES and CELERY_BROKER_URL +settings.

+
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+
+
+
+

Creating the initial user

+

create a superuser to access the system

+
$ python3 manage.py create_default_user --username=admin@my.org --organization=lbnl --password=badpass
+
+
+
+

Note

+

Of course, you need to save this user/password somewhere, since this is what +you will use to login to the SEED website.

+

Every user must be tied to an organization, visit /app/#/profile/admin +as the superuser to create parent organizations and add users to them.

+
+
+
+

Running celery the background task worker

+

Celery is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, celery +can be started:

+
DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler
+
+
+
+
+

Running the development web server

+

The Django dev server (not for production use) can be a quick and easy way to +get an instance up and running. The dev server runs by default on port 8000 +and can be run on any port. See Django’s runserver documentation for more +options.

+
$ python3 manage.py runserver --settings=config.settings.dev
+
+
+
+
+

Running a production web server

+

Our recommended web server is uwsgi sitting behind nginx. The python package uwsgi is needed for this, and +should install to /usr/local/bin/uwsgi We recommend using dj-static to load static files.

+
+

Note

+

The use of the dev settings file is production ready, and should be +used for non-AWS installs with DEBUG set to False for production use.

+
+
$ pip3 install uwsgi dj-static
+
+
+

Generate static files:

+
$ python3 manage.py collectstatic --settings=config.settings.prod -i package.json -i package-lock.json -i node_modules/openlayers-ext/index.html
+
+
+

Update config/settings/local_untracked.py:

+
DEBUG = False
+# static files
+STATIC_ROOT = 'collected_static'
+STATIC_URL = '/static/'
+
+
+

Start the web server (this also starts celery):

+
$ ./bin/start-seed
+
+
+
+

Warning

+

Note that uwsgi has port set to 80. In a production setting, a dedicated web server such as nginx would be +receiving requests on port 80 and passing requests to uwsgi running on a different port, e.g 8000.

+
+
+
+

Environment Variables

+

The following environment variables can be set within the ~/.bashrc file to +override default Django settings.

+
export SENTRY_DSN=https://xyz@app.getsentry.com/123
+export DEBUG=False
+export ONLY_HTTPS=True
+
+
+
+
+

Mail Services

+
+

AWS SES Service

+

In the AWS setup, we can use SES to provide an email service for Django. The service is +configured in the config/settings/local_untracked.py:

+
EMAIL_BACKEND = 'django_ses.SESBackend'
+
+
+

In general, the following steps are needed to configure SES:

+
    +
  1. Access Amazon SES Console - Quickstart

  2. +
  3. Login to Amazon SES Console. Verify which region we are using (e.g., us-east-1)

  4. +
  5. Decide on email address that will be sending the emails and add them to the SES Verified Emails.

  6. +
  7. Test that SES works as expected (while in the SES sandbox). Note that you will need to add the sender and recipient emails to the verified emails while in the sandbox.

  8. +
  9. Update the local_untracked.py file or set the environment variables for the docker file.

  10. +
  11. Once ready, move the SES instance out of the sandbox. Following instructions here

  12. +
  13. (Optional) Set up Amazon Simple Notification Service (Amazon SNS) to notify you of bounced emails and other issues.

  14. +
  15. (Optional) Use the AWS Management Console to set up Easy DKIM, which is a way to authenticate your emails. Amazon SES console will have the values for SPF and DKIM that you need to put into your DNS.

  16. +
+
+
+

SMTP service

+

Many options for setting up your own SMTP service/server or using other SMTP +third party services are available and compatible including gmail. SMTP is not configured for working within Docker at the moment.

+
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
+
+
+
+
+
+

local_untracked.py

+
# PostgreSQL DB config
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.postgresql_psycopg2',
+        'NAME': 'seed',
+        'USER': 'your-username',
+        'PASSWORD': 'your-password',
+        'HOST': 'your-host',
+        'PORT': 'your-port',
+    }
+}
+
+# config for local storage backend
+DOMAIN_URLCONFS = {'default': 'config.urls'}
+
+CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+# SMTP config
+EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
+
+# static files
+STATIC_ROOT = 'collected_static'
+STATIC_URL = '/static/'
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/mapping.html b/docs/code_documentation/3.1.0/mapping.html new file mode 100644 index 00000000..880f9f0d --- /dev/null +++ b/docs/code_documentation/3.1.0/mapping.html @@ -0,0 +1,166 @@ + + + + + + + Mapping — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Mapping

+

This document describes the set of calls that occur from the web client or API +down to the back-end for the process of mapping data into SEED.

+

An overview of the process is:

+
    +
  1. Import - A file is uploaded to the server

  2. +
  3. Save - The file is batched saved into the database as JSON data

  4. +
  5. Mapping - Mapping occurs on that file

  6. +
  7. Matching / Merging

  8. +
  9. Pairing

  10. +
+
+

Import

+

From the web UI, the import process invokes seed.views.main.save_raw_data to save the data. When the data is +done uploading, we need to know whether it is a Portfolio Manager file, so we can add metadata to the record in the +database. The end of the upload happens in seed.data_importer.views.DataImportBackend.upload_complete. At this +point, the request object has additional attributes for Portfolio Manager files. These are saved in the model +seed.data_importer.models.ImportFile.

+
+
+

Mapping

+

Once files are uploaded, file header columns need to be mapped to SEED columns. Mappings can be specified/decided manually for any particular file import, +or mapping profiles can be created and subsequently applied to any file imports.

+

When a column mapping profile is applied to an import file, file header columns defined in the profile must match exactly (spaces, lowercase, uppercase, etc.) +in order for the corresponding SEED column information to be used/mapped.

+
+
+

Matching

+
+

Todo

+

document

+
+
+
+

Pairing

+
+

Todo

+

document

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/matching.html b/docs/code_documentation/3.1.0/matching.html new file mode 100644 index 00000000..9e2ebe4a --- /dev/null +++ b/docs/code_documentation/3.1.0/matching.html @@ -0,0 +1,243 @@ + + + + + + + Matching — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Matching

+
+

What is it?

+

Within SEED, matching refers to a possible relationship between at least 2 properties or at least 2 tax lots. +Two properties match if they have the same values for some specified field(s). +These specified fields are referred to as matching criteria, and each SEED organization has its +own set of matching criteria which is customizable by users.

+
+
+

Why does it exist?

+

At a high level, matching is used to identify if two or more property records are actually different +representations of the same property (or tax lots representing one tax lot). For example, within the same cycle, +two matching records, so one persists while the other is used and subsequently discarded to update the persisting record +(say if the building owner’s phone number changed). Or across different cycles, it’s possible that the +two records capture the same property at different times/cycles - this relationship is referred to as a link.

+
+
+

How and when is it used?

+
+

In-Cycle Merging

+

(This is different from manual merging.)

+

For records within the same cycle, there really shouldn’t be more than one +representation of the same property (or tax lot). As much as possible, the program +is set up to prevent this from happening by automatically merging matched +records together whenever they might occur in the same cycle.

+

Specifically, a merge of matches might need to occur after any of the following events:

+
    +
  1. The record has been manually edited.

  2. +
  3. The record was just created as a result of a manual merge (via the ‘Actions’ on the Properties or Tax Lots page).

  4. +
  5. The record has just been imported.

  6. +
+

The actual execution of merges includes a few additional, unrelated steps but, +in the scope of merging, the following occurs.

+

The record in the scenarios listed above is the “target” record. Any and all +matches found, excluding the “target”, are merged together first. If there are +overlapping values, priority is given to more recently updated records.

+

Once these matches (excluding the target) are merged together, the final step is +to merge the “target” record. In all but one case, choosing between overlapping +values gives priority to the “target”. That one case is when a record has just been +imported. Here, overlapping values follow merge protection rules set by +the user for an organization in this final step.

+
+
+

Linking (Across Cycles)

+

For records in different cycles, matches between these are considered links. +Links are used to connect snapshots of the same record year-over-year (at different time periods). +This allows for the analysis of how the record has changed over time.

+

In the case of properties, these links are used to associate meters to properties. +This means that adding meters to a property in one cycle will make those meters +accessible to that same property’s instance in all other cycles.

+

This association can be viewed in aggregate; all of the records within some selected cycles are +grouped and displayed with their links. Alternatively, this association can be viewed for particular linked +group; the linked records of this group are displayed by themselves.

+
+
+

Putting them Together, Match-Merge-Linking

+

As mentioned earlier, there is a rule or assumption that at most one representation of +the same record can exist in any given cycle.

+

This avoids unresolvable situations that would prevent year-over-year analysis. +In the most simple case, a record in Cycle A matches two records in Cycle B. +SEED wouldn’t know which of the two records in Cycle B should be +the “snapshot” for this time period.

+

For this reason, in-cycle match merging always occurs before cross-cycle match linking. +So when searches for links do happen, ambiguous cases have already been resolved.

+

For an individual record, these are the following cases in which a +match-merge-link is automatically run: +1. Explicit triggering (from the Property/TaxLot Detail page) +2. After editing (in the Property/TaxLot Detail page) +3. After manual merging (in the Properties/Tax Lots list page). Explicitly +specified merges happen as chosen by the user. Then, if the resulting record has +matches, merges and/or linking happens. +4. When importing a record. If the incoming record has matches, +merges and/or linking happens.

+

For a whole organization, a match-merge-link round for all records in that +organization is run in the following cases: +1. During the original deployment of this feature - This happens in order to +initially normalize the existing data and establish all initial links. +2. Whenever a user changes matching criteria - This happens in order to +re-normalize existing data and reestablish links. As of this writing, before +committing matching criteria changes, a user can view a preview of how their +records will be affected as these are difficult to reverse.

+
+
+

Note on In-Cycle Not-merged Matches

+

Even though the application tries it’s best to have only one representative record per property +(or tax lot) per Cycle, it’s possible for there to exist matches that were not merged. +This can happen if a user manually unmerges a record after a (manual or automatic) merge occurs. +If this happens, and there exists two records that match each other but are not merged, +both records are completely unlinked. Without user intervention such as editing +one of the matching criteria values, these will be merged and linked as described +above next time the system finds them during a match search.

+
+
+
+

Match Searching in Depth

+

Though they accomplish the same goal, the process for merging is very different between the last case, importing, +and the first 2 cases, manual edit or manual merge.

+

In the case of manual merging or editing, this process accounts for the fact that these are records that already exist. +Specifically, they may have associations such as labels, notes, pairings, and for properties, meters. +So during a subsequent match search leading to a merge of two or more records, all of these “old” associations are +carried over to the final record once merges are complete.

+

In the case of importing, considerations must be taken for the fact that, in most cases, multiple records +are being imported together. Also, since this is the entry point for records, it’s possible that a user might +accidentally try to import the same record snapshot twice - where all the record values are the same as another +existing record (as opposed to just having the same values for matching criteria fields). So on import, the process is as follows:

+
    +
  1. Amongst only the incoming records, duplicates (of other incoming or existing) are flagged and ignored.

  2. +
  3. Amongst only the incoming records, matching records are merged together.

  4. +
  5. Amongst all records in the same Cycle, incoming records that match an existing record gets merged with priority to that existing record. If the incoming record has multiple existing matches, the existing matches are merged together in latest updated order first while also combining any other associations (labels, notes, etc.) just as in the manual merge or edit cases. Since the incoming record is new, it doesn’t have any of the other associations.

  6. +
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/migrations.html b/docs/code_documentation/3.1.0/migrations.html new file mode 100644 index 00000000..6866c0e9 --- /dev/null +++ b/docs/code_documentation/3.1.0/migrations.html @@ -0,0 +1,542 @@ + + + + + + + Migrations — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Migrations

+

Django handles the migration of the database very well; however, there are various changes to SEED that may require some custom (manual) migrations. The migration documentation includes the required changes based on deployment and development for each release.

+
+

Version Develop

+

In order to support Redis passwords, the configuration of the Redis/Celery settings changed a bit. +You will need to add the following to your local_untracked.py configuration file. If you are using +Docker then you will not need to do this.

+
CELERY_RESULT_BACKEND = CELERY_BROKER_URL
+
+
+

If you are using a password, then in your local_untracked.py configuration, add the password to +the CELERY_BROKER_URL. Your final configuration should look like the following in your +local_untracked.py file

+
CELERY_BROKER_URL = 'redis://:password@127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+CELERY_RESULT_BACKEND = CELERY_BROKER_URL
+CELERY_TASK_DEFAULT_QUEUE = 'seed-local'
+CELERY_TASK_QUEUES = (
+    Queue(
+        CELERY_TASK_DEFAULT_QUEUE,
+        Exchange(CELERY_TASK_DEFAULT_QUEUE),
+        routing_key=CELERY_TASK_DEFAULT_QUEUE
+    ),
+)
+
+
+
+
+

Version 3.1.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 3.0.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 3.0.0-beta.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.22.0

+
    +
  • Run ./manage.py migrate.

  • +
  • +
    There is a Redis dependency update in this release that requires users and deployments to modify their settings’ CACHES config.
      +
    1. Update your dependencies with pip install -r requirements/base.txt

    2. +
    3. Update the CACHES BACKEND property to django_redis.cache.RedisCache

    4. +
    5. Update the CACHES LOCATION property to match the redis-py native URL notation for connection strings, including the redis protocol and database number. e.g. redis://localhost:6379/1

    6. +
    +

    Since the CELERY_BROKER_URL setting must also be in the same format, it may be helpful to configure that setting first and then reference it in the caches LOCATION parameter.

    +
    +
    +
  • +
  • See the PR for an example migration.

  • +
+
+
+

Version 2.21.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.20.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.20.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
  • There is a single long running migration related to importing census tract disadvantaged community data. This migration should take around 7 minutes to complete.

  • +
+
+
+

Version 2.19.0

+
    +
  • Run ./manage.py migrate.

  • +
  • +
    There is a new migration in this release that requires column names to be unique across organization, table_name, and is_extra_data. This migration will fail if there are duplicate column names. If you have duplicate column names, you will need to manually fix them in your database before running the migration. The following steps will help you identify and fix the duplicate column names:
      +
    • Check the organization age to gauge the impact of the change. If it is a deprecated org, impact of the change will be low. Often this issue arose in older organizations when units were not part of the columns. The old mapping columns were not upserts with the units, so typically the columns impacted are the ones with units.

    • +
    • Query the seed_column table for the organization and column name displayed on the screen (e.g., organization_id = 300 and column_name = ‘Source EUI (kBtu/ft2)’). If there is no table_name set, it is likely an import file column name and can easily be cleaned up without causing issues. In such cases, there will be two rows, and you want to keep the one with the units_pint column set.

    • +
    • More complex columns may require deleting or updating the column_id in the seed_columnmapping_* tables. If there is a foreign key constraint with seed_columnmapping_*, take note of the ID you want to remove and the ID you want it to be replaced with (preferably keep the one with units_pint).

    • +
    • +
      If the constraint is on seed_columnmapping_column_raw:
        +
      • The field should be an import file column (i.e., no table_name item). Query for the old column in seed_columnmapping_column_raw (e.g., column_name = <old_id>).

      • +
      • Replace the old ID with the new one. If it errors because it already exists, then the row can be deleted.

      • +
      • Return to the seed_column table and remove the old ID.

      • +
      +
      +
      +
    • +
    • +
      If the constraint is on seed_columnmapping_column_mapped:
        +
      • The mapped column should have a table_name in the field. If not, it is likely an older organization.

      • +
      • If there is no table_name, remove the row from the seed_columnmapping_column_mapped table.

      • +
      • Return to the seed_column table and remove the old ID.

      • +
      +
      +
      +
    • +
    +
    +
    +
  • +
+
+
+

Version 2.18.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.18.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.4

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.3

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.2

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.16.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.15.2

+
    +
  • There are no migrations needed for this version.

  • +
+
+
+

Version 2.15.1

+
    +
  • There are no migrations needed for this version.

  • +
+
+
+

Version 2.15.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.14.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.13.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.12.0 - 2.12.4

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.11.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.10.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.7.3 to 2.9.0

+
    +
  • The migrations should work without additional support. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.7.2

+
    +
  • The migrations should work without additional support. Simply run ./manage.py migrate. There are no manual migrations needed.

  • +
  • Note the Important Note in Version 2.7.1 migration below which may require the need to run a “fake” migration

  • +
+
+
+

Version 2.7.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+

Important Note:

+

If upgrading from < 2.7.0 to >= 2.7.1 you may encounter a failed migration with 0118_match_merge_link_all_orgs. This is expected if the database is several versions behind, and it effectively reorders migration 118 to run after all other migrations have completed to prepare your database to recognize properties and taxlots across multiple cycles. Run the following code manually to fully migrate:

+
    +
  1. ./manage.py migrate --fake seed 0118_match_merge_link_all_orgs

  2. +
  3. ./manage.py migrate

  4. +
  5. ./manage.py shell

    +
    +
    from seed.lib.superperms.orgs.models import Organization
    +from seed.utils.match import whole_org_match_merge_link
    +
    +for org in Organization.objects.all():
    +    whole_org_match_merge_link(org.id, 'PropertyState')
    +    whole_org_match_merge_link(org.id, 'TaxLotState')
    +
    +
    +
    +
  6. +
+
+
+

Version 2.7.0

+
    +
  • This migration will run a match/merge/pair/link method upon migration. Make sure to run the migration manually and not inside of the docker container using the ./deploy.sh script.

  • +
  • Make sure to backup the database before performing the migration.

  • +
  • Run ./manage.py migrate.

  • +
+
+
+

Version 2.6.1

+
    +
  • The migrations should work without additional support. Simply run ./manage.py migrate. There are no manual migrations needed for the 2.6.1 release.

  • +
+
+
+

Version 2.6.0

+

Version 2.6.0 includes support for meters and time series data storage. In order to use this release +you must first install TimescaleDB.

+
+

Docker-based Deployment

+

Docker-based deployments shouldn’t require running any additional commands for installation. The +timescaledb installation will happen automatically when updating the postgres container. Also, +the installation of the extension occurs in a Django migration.

+
+
+

Ubuntu

+
sudo add-apt-repository ppa:timescale/timescaledb-ppa
+sudo apt update
+sudo apt install timescaledb-postgresql-10
+sudo timescaledb-tune
+sudo service postgresql restart
+
+
+
+
+

Max OSX

+
brew tap timescale/tap
+brew install timescaledb
+/usr/local/bin/timescaledb_move.sh
+timescaledb-tune
+brew services restart postgresql
+
+
+
+
+
+

Version 2.5.2

+
    +
  • There are no manual migrations that are needed. The ./manage.py migrate command may take awhile to run since the migration requires the recalculation of all the normalized addresses to parse bldg correct and to cast the result as a string and not a bytestring.

  • +
+
+
+

Version 2.5.1

+
    +
  • The migrations should work by simply running ./manage.py migrate. There are no manual migrations needed for the 2.5.1 release.

  • +
+
+
+

Version 2.5.0

+
+

Docker-based Deployment

+
    +
  • Add the MapQuest API key to your organization.

  • +
  • On deployment, the error below is indicative that you need to install the extensions in the postgres database. Run docker exec <postgres_container_id> update-postgis.sh.

    +
    +

    django.db.utils.OperationalError: could not open extension control file “/usr/share/postgresql/11/extension/postgis.control”: No such file or directory

    +
    +
  • +
  • If you are using a copied version of the docker-compose.yml file, then you need to change 127.0.0.1:5000/postgres to 127.0.0.1:5000/postgres-seed

  • +
+
+
+

Development

+
    +
  • Delete your bower directory rm -rf seed/static/vendors.

  • +
  • Delete your css directory rm -rf seed/static/seed/css.

  • +
  • Remove these lines from local_untracked.py if you have them.

  • +
+
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
+STATICFILES_STORAGE = DEFAULT_FILE_STORAGE
+
+
+
    +
  • Run pip3 install -r requirements/local.txt.

  • +
  • Run npm install from root checkout of SEED.

  • +
  • If testing geocoding, then sign up for as a MapQuest Developer and create a new MapQuest Key.

  • +
  • Add the key to the organization that you are using in development.

  • +
  • Update your DATABASES engine to be django.contrib.gis.db.backends.postgis

  • +
+
DATABASES = {
+    'default': {
+        'ENGINE': 'django.contrib.gis.db.backends.postgis',
+        'NAME': 'seeddb',
+        'USER': 'seeduser',
+        'PASSWORD': 'seedpass',
+        'HOST': 'localhost',
+        'PORT': '5432',
+    }
+}
+
+
+
    +
  • Run ./manage.py migrate

  • +
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules.html b/docs/code_documentation/3.1.0/modules.html new file mode 100644 index 00000000..17081472 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules.html @@ -0,0 +1,525 @@ + + + + + + + Modules — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Modules

+
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/config.html b/docs/code_documentation/3.1.0/modules/config.html new file mode 100644 index 00000000..5c45019f --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/config.html @@ -0,0 +1,217 @@ + + + + + + + Configuration — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Configuration

+
+

Submodules

+
+
+

Template Context

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+config.template_context.sentry_js(request)
+
+ +
+
+config.template_context.session_key(request)
+
+ +
+
+

Tests

+
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+config.utils.de_camel_case(name)
+
+ +
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+config.views.robots_txt(request, allow=False)
+
+ +
+
+

WSGI

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

:description WSGI config for config project.

+

This module contains the WSGI application used by Django’s development server +and any production WSGI deployments. It should expose a module-level variable +named application. Django’s runserver and runfcgi commands discover +this application via the WSGI_APPLICATION setting.

+

Usually you will have the standard Django WSGI application here, but it also +might make sense to replace the whole Django WSGI application with a custom one +that later delegates to the Django one. For example, you could introduce WSGI +middleware here, or combine a Django application with an application of another +framework.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.cleansing.html b/docs/code_documentation/3.1.0/modules/seed.cleansing.html new file mode 100644 index 00000000..efa8a048 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.cleansing.html @@ -0,0 +1,955 @@ + + + + + + + Data Quality Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Data Quality Package

+
+

Inheritance

+
+
+

Submodules

+
+
+

Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+exception seed.models.data_quality.ComparisonError
+

Bases: Exception

+
+ +
+
+class seed.models.data_quality.DataQualityCheck(*args, **kwargs)
+

Bases: Model

+

Object that stores the high level configuration per organization of the DataQualityCheck

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+REQUIRED_FIELDS = {'PropertyState': ['address_line_1', 'custom_id_1', 'pm_property_id'], 'TaxLotState': ['address_line_1', 'custom_id_1', 'jurisdiction_tax_lot_id']}
+
+ +
+
+add_goal_rule_labels(rule)
+
+ +
+
+add_invalid_geometry_entry_provided(row_id, rule, display_name, value)
+
+ +
+
+add_result_comparison_error(row_id, rule, display_name, value, rule_check)
+
+ +
+
+add_result_dimension_error(row_id, rule, display_name, value)
+
+ +
+
+add_result_is_null(row_id, rule, display_name, value)
+
+ +
+
+add_result_max_error(row_id, rule, display_name, value, rule_max)
+
+ +
+
+add_result_min_error(row_id, rule, display_name, value, rule_min)
+
+ +
+
+add_result_missing_and_none(row_id, rule, display_name, value)
+
+ +
+
+add_result_missing_req(row_id, rule, display_name, value)
+
+ +
+
+add_result_range_error(row_id, rule, display_name, value)
+
+ +
+
+add_result_string_error(row_id, rule, display_name, value)
+
+ +
+
+add_result_type_error(row_id, rule, display_name, value)
+
+ +
+
+add_rule(rule)
+

Add a new rule to the Data Quality Checks

+
+
Parameters:
+

rule – dict to be added as a new rule

+
+
Returns:
+

None

+
+
+
+ +
+
+add_rule_if_new(rule)
+

Add a new rule to the Data Quality Checks only if rule does not exist

+
+
Parameters:
+

rule – dict to be added as a new rule

+
+
Returns:
+

None

+
+
+
+ +
+
+static cache_key(identifier, organization_id)
+

Static method to return the location of the data_quality results from redis.

+
+
Parameters:
+

identifier – Import file primary key

+
+
Returns:
+

+
+
+
+ +
+
+check_data(record_type, rows)
+

Send in data as a queryset from the Property/Taxlot ids.

+
+
Parameters:
+
    +
  • record_type – one of PropertyState | TaxLotState

  • +
  • rows – rows of data to be checked for data quality

  • +
+
+
Returns:
+

None

+
+
+
+ +
+
+check_data_cross_cycle(goal_id, state_pairs)
+

Send in data as properties and their goal state pairs. Update GoalNote.passed_checks with data quality check return +:param goal: +:param state_pairs: [{property: Property, baseline: PropertyState, current: PropertyState}, {}, …]

+
+ +
+
+get_fieldnames(record_type)
+

Get fieldnames to apply to results.

+
+ +
+
+get_value(property_obj, data_type, goal, cycle_key)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+init_result(record_type, row, fields)
+
+ +
+
+static initialize_cache(identifier, organization_id)
+

Initialize the cache for storing the results. This is called before the +celery tasks are chunked up.

+

The cache_key is different than the identifier. The cache_key is where all the results are +to be stored for the data quality checks, the identifier, is the random number (or specified +value that is used to identifier both the progress and the data storage

+
+
Parameters:
+

identifier – Identifier for cache, if None, then creates a random one

+
+
Returns:
+

list, [cache_key and the identifier]

+
+
+
+ +
+
+initialize_rules()
+

Initialize the default rules for a DataQualityCheck object

+
+
Returns:
+

None

+
+
+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+prune_results()
+
+ +
+
+remove_all_rules()
+

Removes all the rules associated with this DataQualityCheck instance.

+
+
Returns:
+

None

+
+
+
+ +
+
+remove_status_label(label_class, rule, linked_id)
+

Remove label because it did not match any of the range exceptions

+
+
Parameters:
+
    +
  • label_class – statuslabel object, either property label or taxlot label

  • +
  • rule – rule object

  • +
  • linked_id – id of propertystate or taxlotstate object

  • +
+
+
Returns:
+

boolean, if labeled was applied

+
+
+
+ +
+
+reset_all_rules()
+

Delete all rules and reinitialize the default set of rules

+
+
Returns:
+

None

+
+
+
+ +
+
+reset_default_rules()
+

Reset only the default rules

+
+
Returns:
+

+
+
+
+ +
+
+reset_results()
+
+ +
+
+classmethod retrieve(organization_id)
+

DataQualityCheck was previously a simple object but has been migrated to a django model. +This method ensures that the data quality model will be backwards compatible.

+

This is the preferred method to initialize a new object.

+
+
Parameters:
+

organization – instance of Organization

+
+
Returns:
+

obj, DataQualityCheck

+
+
+
+ +
+
+retrieve_result_by_address(address)
+

Retrieve the results of the data quality checks for a specific address.

+
+
Parameters:
+

address – string, address to find the result for

+
+
Returns:
+

dict, results of data quality check for specific building

+
+
+
+ +
+
+retrieve_result_by_tax_lot_id(tax_lot_id)
+

Retrieve the results of the data quality checks by the jurisdiction ID.

+
+
Parameters:
+

tax_lot_id – string, jurisdiction tax lot id

+
+
Returns:
+

dict, results of data quality check for specific building

+
+
+
+ +
+
+rules
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+save_to_cache(identifier, organization_id)
+

Save the results to the cache database. The data in the cache are +stored as a list of dictionaries. The data in this class are stored as +a dict of dict. This is important to remember because the data from the +cache cannot be simply loaded into the above structure.

+
+
Parameters:
+

identifier – Import file primary key

+
+
Returns:
+

None

+
+
+
+ +
+
+update_status_label(label_class, rule, linked_id, row_id, add_to_results=True)
+
+
Parameters:
+
    +
  • label_class – statuslabel object, either propertyview label or taxlotview label

  • +
  • rule – rule object

  • +
  • linked_id – id of propertyview or taxlotview object

  • +
  • row_id

  • +
  • add_to_results – bool

  • +
+
+
Returns:
+

boolean, if labeled was applied

+
+
+
+ +
+ +
+
+exception seed.models.data_quality.DataQualityTypeCastError
+

Bases: Exception

+
+ +
+
+class seed.models.data_quality.Rule(*args, **kwargs)
+

Bases: Model

+

Rules for DataQualityCheck

+
+
+DATA_TYPES = [(0, 'number'), (1, 'string'), (2, 'date'), (3, 'year'), (4, 'area'), (5, 'eui')]
+
+ +
+
+DEFAULT_RULES = [{'condition': 'not_null', 'data_type': 1, 'field': 'address_line_1', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'not_null', 'data_type': 1, 'field': 'pm_property_id', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'not_null', 'field': 'custom_id_1', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'not_null', 'field': 'jurisdiction_tax_lot_id', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'TaxLotState'}, {'condition': 'not_null', 'data_type': 1, 'field': 'address_line_1', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'TaxLotState'}, {'condition': 'range', 'data_type': 4, 'field': 'conditioned_floor_area', 'max': 7000000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 4, 'field': 'conditioned_floor_area', 'min': 100, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 0, 'field': 'energy_score', 'max': 100, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 0, 'field': 'energy_score', 'min': 10, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 2, 'field': 'generation_date', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 0, 'field': 'gross_floor_area', 'max': 7000000, 'min': 100, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 0, 'field': 'occupied_floor_area', 'max': 7000000, 'min': 100, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 2, 'field': 'recent_sale_date', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 2, 'field': 'release_date', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 5, 'field': 'site_eui', 'max': 1000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'site_eui', 'min': 10, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'site_eui_weather_normalized', 'max': 1000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'source_eui', 'max': 1000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'source_eui', 'min': 10, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'source_eui_weather_normalized', 'max': 1000, 'min': 10, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 3, 'field': 'year_built', 'max': '2024', 'min': 1700, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 2, 'field': 'year_ending', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'cross_cycle': True, 'data_type': 5, 'field': 'eui', 'max': 40, 'name': 'High EUI % Change', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'range', 'cross_cycle': True, 'data_type': 5, 'field': 'eui', 'min': -40, 'name': 'Low EUI % Change', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'range', 'cross_cycle': True, 'data_type': 4, 'field': 'area', 'max': 5, 'name': 'High Area % Change', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'range', 'cross_cycle': True, 'data_type': 4, 'field': 'area', 'min': -5, 'name': 'Low Area % Change', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'range', 'data_type': 5, 'field': 'eui', 'max': 1000, 'name': 'High EUI', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'range', 'data_type': 5, 'field': 'eui', 'min': 40, 'name': 'Low EUI', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'range', 'data_type': 4, 'field': 'area', 'max': 1000000, 'name': 'High Area', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'range', 'data_type': 4, 'field': 'area', 'min': 1000, 'name': 'Low Area', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'not_null', 'data_type': 5, 'field': 'eui', 'name': 'Missing EUI', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'not_null', 'data_type': 4, 'field': 'area', 'name': 'Missing Area', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}]
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+RULE_EXCLUDE = 'exclude'
+
+ +
+
+RULE_INCLUDE = 'include'
+
+ +
+
+RULE_NOT_NULL = 'not_null'
+
+ +
+
+RULE_RANGE = 'range'
+
+ +
+
+RULE_REQUIRED = 'required'
+
+ +
+
+RULE_TYPE = [(0, 'default'), (1, 'custom')]
+
+ +
+
+RULE_TYPE_CUSTOM = 1
+
+ +
+
+RULE_TYPE_DEFAULT = 0
+
+ +
+
+SEVERITY = [(0, 'error'), (1, 'warning'), (2, 'valid')]
+
+ +
+
+SEVERITY_ERROR = 0
+
+ +
+
+SEVERITY_VALID = 2
+
+ +
+
+SEVERITY_WARNING = 1
+
+ +
+
+TYPE_AREA = 4
+
+ +
+
+TYPE_DATE = 2
+
+ +
+
+TYPE_EUI = 5
+
+ +
+
+TYPE_NUMBER = 0
+
+ +
+
+TYPE_STRING = 1
+
+ +
+
+TYPE_YEAR = 3
+
+ +
+
+condition
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+cross_cycle
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_quality_check
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+data_quality_check_id
+
+ +
+
+data_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+enabled
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+field
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+for_derived_column
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+format_strings(value)
+
+ +
+
+get_data_type_display(*, field=<django.db.models.fields.IntegerField: data_type>)
+
+ +
+
+get_rule_type_display(*, field=<django.db.models.fields.IntegerField: rule_type>)
+
+ +
+
+get_severity_display(*, field=<django.db.models.fields.IntegerField: severity>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+max
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+maximum_valid(value)
+

Validate that the value is not greater than the maximum specified by the rule.

+
+
Parameters:
+

value – Value to validate rule against

+
+
Returns:
+

bool, True is valid, False if the value is out of range

+
+
+
+ +
+
+min
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+minimum_valid(value)
+

Validate that the value is not less than the minimum specified by the rule.

+
+
Parameters:
+

value – Value to validate rule against

+
+
Returns:
+

bool, True is valid, False if the value is out of range

+
+
+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+not_null
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+required
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+rule_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+severity
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+status_label
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+status_label_id
+
+ +
+
+str_to_data_type(value)
+

If the check is coming from a field in the database then it will be typed correctly; +however, for extra_data, the values are typically strings or unicode. Therefore, the +values are typed before they are checked using the rule’s data type definition.

+
+
Parameters:
+

value – variant, value to type

+
+
Returns:
+

typed value

+
+
+
+ +
+
+table_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+text_match
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+units
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+valid_text(value)
+

Validate the rule matches the specified text. Text is matched by regex.

+
+
Parameters:
+

value – Value to validate rule against

+
+
Returns:
+

bool, True is valid, False if the value does not match

+
+
+
+ +
+ +
+
+exception seed.models.data_quality.UnitMismatchError
+

Bases: Exception

+
+ +
+
+seed.models.data_quality.format_pint_violation(rule, source_value)
+

Format a pint min, max violation for human readability.

+

:param rule +:param source_value : Quantity - value to format into range +:return (formatted_value, formatted_min, formatted_max) : (String, String, String)

+
+ +
+
+

Tests

+
+
+

Views

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.data.html b/docs/code_documentation/3.1.0/modules/seed.data.html new file mode 100644 index 00000000..63ed0dc5 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.data.html @@ -0,0 +1,157 @@ + + + + + + + Data Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Data Package

+
+

Submodules

+
+
+

BEDES

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.data_importer.html b/docs/code_documentation/3.1.0/modules/seed.data_importer.html new file mode 100644 index 00000000..6099e404 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.data_importer.html @@ -0,0 +1,242 @@ + + + + + + + Data Importer Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Data Importer Package

+
+

Submodules

+
+
+

Managers

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.data_importer.managers.NotDeletedManager(*args, **kwargs)
+

Bases: Manager

+
+
+get_all(*args, **kwargs)
+

Method to return ALL ImportFiles, including the ones where deleted == True which are normally excluded. +This is used for database/filesystem cleanup.

+
+ +
+
+get_queryset(*args, **kwargs)
+

Return a new QuerySet object. Subclasses can override this method to +customize the behavior of the Manager.

+
+ +
+ +
+ +
+ +
+
+

Models

+
+
+

URLs

+
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

Utility methods pertaining to data import tasks (save, mapping, matching).

+
+
+seed.data_importer.utils.kbtu_thermal_conversion_factors(country)
+

Returns thermal conversion factors provided by Portfolio Manager. +In the PM app, using NREL’s test account, a property was created for each US +and CAN. All possible Meters of different Type and Units were added. +Readings of value 1 were added to deduce the factors provided below.

+

Consideration was given regarding having the provided ‘country’ value align with +Organizations’ thermal_conversion_assumption enums. Even though these two +should be aligned, the concept and need for these factors are not specific +solely to Orgs. So the ‘country’ value here is expected to be a string. +Specifically, there are instances in the codebase where the factors are +needed irrespective of any Organization’s preferences.

+
+ +
+
+seed.data_importer.utils.kgal_water_conversion_factors(coutry)
+

Returns water conversion factor provided by Portfolio Manager. +Conversion factors taken from: https://www.kylesconverter.com/volume/kilogallons

+

# should country be considered?

+
+ +
+
+seed.data_importer.utils.usage_point_id(raw_source_id)
+

Extracts and returns the usage point ID of a GreenButton full uri ID.

+
+ +
+
+

Views

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.features.html b/docs/code_documentation/3.1.0/modules/seed.features.html new file mode 100644 index 00000000..6550d80f --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.features.html @@ -0,0 +1,175 @@ + + + + + + + Features Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.html b/docs/code_documentation/3.1.0/modules/seed.html new file mode 100644 index 00000000..04a2f9fc --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.html @@ -0,0 +1,842 @@ + + + + + + + SEED Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SEED Package

+
+

Subpackages

+
+ +
+
+
+

Inheritance

+
+
+

Submodules

+
+
+

Decorators

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.decorators.DRFEndpointMixin
+

alias of Mixin

+
+ +
+
+seed.decorators.ajax_request(func)
+

Copied from django-annoying, with a small modification. Now we also check for ‘status’ or +‘success’ keys and slash return correct status codes

+

If view returned serializable dict, returns response in a format requested +by HTTP_ACCEPT header. Defaults to JSON if none requested or match.

+

Currently supports JSON or YAML (if installed), but can easily be extended.

+

Example:

+
@ajax_request
+def my_view(request):
+    news = News.objects.all()
+    news_titles = [entry.title for entry in news]
+    return {"news_titles": news_titles}
+
+
+
+ +
+
+seed.decorators.ajax_request_class(func)
+
    +
  • Copied from django-annoying, with a small modification. Now we also check for ‘status’ or

  • +
+

‘success’ keys and return correct status codes

+

If view returned serializable dict, returns response in a format requested +by HTTP_ACCEPT header. Defaults to JSON if none requested or match.

+

Currently supports JSON or YAML (if installed), but can easily be extended.

+

Example:

+
@ajax_request
+def my_view(self, request):
+    news = News.objects.all()
+    news_titles = [entry.title for entry in news]
+    return {"news_titles": news_titles}
+
+
+
+ +
+
+seed.decorators.decorator_to_mixin(decorator)
+

Converts a decorator written for a function view into a mixin for a class-based view.

+

Example:

+
LoginRequiredMixin = decorator_to_mixin(login_required)
+
+
+class MyView(LoginRequiredMixin):
+    pass
+
+
+class SomeView(decorator_to_mixin(some_decorator), decorator_to_mixin(something_else)):
+    pass
+
+
+
+ +
+
+seed.decorators.get_prog_key(func_name, import_file_pk)
+

Return the progress key for the cache

+
+ +
+
+seed.decorators.lock_and_track(fn, *args, **kwargs)
+

Decorator to lock tasks to single executor and provide progress url.

+
+ +
+
+seed.decorators.require_organization_id(func)
+

Validate that organization_id is in the GET params and it’s an int.

+
+ +
+
+seed.decorators.require_organization_id_class(fn)
+

Validate that organization_id is in the GET params and it’s an int.

+
+ +
+
+seed.decorators.require_organization_membership(fn)
+

Validate that the organization_id passed in GET is valid for request user.

+
+ +
+
+

Factory

+
+
+

Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Search

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

Search methods pertaining to buildings.

+
+
+seed.search.build_shared_buildings_orgs(orgs)
+

returns a list of sibling and parent orgs

+
+ +
+
+seed.search.create_inventory_queryset(inventory_type, orgs, exclude, order_by, other_orgs=None, cycle_id=None)
+

creates a queryset of properties or taxlots within orgs. +If other_orgs, properties/taxlots in both orgs and other_orgs +will be represented in the queryset.

+
+
Parameters:
+
    +
  • inventory_type – property or taxlot.

  • +
  • orgs – queryset of Organization inst.

  • +
  • exclude – django query exclude dict.

  • +
  • order_by – django query order_by str.

  • +
  • other_orgs – list of other orgs to or the query

  • +
+
+
+
+ +
+
+seed.search.get_inventory_fieldnames(inventory_type)
+

returns a list of field names that will be searched against

+
+ +
+
+seed.search.get_orgs_w_public_fields()
+

returns a list of orgs that have publicly shared fields

+
+ +
+
+seed.search.inventory_search_filter_sort(inventory_type, params, user, cycle_id=None)
+

Given a parsed set of params, perform the search, filter, and sort for +Properties or Taxlots

+
+ +
+
+seed.search.parse_body(request)
+

parses the request body for search params, q, etc

+
+
Parameters:
+

request – django wsgi request object

+
+
Returns:
+

dict

+
+
+

Example:

+
{
+    'exclude': dict, exclude dict for django queryset
+    'order_by': str, query order_by, defaults to 'tax_lot_id'
+    'sort_reverse': bool, True if ASC, False if DSC
+    'page': int, pagination page
+    'number_per_page': int, number per pagination page
+    'show_shared_buildings': bool, whether to search across all user's orgs
+    'q': str, global search param
+    'other_search_params': dict, filter params
+    'project_id': str, project id if exists in body
+}
+
+
+
+ +
+
+seed.search.process_search_params(params, user, is_api_request=False)
+

Given a python representation of a search query, process it into the +internal format that is used for searching, filtering, sorting, and pagination.

+
+
Parameters:
+
    +
  • params – a python object representing the search query

  • +
  • user – the user this search is for

  • +
  • is_api_request – bool, boolean whether this search is being done as an api request.

  • +
+
+
Returns:
+

dict

+
+
+

Example:

+
{
+    'exclude': dict, exclude dict for django queryset
+    'order_by': str, query order_by, defaults to 'tax_lot_id'
+    'sort_reverse': bool, True if ASC, False if DSC
+    'page': int, pagination page
+    'number_per_page': int, number per pagination page
+    'show_shared_buildings': bool, whether to search across all user's orgs
+    'q': str, global search param
+    'other_search_params': dict, filter params
+    'project_id': str, project id if exists in body
+}
+
+
+
+ +
+
+seed.search.search_inventory(inventory_type, q, fieldnames=None, queryset=None)
+

returns a queryset for matching Taxlot(View)/Property(View) +:param str or unicode q: search string +:param list fieldnames: list of model fieldnames +:param queryset: optional queryset to filter from +:returns: :queryset: queryset of matching buildings

+
+ +
+
+seed.search.search_properties(q, fieldnames=None, queryset=None)
+
+ +
+
+seed.search.search_taxlots(q, fieldnames=None, queryset=None)
+
+ +
+
+

Tasks

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.tasks.delete_organization(org_pk)
+

delete_organization_buildings

+
+ +
+
+seed.tasks.invite_new_user_to_seed(domain, email_address, token, user_pk, first_name)
+

Send invitation email to newly created user from the landing page. +NOTE: this function is only used on the landing page because the user has not been assigned an organization +domain – The domain name of the running seed instance +email_address – The address to send the invitation to +token – generated by Django’s default_token_generator +user_pk – primary key for this user record +first_name – First name of the new user +new_user

+

Returns: nothing

+
+ +
+
+seed.tasks.send_salesforce_error_log(org_pk, errors)
+

send salesforce error log to logging email when errors are encountered during scheduled sync

+
+ +
+
+

Token Generator

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
author:
+

Aleck Landgraf

+
+
+

token_generator.py - taken from django core master branch

+

needed a token check that would not expire after three days for sending a +signup email

+
+
+class seed.token_generators.SignupTokenGenerator
+

Bases: object

+

Strategy object used to generate and check tokens for the password +reset mechanism.

+
+
+check_token(user, token, token_expires=True)
+

Check that a password reset token is correct for a given user.

+
+ +
+
+make_token(user)
+

Returns a token that can be used once to do a password reset +for the given user.

+
+ +
+ +
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.landing.html b/docs/code_documentation/3.1.0/modules/seed.landing.html new file mode 100644 index 00000000..3a47a233 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.landing.html @@ -0,0 +1,951 @@ + + + + + + + Landing Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Landing Package

+
+

Subpackages

+ +
+
+

Submodules

+
+
+

Forms

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.landing.forms.CustomCreateUserForm(*args, **kwargs)
+

Bases: UserCreationForm

+
+
+class Meta
+

Bases: object

+
+
+fields = ['username']
+
+ +
+
+model
+

alias of SEEDUser

+
+ +
+
+widgets = {'username': <django.forms.widgets.EmailInput object>}
+
+ +
+ +
+
+base_fields = {'password1': <django.forms.fields.CharField object>, 'password2': <django.forms.fields.CharField object>, 'username': <django.forms.fields.EmailField object>}
+
+ +
+
+declared_fields = {'password1': <django.forms.fields.CharField object>, 'password2': <django.forms.fields.CharField object>}
+
+ +
+
+property media
+

Return all media required to render the widgets on this form.

+
+ +
+ +
+
+class seed.landing.forms.LoginForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None)
+

Bases: Form

+
+
+base_fields = {'email': <django.forms.fields.EmailField object>, 'password': <django.forms.fields.CharField object>}
+
+ +
+
+declared_fields = {'email': <django.forms.fields.EmailField object>, 'password': <django.forms.fields.CharField object>}
+
+ +
+
+property media
+

Return all media required to render the widgets on this form.

+
+ +
+ +
+
+

Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.landing.models.SEEDUser(*args, **kwargs)
+

Bases: AbstractBaseUser, PermissionsMixin

+

An abstract base class implementing a fully featured User model with +admin-compliant permissions.

+

Username, password and email are required. Other fields are optional.

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+REQUIRED_FIELDS = ['email']
+
+ +
+
+USERNAME_FIELD = 'username'
+
+ +
+
+analysis_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+api_key
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+columnmapping_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+cycle_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+date_joined
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+deactivate_user()
+
+ +
+
+default_building_detail_custom_columns
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+default_custom_columns
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+default_organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+default_organization_id
+
+ +
+
+email
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+email_user(subject, message, from_email=None)
+

Sends an email to this User.

+
+ +
+
+emaildevice_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+first_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+generate_key()
+

Creates and sets an API key for this user. +Adapted from tastypie:

+

https://github.com/toastdriven/django-tastypie/blob/master/tastypie/models.py#L47

+
+ +
+
+get_absolute_url()
+
+ +
+
+get_full_name()
+

Returns the first_name plus the last_name, with a space in between.

+
+ +
+
+get_next_by_date_joined(*, field=<django.db.models.fields.DateTimeField: date_joined>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_date_joined(*, field=<django.db.models.fields.DateTimeField: date_joined>, is_next=False, **kwargs)
+
+ +
+
+get_short_name()
+

Returns the short name for the user.

+
+ +
+
+greenassessmentpropertyauditlog_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+importrecord_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+is_staff
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+last_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+logentry_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+modified_import_records
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+notes
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+oauth2_provider_accesstoken
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+oauth2_provider_application
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+oauth2_provider_grant
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+oauth2_provider_refreshtoken
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.contrib.auth.models.UserManager object>
+
+ +
+
+organizationuser_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+orgs
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+phonedevice_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+postofficeemail_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+postofficeemailtemplate_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+classmethod process_header_request(request)
+

Process the header string to return the user if it is a valid user.

+
+
Parameters:
+

request – object, request object with HTTP Authorization

+
+
Returns:
+

User object

+
+
+
+ +
+
+prompt_2fa
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+save(*args, **kwargs)
+

Ensure that email and username are synced.

+
+ +
+
+show_shared_buildings
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+staticdevice_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+totpdevice_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+user_permissions
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+username
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+

Tests

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.landing.tests.UserLoginTest(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_simple_login()
+

Happy path login

+
+ +
+ +
+
+

URLs

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.landing.views.CustomLoginView(**kwargs)
+

Bases: LoginView

+
+
+dispatch(request, *args, **kwargs)
+

This method gets called by the routing engine. The first argument is +request which contains a HttpRequest instance. +The request is stored in self.request for later use. The storage +instance is stored in self.storage.

+

After processing the request using the dispatch method, the +response gets updated by the storage engine (for example add cookies).

+
+ +
+
+get(request, *args, **kwargs)
+

This method handles GET requests.

+

If a GET request reaches this point, the wizard assumes that the user +just starts at the first step or wants to restart the process. +The data of the wizard will be reset before rendering the first step

+
+ +
+
+handle_2fa_prompt(response, user)
+
+ +
+
+handle_auth(request, response)
+
+ +
+
+handle_token(request, response)
+
+ +
+
+post(request, *args, **kwargs)
+

The user can select a particular device to challenge, being the backup +devices added to the account.

+
+ +
+ +
+
+seed.landing.views.account_activation_sent(request)
+
+ +
+
+seed.landing.views.activate(request, uidb64, token)
+
+ +
+
+seed.landing.views.create_account(request)
+
+ +
+
+seed.landing.views.landing_page(request)
+
+ +
+
+seed.landing.views.password_reset(request)
+
+ +
+
+seed.landing.views.password_reset_complete(request)
+
+ +
+
+seed.landing.views.password_reset_confirm(request, uidb64=None, token=None)
+
+ +
+
+seed.landing.views.password_reset_done(request)
+
+ +
+
+seed.landing.views.password_set(request, uidb64=None, token=None)
+
+ +
+
+seed.landing.views.signup(request, uidb64=None, token=None)
+
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.landing.management.commands.html b/docs/code_documentation/3.1.0/modules/seed.landing.management.commands.html new file mode 100644 index 00000000..73c0d88d --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.landing.management.commands.html @@ -0,0 +1,167 @@ + + + + + + + Landing Management Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Landing Management Package

+
+

Submodules

+
+
+

Update EULA

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.landing.management.html b/docs/code_documentation/3.1.0/modules/seed.landing.management.html new file mode 100644 index 00000000..990ce430 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.landing.management.html @@ -0,0 +1,173 @@ + + + + + + + seed.landing.management package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

seed.landing.management package

+
+

Subpackages

+ +
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.lib.html b/docs/code_documentation/3.1.0/modules/seed.lib.html new file mode 100644 index 00000000..e729bd80 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.lib.html @@ -0,0 +1,157 @@ + + + + + + + Library Packages — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Library Packages

+
+

Submodules

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.lib.mappings.html b/docs/code_documentation/3.1.0/modules/seed.lib.mappings.html new file mode 100644 index 00000000..19234b51 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.lib.mappings.html @@ -0,0 +1,339 @@ + + + + + + + seed.lib.mappings package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

seed.lib.mappings package

+
+

Submodules

+
+
+

seed.lib.mappings.mapper module

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

:author Dan Gunter <dkgunter@lbl.gov>

+
+
+seed.lib.mappings.mapper.create_column_regexes(raw_columns)
+

Take the columns in the format below and sanitize the keys and add +in the regex.

+
+
Parameters:
+

raw_data – list of strings (columns names from imported file)

+
+
Returns:
+

list of dict

+
+
+
+ +
+
+seed.lib.mappings.mapper.get_pm_mapping(raw_columns, mapping_data=None, resolve_duplicates=True)
+

Create and return Portfolio Manager (PM) mapping for a given version of PM and the given +list of column names.

+

The method will take the raw_columns (from the CSV/XLSX file) and attempt to normalize the +column names so that they can be mapped to the data in the pm-mapping.json[‘from_field’].

+
+ +
+
+

seed.lib.mappings.mapping_columns module

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

:author Nicholas Long <nicholas.long@nrel.gov>

+
+
+class seed.lib.mappings.mapping_columns.MappingColumns(raw_columns, dest_columns, previous_mapping=None, map_args=None, default_mappings=None, threshold=0)
+

Bases: object

+

This class handles the probabilistic mapping of unknown columns to defined fields. This +is mainly used in the build_column_mapping API endpoint.

+
+
+add_mappings(raw_column, mappings, previous_mapping=False)
+

Add mappings to the data structure for later processing.

+
+
Parameters:
+
    +
  • raw_column – list of strings

  • +
  • mappings – list of tuples of potential mappings and confidences

  • +
  • previous_mapping – boolean, if true these mappings will take precedence

  • +
+
+
Returns:
+

Bool, whether the mapping was added

+
+
+
+ +
+
+apply_threshold(threshold)
+

Remove mapping suggestions that do not meet the defined threshold

+

This method is forced as part of the workflow for now, but could easily be made as a +separate call.

+
+
Parameters:
+

threshold – int, min value to be greater than or equal to.

+
+
Returns:
+

None

+
+
+
+ +
+
+property duplicates
+

Check for duplicate initial mapping results. Duplicates exist if the first suggested mapping +for two different raw_columns are the same. The example below would be one of those cases.

+
+
Returns:
+

List of raw col

+
+
+
+ +
+
+property final_mappings
+

Return the final mappings in a format that can be used downstream from this method +{

+
+

“raw_column_1”: (‘table’, ‘db_column_1’, confidence), +“raw_column_2”: (‘table’, ‘db_column_1’, confidence),

+
+

}

+
+ +
+
+first_suggested_mapping(raw_column)
+

Grab the first suggested mapping for a raw column

+
+
Parameters:
+

raw_column – String

+
+
Returns:
+

tuple of the mapping (‘table’, ‘field’, confidence), or ()

+
+
+
+ +
+
+resolve_duplicate(dup_map_field, raw_columns)
+

If there are duplicates, that is two raw_columns are trying to map to the same suggested +column, then select the next available one on the duplicate column. The one with the highest +confidence will ‘win’ the duplicate battle.

+
+
Parameters:
+
    +
  • dup_map_field – String, name of the field that is a duplicate

  • +
  • raw_columns – list, raw columns that mapped to the same result

  • +
+
+
Returns:
+

None

+
+
+
+ +
+
+set_initial_mapping_cmp(raw_column)
+

Set the initial_mapping_cmp helper item in the self.data hash. This is used to detect +if there are any duplicates. The initial mapping cmp will be the first match in the list +(i.e., the one with the highest confidence).

+
+
Parameters:
+

raw_column – String, name of the raw column to set the initial_mapping_cmp

+
+
Returns:
+

None

+
+
+
+ +
+ +
+
+seed.lib.mappings.mapping_columns.sort_duplicates(a, b)
+

Custom sort for the duplicate hash to decide which raw column will get the mapping suggestion +based on the confidence.

+
+ +
+
+

seed.lib.mappings.mapping_data module

+
+
+

seed.lib.mappings.test_mapper module

+
+
+

seed.lib.mappings.test_mapping_columns module

+
+
+

seed.lib.mappings.test_mapping_data module

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.lib.merging.html b/docs/code_documentation/3.1.0/modules/seed.lib.merging.html new file mode 100644 index 00000000..dbe7c511 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.lib.merging.html @@ -0,0 +1,226 @@ + + + + + + + seed.lib.merging package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

seed.lib.merging package

+
+

Submodules

+
+
+

seed.lib.merging.merging module

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

:author Dan Gunter <dkgunter@lbl.gov>

+
+
+seed.lib.merging.merging.get_attrs_with_mapping(data_set_buildings, mapping)
+

Returns a dictionary of attributes from each data_set_building.

+
+
Parameters:
+
    +
  • data_set_buildings – list, instances to merge.

  • +
  • mapping

  • +
+
+
Returns:
+

dict: possible attributes keyed on attr name.

+
+
+
+ +
+
+seed.lib.merging.merging.get_propertystate_attrs(data_set_buildings)
+
+ +
+
+seed.lib.merging.merging.get_state_attrs(state_list)
+

Return a list of state attributes. This does not include any of the extra data columns

+
+ +
+
+seed.lib.merging.merging.get_state_to_state_tuple(inventory)
+

Return the list of the database fields based on the inventory type

+
+ +
+
+seed.lib.merging.merging.get_taxlotstate_attrs(data_set_buildings)
+
+ +
+
+seed.lib.merging.merging.merge_state(merged_state, state1, state2, priorities, ignore_merge_protection=False)
+

Set attributes on our Canonical model, saving differences.

+
+
Parameters:
+
    +
  • merged_state – PropertyState/TaxLotState model inst.

  • +
  • state1 – PropertyState/TaxLotState model inst. Left parent.

  • +
  • state2 – PropertyState/TaxLotState model inst. Right parent.

  • +
  • priorities – dict, column names with favor new or existing

  • +
+
+
Returns:
+

inst(merged_state), updated.

+
+
+
+ +
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.management.html b/docs/code_documentation/3.1.0/modules/seed.management.html new file mode 100644 index 00000000..82c406b9 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.management.html @@ -0,0 +1,176 @@ + + + + + + + Management Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Management Package

+
+

Subpackages

+
+
+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.managers.html b/docs/code_documentation/3.1.0/modules/seed.managers.html new file mode 100644 index 00000000..7ad9a9bc --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.managers.html @@ -0,0 +1,174 @@ + + + + + + + Managers Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Managers Package

+
+

Subpackages

+ +
+
+

Submodules

+
+
+

JSON

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.managers.tests.html b/docs/code_documentation/3.1.0/modules/seed.managers.tests.html new file mode 100644 index 00000000..77189f99 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.managers.tests.html @@ -0,0 +1,162 @@ + + + + + + + Manager Tests Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Manager Tests Package

+
+

Submodules

+
+
+

Test JSON Manager

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.mappings.html b/docs/code_documentation/3.1.0/modules/seed.mappings.html new file mode 100644 index 00000000..34828c34 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.mappings.html @@ -0,0 +1,183 @@ + + + + + + + Mapping Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.models.html b/docs/code_documentation/3.1.0/modules/seed.models.html new file mode 100644 index 00000000..920b2a7b --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.models.html @@ -0,0 +1,4708 @@ + + + + + + + Models — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Models

+
+

Submodules

+
+
+

AuditLog

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Columns

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.columns.Column(*args, **kwargs)
+

Bases: Model

+

The name of a column for a given organization.

+
+
+COLUMN_EXCLUDE_FIELDS = ['bounding_box', 'centroid', 'created', 'data_state', 'extra_data', 'geocoding_confidence', 'id', 'import_file', 'long_lat', 'merge_state', 'raw_access_level_instance_error', 'raw_access_level_instance_id', 'source_type', 'updated', 'hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+COLUMN_MERGE_FAVOR_EXISTING = 1
+
+ +
+
+COLUMN_MERGE_FAVOR_NEW = 0
+
+ +
+
+COLUMN_MERGE_PROTECTION = [(0, 'Favor New'), (1, 'Favor Existing')]
+
+ +
+
+DATABASE_COLUMNS = [{'column_description': 'PM Property ID', 'column_name': 'pm_property_id', 'data_type': 'string', 'display_name': 'PM Property ID', 'table_name': 'PropertyState'}, {'column_description': 'PM Parent Property ID', 'column_name': 'pm_parent_property_id', 'data_type': 'string', 'display_name': 'PM Parent Property ID', 'table_name': 'PropertyState'}, {'column_description': 'Jurisdiction Tax Lot ID', 'column_name': 'jurisdiction_tax_lot_id', 'data_type': 'string', 'display_name': 'Jurisdiction Tax Lot ID', 'table_name': 'TaxLotState'}, {'column_description': 'Jurisdiction Property ID', 'column_name': 'jurisdiction_property_id', 'data_type': 'string', 'display_name': 'Jurisdiction Property ID', 'table_name': 'PropertyState'}, {'column_description': 'UBID', 'column_name': 'ubid', 'data_type': 'string', 'display_name': 'UBID', 'table_name': 'TaxLotState'}, {'column_description': 'UBID', 'column_name': 'ubid', 'data_type': 'string', 'display_name': 'UBID', 'table_name': 'PropertyState'}, {'column_description': 'Custom ID 1', 'column_name': 'custom_id_1', 'data_type': 'string', 'display_name': 'Custom ID 1', 'table_name': 'PropertyState'}, {'column_description': 'Custom ID 1', 'column_name': 'custom_id_1', 'data_type': 'string', 'display_name': 'Custom ID 1', 'table_name': 'TaxLotState'}, {'column_description': 'Audit Template Building ID', 'column_name': 'audit_template_building_id', 'data_type': 'string', 'display_name': 'Audit Template Building ID', 'table_name': 'PropertyState'}, {'column_description': 'Address Line 1', 'column_name': 'address_line_1', 'data_type': 'string', 'display_name': 'Address Line 1', 'table_name': 'PropertyState'}, {'column_description': 'Address Line 1', 'column_name': 'address_line_1', 'data_type': 'string', 'display_name': 'Address Line 1', 'table_name': 'TaxLotState'}, {'column_description': 'Address Line 2', 'column_name': 'address_line_2', 'data_type': 'string', 'display_name': 'Address Line 2', 'table_name': 'PropertyState'}, {'column_description': 'Address Line 2', 'column_name': 'address_line_2', 'data_type': 'string', 'display_name': 'Address Line 2', 'table_name': 'TaxLotState'}, {'column_description': 'City', 'column_name': 'city', 'data_type': 'string', 'display_name': 'City', 'table_name': 'PropertyState'}, {'column_description': 'City', 'column_name': 'city', 'data_type': 'string', 'display_name': 'City', 'table_name': 'TaxLotState'}, {'column_description': 'State', 'column_name': 'state', 'data_type': 'string', 'display_name': 'State', 'table_name': 'PropertyState'}, {'column_description': 'State', 'column_name': 'state', 'data_type': 'string', 'display_name': 'State', 'table_name': 'TaxLotState'}, {'column_description': 'Normalized Address', 'column_name': 'normalized_address', 'data_type': 'string', 'display_name': 'Normalized Address', 'table_name': 'PropertyState'}, {'column_description': 'Normalized Address', 'column_name': 'normalized_address', 'data_type': 'string', 'display_name': 'Normalized Address', 'table_name': 'TaxLotState'}, {'column_description': 'Postal Code', 'column_name': 'postal_code', 'data_type': 'string', 'display_name': 'Postal Code', 'table_name': 'PropertyState'}, {'column_description': 'Postal Code', 'column_name': 'postal_code', 'data_type': 'string', 'display_name': 'Postal Code', 'table_name': 'TaxLotState'}, {'column_description': 'Associated Tax Lot ID', 'column_name': 'lot_number', 'data_type': 'string', 'display_name': 'Associated Tax Lot ID', 'table_name': 'PropertyState'}, {'column_description': 'Property Name', 'column_name': 'property_name', 'data_type': 'string', 'display_name': 'Property Name', 'table_name': 'PropertyState'}, {'column_description': 'Latitude', 'column_name': 'latitude', 'data_type': 'number', 'display_name': 'Latitude', 'table_name': 'PropertyState'}, {'column_description': 'Longitude', 'column_name': 'longitude', 'data_type': 'number', 'display_name': 'Longitude', 'table_name': 'PropertyState'}, {'column_description': 'Latitude', 'column_name': 'latitude', 'data_type': 'number', 'display_name': 'Latitude', 'table_name': 'TaxLotState'}, {'column_description': 'Longitude', 'column_name': 'longitude', 'data_type': 'number', 'display_name': 'Longitude', 'table_name': 'TaxLotState'}, {'column_description': 'Geocoding Confidence', 'column_name': 'geocoding_confidence', 'data_type': 'string', 'display_name': 'Geocoding Confidence', 'table_name': 'PropertyState'}, {'column_description': 'Geocoding Confidence', 'column_name': 'geocoding_confidence', 'data_type': 'string', 'display_name': 'Geocoding Confidence', 'table_name': 'TaxLotState'}, {'column_description': 'Property Footprint', 'column_name': 'property_footprint', 'data_type': 'geometry', 'display_name': 'Property Footprint', 'table_name': 'PropertyState'}, {'column_description': 'Tax Lot Footprint', 'column_name': 'taxlot_footprint', 'data_type': 'geometry', 'display_name': 'Tax Lot Footprint', 'table_name': 'TaxLotState'}, {'column_description': 'Updated', 'column_name': 'updated', 'data_type': 'datetime', 'display_name': 'Updated', 'table_name': 'PropertyState'}, {'column_description': 'Created', 'column_name': 'created', 'data_type': 'datetime', 'display_name': 'Created', 'table_name': 'PropertyState'}, {'column_description': 'Updated', 'column_name': 'updated', 'data_type': 'datetime', 'display_name': 'Updated', 'table_name': 'TaxLotState'}, {'column_description': 'Created', 'column_name': 'created', 'data_type': 'datetime', 'display_name': 'Created', 'table_name': 'TaxLotState'}, {'column_description': 'Gross Floor Area', 'column_name': 'gross_floor_area', 'data_type': 'area', 'display_name': 'Gross Floor Area', 'table_name': 'PropertyState'}, {'column_description': 'Use Description', 'column_name': 'use_description', 'data_type': 'string', 'display_name': 'Use Description', 'table_name': 'PropertyState'}, {'column_description': 'ENERGY STAR Score', 'column_name': 'energy_score', 'data_type': 'integer', 'display_name': 'ENERGY STAR Score', 'table_name': 'PropertyState'}, {'column_description': 'Property Notes', 'column_name': 'property_notes', 'data_type': 'string', 'display_name': 'Property Notes', 'table_name': 'PropertyState'}, {'column_description': 'Property Type', 'column_name': 'property_type', 'data_type': 'string', 'display_name': 'Property Type', 'table_name': 'PropertyState'}, {'column_description': 'Year Ending', 'column_name': 'year_ending', 'data_type': 'date', 'display_name': 'Year Ending', 'table_name': 'PropertyState'}, {'column_description': 'Owner', 'column_name': 'owner', 'data_type': 'string', 'display_name': 'Owner', 'table_name': 'PropertyState'}, {'column_description': 'Owner Email', 'column_name': 'owner_email', 'data_type': 'string', 'display_name': 'Owner Email', 'table_name': 'PropertyState'}, {'column_description': 'Owner Telephone', 'column_name': 'owner_telephone', 'data_type': 'string', 'display_name': 'Owner Telephone', 'table_name': 'PropertyState'}, {'column_description': 'Building Count', 'column_name': 'building_count', 'data_type': 'integer', 'display_name': 'Building Count', 'table_name': 'PropertyState'}, {'column_description': 'Year Built', 'column_name': 'year_built', 'data_type': 'integer', 'display_name': 'Year Built', 'table_name': 'PropertyState'}, {'column_description': 'Recent Sale Date', 'column_name': 'recent_sale_date', 'data_type': 'datetime', 'display_name': 'Recent Sale Date', 'table_name': 'PropertyState'}, {'column_description': 'Conditioned Floor Area', 'column_name': 'conditioned_floor_area', 'data_type': 'area', 'display_name': 'Conditioned Floor Area', 'table_name': 'PropertyState'}, {'column_description': 'Occupied Floor Area', 'column_name': 'occupied_floor_area', 'data_type': 'area', 'display_name': 'Occupied Floor Area', 'table_name': 'PropertyState'}, {'column_description': 'Owner Address', 'column_name': 'owner_address', 'data_type': 'string', 'display_name': 'Owner Address', 'table_name': 'PropertyState'}, {'column_description': 'Owner City/State', 'column_name': 'owner_city_state', 'data_type': 'string', 'display_name': 'Owner City/State', 'table_name': 'PropertyState'}, {'column_description': 'Owner Postal Code', 'column_name': 'owner_postal_code', 'data_type': 'string', 'display_name': 'Owner Postal Code', 'table_name': 'PropertyState'}, {'column_description': 'Home Energy Score ID', 'column_name': 'home_energy_score_id', 'data_type': 'string', 'display_name': 'Home Energy Score ID', 'table_name': 'PropertyState'}, {'column_description': 'PM Generation Date', 'column_name': 'generation_date', 'data_type': 'datetime', 'display_name': 'PM Generation Date', 'table_name': 'PropertyState'}, {'column_description': 'PM Release Date', 'column_name': 'release_date', 'data_type': 'datetime', 'display_name': 'PM Release Date', 'table_name': 'PropertyState'}, {'column_description': 'Site EUI', 'column_name': 'site_eui', 'data_type': 'eui', 'display_name': 'Site EUI', 'table_name': 'PropertyState'}, {'column_description': 'Site EUI Weather Normalized', 'column_name': 'site_eui_weather_normalized', 'data_type': 'eui', 'display_name': 'Site EUI Weather Normalized', 'table_name': 'PropertyState'}, {'column_description': 'Site EUI Modeled', 'column_name': 'site_eui_modeled', 'data_type': 'eui', 'display_name': 'Site EUI Modeled', 'table_name': 'PropertyState'}, {'column_description': 'Source EUI', 'column_name': 'source_eui', 'data_type': 'eui', 'display_name': 'Source EUI', 'table_name': 'PropertyState'}, {'column_description': 'Source EUI Weather Normalized', 'column_name': 'source_eui_weather_normalized', 'data_type': 'eui', 'display_name': 'Source EUI Weather Normalized', 'table_name': 'PropertyState'}, {'column_description': 'Source EUI Modeled', 'column_name': 'source_eui_modeled', 'data_type': 'eui', 'display_name': 'Source EUI Modeled', 'table_name': 'PropertyState'}, {'column_description': 'Energy Alerts', 'column_name': 'energy_alerts', 'data_type': 'string', 'display_name': 'Energy Alerts', 'table_name': 'PropertyState'}, {'column_description': 'Space Alerts', 'column_name': 'space_alerts', 'data_type': 'string', 'display_name': 'Space Alerts', 'table_name': 'PropertyState'}, {'column_description': 'Building Certification', 'column_name': 'building_certification', 'data_type': 'string', 'display_name': 'Building Certification', 'table_name': 'PropertyState'}, {'column_description': 'Number Properties', 'column_name': 'number_properties', 'data_type': 'integer', 'display_name': 'Number Properties', 'table_name': 'TaxLotState'}, {'column_description': 'Block Number', 'column_name': 'block_number', 'data_type': 'string', 'display_name': 'Block Number', 'table_name': 'TaxLotState'}, {'column_description': 'District', 'column_name': 'district', 'data_type': 'string', 'display_name': 'District', 'table_name': 'TaxLotState'}, {'column_description': 'eGRID Subregion Code', 'column_name': 'egrid_subregion_code', 'data_type': 'string', 'display_name': 'eGRID Subregion Code', 'table_name': 'PropertyState'}, {'column_description': 'Total GHG Emissions', 'column_name': 'total_ghg_emissions', 'data_type': 'ghg', 'display_name': 'Total GHG Emissions', 'table_name': 'PropertyState'}, {'column_description': 'Total Marginal GHG Emissions', 'column_name': 'total_marginal_ghg_emissions', 'data_type': 'ghg', 'display_name': 'Total Marginal GHG Emissions', 'table_name': 'PropertyState'}, {'column_description': 'Total GHG Emissions Intensity', 'column_name': 'total_ghg_emissions_intensity', 'data_type': 'ghg_intensity', 'display_name': 'Total GHG Emissions Intensity', 'table_name': 'PropertyState'}, {'column_description': 'Total Marginal GHG Emissions Intensity', 'column_name': 'total_marginal_ghg_emissions_intensity', 'data_type': 'ghg_intensity', 'display_name': 'Total Marginal GHG Emissions Intensity', 'table_name': 'PropertyState'}, {'column_description': 'Time zone of the property', 'column_name': 'property_timezone', 'data_type': 'string', 'display_name': 'Property Time Zone', 'table_name': 'PropertyState'}, {'column_description': 'Water Use (All Water Sources)', 'column_name': 'water_use', 'data_type': 'water_use', 'display_name': 'Water Use', 'table_name': 'PropertyState'}, {'column_description': 'Indoor Water Use (All Water Sources)', 'column_name': 'indoor_water_use', 'data_type': 'water_use', 'display_name': 'Indoor Water Use', 'table_name': 'PropertyState'}, {'column_description': 'Outdoor Water Use (All Water Sources)', 'column_name': 'outdoor_water_use', 'data_type': 'water_use', 'display_name': 'Outdoor Water Use', 'table_name': 'PropertyState'}, {'column_description': 'Water Use Intensity (All Water Sources)', 'column_name': 'wui', 'data_type': 'wui', 'display_name': 'WUI', 'table_name': 'PropertyState'}, {'column_description': 'Indoor Water Use Intensity (All Water Sources)', 'column_name': 'indoor_wui', 'data_type': 'wui', 'display_name': 'Indoor WUI', 'table_name': 'PropertyState'}]
+
+ +
+
+DATA_TYPE_PARSERS: dict[str, Callable] = {'area': <function Column.<lambda>>, 'boolean': <function Column.<lambda>>, 'date': <function Column.<lambda>>, 'datetime': <built-in method fromisoformat of type object>, 'eui': <function Column.<lambda>>, 'float': <function Column.<lambda>>, 'geometry': <class 'str'>, 'ghg': <function Column.<lambda>>, 'ghg_intensity': <function Column.<lambda>>, 'integer': <function Column.<lambda>>, 'number': <function Column.<lambda>>, 'string': <class 'str'>, 'water_use': <function Column.<lambda>>, 'wui': <function Column.<lambda>>}
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+EXCLUDED_COLUMN_RETURN_FIELDS = ['hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+EXCLUDED_MAPPING_FIELDS = ['created', 'extra_data', 'lot_number', 'normalized_address', 'geocoded_address', 'geocoded_postal_code', 'geocoded_side_of_street', 'geocoded_country', 'geocoded_state', 'geocoded_county', 'geocoded_city', 'geocoded_neighborhood', 'updated']
+
+ +
+
+EXCLUDED_RENAME_FROM_FIELDS = ['lot_number', 'year_built', 'property_footprint', 'taxlot_footprint', 'bounding_box', 'centroid', 'created', 'data_state', 'extra_data', 'geocoding_confidence', 'id', 'import_file', 'long_lat', 'merge_state', 'raw_access_level_instance_error', 'raw_access_level_instance_id', 'source_type', 'updated', 'hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+EXCLUDED_RENAME_TO_FIELDS = ['lot_number', 'latitude', 'longitude', 'year_built', 'property_footprint', 'created', 'updated', 'bounding_box', 'centroid', 'created', 'data_state', 'extra_data', 'geocoding_confidence', 'id', 'import_file', 'long_lat', 'merge_state', 'raw_access_level_instance_error', 'raw_access_level_instance_id', 'source_type', 'updated', 'hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+INTERNAL_TYPE_TO_DATA_TYPE = {'BooleanField': 'boolean', 'CharField': 'string', 'DateField': 'date', 'DateTimeField': 'datetime', 'FloatField': 'double', 'IntegerField': 'integer', 'JSONField': 'string', 'PointField': 'geometry', 'PolygonField': 'geometry', 'TextField': 'string'}
+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+PINNED_COLUMNS = [('PropertyState', 'pm_property_id'), ('TaxLotState', 'jurisdiction_tax_lot_id')]
+
+ +
+
+QUANTITY_UNIT_COLUMNS = [('PropertyState', 'gross_floor_area'), ('PropertyState', 'occupied_floor_area'), ('PropertyState', 'conditioned_floor_area'), ('PropertyState', 'site_eui'), ('PropertyState', 'site_eui_modeled'), ('PropertyState', 'site_eui_weather_normalized'), ('PropertyState', 'source_eui'), ('PropertyState', 'source_eui_modeled'), ('PropertyState', 'source_eui_weather_normalized'), ('PropertyState', 'total_ghg_emissions'), ('PropertyState', 'total_marginal_ghg_emissions'), ('PropertyState', 'total_ghg_emissions_intensity'), ('PropertyState', 'total_marginal_ghg_emissions_intensity'), ('PropertyState', 'water_use'), ('PropertyState', 'indoor_water_use'), ('PropertyState', 'outdoor_water_use'), ('PropertyState', 'wui'), ('PropertyState', 'indoor_wui')]
+
+ +
+
+SHARED_FIELD_TYPES = ((0, 'None'), (1, 'Public'))
+
+ +
+
+SHARED_NONE = 0
+
+ +
+
+SHARED_PUBLIC = 1
+
+ +
+
+UNMAPPABLE_PROPERTY_FIELDS = ['created', 'geocoding_confidence', 'lot_number', 'updated']
+
+ +
+
+UNMAPPABLE_TAXLOT_FIELDS = ['created', 'geocoding_confidence', 'updated']
+
+ +
+
+account_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+actual_emission_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+actual_energy_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+benchmark_id_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+cast(value: Any) Any
+

Cast the value to the correct type for the column.

+
+
Args:

value (Any): Value to cast, typically a string.

+
+
+
+ +
+
+static cast_column_value(column_data_type: str, value: Any, allow_none: bool = True) Any
+

cast a single value from the column data type

+
+
Args:

column_data_type (str): The data type as defined in the column object +value (Any): value to cast. Note the value may already be cast correctly.

+
+
Raises:

Exception: CastException if the value cannot be cast to the correct type

+
+
Returns:

Any: Resulting casted value

+
+
+
+ +
+
+clean()
+

Hook for doing any extra model-wide validation after clean() has been +called on every field by self.clean_fields. Any ValidationError raised +by this method will not be associated with a particular field; it will +have a special-case association with the field defined by NON_FIELD_ERRORS.

+
+ +
+
+column_description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+column_list_profiles
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+column_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+columnlistprofilecolumn_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+comstock_mapping
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+contact_email_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+contact_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+static create_mappings(mappings, organization, user, import_file_id=None)
+

Create the mappings for an organization and a user based on a simple +array of array object.

+
+
Parameters:
+
    +
  • mappings – dict, dictionary containing mapping information

  • +
  • organization – inst, organization object

  • +
  • user – inst, User object

  • +
  • import_file_id – integer, If passed, will cache the column mappings data into the +import_file_id object.

  • +
+
+
+

:return Boolean, True is data are saved in the ColumnMapping table in the database

+
+ +
+
+static create_mappings_from_file(filename, organization, user, import_file_id=None)
+

Load the mappings in from a file in a very specific file format. The columns in the file +must be:

+
+
    +
  1. raw field

  2. +
  3. table name

  4. +
  5. field name

  6. +
  7. field display name

  8. +
  9. field data type

  10. +
  11. field unit type

  12. +
+
+
+
Parameters:
+
    +
  • filename – string, absolute path and name of file to load

  • +
  • organization – id, organization id

  • +
  • user – id, user id

  • +
  • import_file_id – Integer, If passed, will cache the column mappings data into +the import_file_id object.

  • +
+
+
Returns:
+

ColumnMapping, True

+
+
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_admin_account_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+data_admin_email_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+data_admin_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+data_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+dataviewparameter_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+static delete_all(organization)
+

Delete all the columns for an organization. Note that this will invalidate all the +data that is in the extra_data fields of the inventory and is irreversible.

+
+
Parameters:
+

organization – instance, Organization

+
+
Returns:
+

[int, int] Number of columns, column_mappings records that were deleted

+
+
+
+ +
+
+derived_column
+

Accessor to the related object on the forward side of a one-to-one relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Restaurant.place is a ForwardOneToOneDescriptor instance.

+
+ +
+
+derived_column_id
+
+ +
+
+derivedcolumn_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+derivedcolumnparameter_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+display_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+geocoding_order
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_merge_protection_display(*, field=<django.db.models.fields.IntegerField: merge_protection>)
+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_modified(*, field=<django.db.models.fields.DateTimeField: modified>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_modified(*, field=<django.db.models.fields.DateTimeField: modified>, is_next=False, **kwargs)
+
+ +
+
+get_shared_field_type_display(*, field=<django.db.models.fields.IntegerField: shared_field_type>)
+
+ +
+
+goal_area_columns
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+goal_eui_column1s
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+goal_eui_column2s
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+goal_eui_column3s
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_file
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+import_file_id
+
+ +
+
+is_extra_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+is_matching_criteria
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+is_option_for_reports_x_axis
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+is_option_for_reports_y_axis
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+mapped_mappings
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+merge_protection
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+modified
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+raw_mappings
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+recognize_empty
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+rename_column(new_column_name, force=False)
+

Rename the column and move all the data to the new column. This can move the +data from a canonical field to an extra data field or vice versa. By default the +column.

+
+
Parameters:
+
    +
  • new_column_name – string new name of column

  • +
  • force – boolean force the overwrite of data in the column?

  • +
+
+
Returns:
+

+
+
+
+ +
+
+static retrieve_all(org_id: int, inventory_type: Literal['property', 'taxlot'] | None = None, only_used: bool = False, include_related: bool = True, exclude_derived: bool = False, column_ids: list[int] | None = None) list[dict]
+

Retrieve all the columns for an organization. This method will query for all the columns in the +database assigned to the organization. It will then go through and cleanup the names to ensure that +there are no duplicates. The name column is used for uniquely labeling the columns for UI Grid purposes.

+
+
Parameters:
+
    +
  • org_id – Organization ID

  • +
  • inventory_type – Inventory Type (property|taxlot) from the requester. This sets the related columns if requested.

  • +
  • only_used – View only the used columns that exist in the Column’s table

  • +
  • include_related – Include related columns (e.g., if inventory type is Property, include Taxlot columns)

  • +
  • exclude_derived – Exclude derived columns.

  • +
  • column_ids – List of Column ids.

  • +
+
+
+
+ +
+
+static retrieve_all_by_tuple(org_id)
+

Return list of all columns for an organization as a tuple.

+
[
+    ("PropertyState", "address_line_1"),
+    ("PropertyState", "address_line_2"),
+    ("PropertyState", "building_certification"),
+    ("PropertyState", "building_count"),
+    ("TaxLotState", "address_line_1"),
+    ("TaxLotState", "address_line_2"),
+    ("TaxLotState", "block_number"),
+    ("TaxLotState", "city"),
+    ("TaxLotState", "jurisdiction_tax_lot_id"),
+]
+
+
+
+
Parameters:
+

org_id – int, Organization ID

+
+
Returns:
+

list of tuples

+
+
+
+ +
+
+static retrieve_db_field_name_for_hash_comparison()
+

Names only of the columns in the database (fields only, not extra data), independent of inventory type. +These fields are used for generating an MD5 hash to quickly check if the data are the same across +multiple records. Note that this ignores extra_data. The result is a superset of all the fields that are used +in the database across all of the inventory types of interest.

+
+
Returns:
+

list, names of columns, independent of inventory type.

+
+
+
+ +
+
+static retrieve_db_field_table_and_names_from_db_tables()
+

Similar to keys, except it returns a list of tuples of the columns that are in the database

+
[
+    ("PropertyState", "address_line_1"),
+    ("PropertyState", "address_line_2"),
+    ("PropertyState", "building_certification"),
+    ("PropertyState", "building_count"),
+    ("TaxLotState", "address_line_1"),
+    ("TaxLotState", "address_line_2"),
+    ("TaxLotState", "block_number"),
+    ("TaxLotState", "city"),
+    ("TaxLotState", "jurisdiction_tax_lot_id"),
+]
+
+
+

:return:list of tuples

+
+ +
+
+static retrieve_db_fields(org_id)
+

return the fields in the database regardless of properties or taxlots. For example, there is an address_line_1 +in both the TaxLotState and the PropertyState. The command below will take the set to remove the duplicates.

+

[ “address_line_1”, “gross_floor_area”, … ] +:param org_id: int, Organization ID +:return: list

+
+ +
+
+static retrieve_db_fields_from_db_tables()
+

Return the list of database fields that are in the models. This is independent of what are in the +Columns table.

+
+
Returns:
+

+
+
+
+ +
+
+static retrieve_db_types()
+

Return the data types for the database columns in the format of:

+
{
+  "field_name": "data_type",
+  "field_name_2": "data_type_2",
+  "address_line_1": "string",
+}
+
+
+
+
Returns:
+

dict

+
+
+
+ +
+
+static retrieve_mapping_columns(org_id, inventory_type=None)
+

Retrieve all the columns that are for mapping for an organization in a dictionary.

+
+
Parameters:
+
    +
  • org_id – org_id, Organization ID

  • +
  • inventory_type – Inventory Type (property|taxlot) from the requester. This sets the related columns if requested.

  • +
+
+
Returns:
+

list, list of dict

+
+
+
+ +
+
+static retrieve_priorities(org_id)
+

Return the list of priorities for the columns. Result will be in the form of:

+
{
+    'PropertyState': {
+        'lot_number': 'Favor New',
+        'owner_address': 'Favor New',
+        'extra_data': {
+            'data_007': 'Favor New'
+        }
+    'TaxLotState': {
+        'custom_id_1': 'Favor New',
+        'block_number': 'Favor New',
+        'extra_data': {
+            'data_008': 'Favor New'
+        }
+}
+
+
+
+
Parameters:
+

org_id – organization with the columns

+
+
Returns:
+

dict

+
+
+
+ +
+
+salesforce_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+save(*args, **kwargs)
+

Save the current instance. Override this in a subclass if you want to +control the saving process.

+

The ‘force_insert’ and ‘force_update’ parameters can be used to insist +that the “save” must be an SQL insert or update (or equivalent for +non-SQL backends), respectively. Normally, they should not be set.

+
+ +
+
+static save_column_names(model_obj)
+

Save unique column names for extra_data in this organization.

+

This is a record of all the extra_data keys we have ever seen +for a particular organization.

+
+
Parameters:
+

model_obj – model_obj instance (either PropertyState or TaxLotState).

+
+
+
+ +
+
+shared_field_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+table_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+target_emission_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+target_energy_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+unit
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+unit_id
+
+ +
+
+units_pint
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+x_axis_columns
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+exception seed.models.columns.ColumnCastError
+

Bases: Exception

+
+ +
+
+seed.models.columns.validate_model(sender, **kwargs)
+
+ +
+
+

Cycles

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.cycles.Cycle(id, organization, user, name, start, end, created)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+analysispropertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+cycles
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+dataview_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+end
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+event_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_end(*, field=<django.db.models.fields.DateField: end>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_start(*, field=<django.db.models.fields.DateField: start>, is_next=True, **kwargs)
+
+ +
+
+classmethod get_or_create_default(organization)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_end(*, field=<django.db.models.fields.DateField: end>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_start(*, field=<django.db.models.fields.DateField: start>, is_next=False, **kwargs)
+
+ +
+
+goal_baseline_cycles
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+goal_current_cycles
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+importfile_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+propertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+start
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+taxlotproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+user
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+user_id
+
+ +
+ +
+
+

Joins

+
+
+

Generic Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.models.StatusLabel(id, created, modified, name, color, super_organization, show_in_list)
+

Bases: TimeStampedModel

+
+
+BLUE_CHOICE = 'blue'
+
+ +
+
+COLOR_CHOICES = (('red', 'red'), ('blue', 'blue'), ('light blue', 'light blue'), ('green', 'green'), ('white', 'white'), ('orange', 'orange'), ('gray', 'gray'))
+
+ +
+
+DEFAULT_LABELS = ['Residential', 'Non-Residential', 'Violation', 'Compliant', 'Missing Data', 'Questionable Report', 'Update Bldg Info', 'Call', 'Email', 'Exempted', 'Extension', 'Change of Ownership', 'High EUI', 'Low EUI', 'High EUI % Change', 'Low EUI % Change', 'High Area', 'Low Area', 'High Area % Change', 'Low Area % Change']
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+GRAY_CHOICE = 'gray'
+
+ +
+
+GREEN_CHOICE = 'green'
+
+ +
+
+LIGHT_BLUE_CHOICE = 'light blue'
+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+ORANGE_CHOICE = 'orange'
+
+ +
+
+RED_CHOICE = 'red'
+
+ +
+
+WHITE_CHOICE = 'white'
+
+ +
+
+and_filter_groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+color
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+compliance_label
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+exclude_filter_groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_color_display(*, field=<django.db.models.fields.CharField: color>)
+
+ +
+
+get_next_by_created(*, field=<django_extensions.db.fields.CreationDateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_modified(*, field=<django_extensions.db.fields.ModificationDateTimeField: modified>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django_extensions.db.fields.CreationDateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_modified(*, field=<django_extensions.db.fields.ModificationDateTimeField: modified>, is_next=False, **kwargs)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+indication_label
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+or_filter_groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyview_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyviewlabel_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+rule_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+show_in_list
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+super_organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+super_organization_id
+
+ +
+
+taxlotview_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+to_dict()
+
+ +
+
+violation_label
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.models.Unit(*args, **kwargs)
+

Bases: Model

+

Unit of measure for a Column Value.

+
+
+DATE = 4
+
+ +
+
+DATETIME = 5
+
+ +
+
+DECIMAL = 2
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+FLOAT = 3
+
+ +
+
+INTEGER = 6
+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+STRING = 1
+
+ +
+
+UNIT_TYPES = ((1, 'String'), (6, 'Integer'), (3, 'Float'), (4, 'Date'), (5, 'Datetime'))
+
+ +
+
+column_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_unit_type_display(*, field=<django.db.models.fields.IntegerField: unit_type>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+unit_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+unit_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+

Properties

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.properties.Property(*args, **kwargs)
+

Bases: Model

+

The Property is the parent property that ties together all the views of the property. +For example, if a building has multiple changes overtime, then this Property will always +remain the same. The PropertyView will point to the unchanged property as the PropertyState +and Property view are updated.

+

The property can also reference a parent property.

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+access_level_instance
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+access_level_instance_id
+
+ +
+
+analysispropertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+copy_meters(source_property_id, source_persists=True)
+

Copies meters from a source Property to the current Property.

+

It’s most efficient if the persistence of the source Property’s readings +aren’t needed as bulk reassignments can then be used.

+

The cases and logic are described in comments throughout.

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_loggers
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+elements
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+events
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+goalnote_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+historical_note
+

Accessor to the related object on the reverse side of a one-to-one +relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Place.restaurant is a ReverseOneToOneDescriptor instance.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+inventory_documents
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+meters
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+parent_property
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_property_id
+
+ +
+
+property_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+views
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.properties.PropertyAuditLog(id, organization, parent1, parent2, parent_state1, parent_state2, state, view, name, description, import_filename, record_type, created)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_record_type_display(*, field=<django.db.models.fields.IntegerField: record_type>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_filename
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+parent1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent1_id
+
+ +
+
+parent2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent2_id
+
+ +
+
+parent_state1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state1_id
+
+ +
+
+parent_state2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state2_id
+
+ +
+
+propertyauditlog_parent1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyauditlog_parent2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+record_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+view
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+view_id
+
+ +
+ +
+
+class seed.models.properties.PropertyState(*args, **kwargs)
+

Bases: Model

+

Store a single property. This contains all the state information about the property

+

For property_timezone, use the pytz timezone strings. The US has the following and a full +list can be created by calling pytz.all_timezones in Python:

+
+
    +
  • US/Alaska

  • +
  • US/Aleutian

  • +
  • US/Arizona

  • +
  • US/Central

  • +
  • US/East-Indiana

  • +
  • US/Eastern

  • +
  • US/Hawaii

  • +
  • US/Indiana-Starke

  • +
  • US/Michigan

  • +
  • US/Mountain

  • +
  • US/Pacific

  • +
  • US/Samoa

  • +
+
+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+address_line_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+address_line_2
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+analysispropertyview
+

Accessor to the related object on the reverse side of a one-to-one +relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Place.restaurant is a ReverseOneToOneDescriptor instance.

+
+ +
+
+audit_template_building_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+bounding_box
+
+ +
+
+building_certification
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+building_count
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+building_files
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+centroid
+
+ +
+
+city
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+clean()
+

Hook for doing any extra model-wide validation after clean() has been +called on every field by self.clean_fields. Any ValidationError raised +by this method will not be associated with a particular field; it will +have a special-case association with the field defined by NON_FIELD_ERRORS.

+
+ +
+
+conditioned_floor_area
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+conditioned_floor_area_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+classmethod coparent(state_id)
+

Return the coparent of the PropertyState. This will query the PropertyAuditLog table to +determine if there is a coparent and return it if it is found. The state_id needs to be +the base ID of when the original record was imported

+
+
Parameters:
+

state_id – integer, state id to find coparent.

+
+
Returns:
+

dict

+
+
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+custom_id_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+egrid_subregion_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+energy_alerts
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+energy_score
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+extra_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+generation_date
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+geocoding_confidence
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_data_state_display(*, field=<django.db.models.fields.IntegerField: data_state>)
+
+ +
+
+get_merge_state_display(*, field=<django.db.models.fields.IntegerField: merge_state>)
+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+get_source_type_display(*, field=<django.db.models.fields.IntegerField: source_type>)
+
+ +
+
+gross_floor_area
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+gross_floor_area_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+hash_object
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+history()
+

Return the history of the property state by parsing through the auditlog. Returns only the ids +of the parent states and some descriptions.

+
+

main +/ / parent1 parent2

+
+

In the records, parent2 is most recent, so make sure to navigate parent two first since we +are returning the data in reverse over (that is most recent changes first)

+
+
Returns:
+

list, history as a list, and the main record

+
+
+
+ +
+
+home_energy_score_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_file
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+import_file_id
+
+ +
+
+indoor_water_use
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+indoor_wui
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+jurisdiction_property_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+latitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+long_lat
+
+ +
+
+longitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+lot_number
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+measure_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+measures
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+classmethod merge_relationships(merged_state, state1, state2)
+

Merge together the old relationships with the new.

+
+
Parameters:
+
    +
  • merged_state – empty state to fill with merged state

  • +
  • state1*State

  • +
  • state2*State - given priority over state1

  • +
+
+
+
+ +
+
+merge_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+normalized_address
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+occupied_floor_area
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+occupied_floor_area_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+outdoor_water_use
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_address
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_city_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_email
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_postal_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_telephone
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+parent_state1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+parent_state2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+pm_parent_property_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+pm_property_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+postal_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+promote(cycle, property_id=None)
+

Promote the PropertyState to the view table for the given cycle

+
+
Args:

cycle: Cycle to assign the view +property_id: Optional ID of a canonical property model object +to retain instead of creating a new property

+
+
Returns:

The resulting PropertyView (note that it is not returning the +PropertyState)

+
+
+
+ +
+
+property_footprint
+
+ +
+
+property_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property_notes
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property_timezone
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+propertyauditlog_state
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertymeasure_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+raw_access_level_instance
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+raw_access_level_instance_error
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+raw_access_level_instance_id
+
+ +
+
+recent_sale_date
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+release_date
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+save(*args, **kwargs)
+

Save the current instance. Override this in a subclass if you want to +control the saving process.

+

The ‘force_insert’ and ‘force_update’ parameters can be used to insist +that the “save” must be an SQL insert or update (or equivalent for +non-SQL backends), respectively. Normally, they should not be set.

+
+ +
+
+scenarios
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+simulation
+

Accessor to the related object on the reverse side of a one-to-one +relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Place.restaurant is a ReverseOneToOneDescriptor instance.

+
+ +
+
+site_eui
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_modeled
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_modeled_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_weather_normalized
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_weather_normalized_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_modeled
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_modeled_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_weather_normalized
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_weather_normalized_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+space_alerts
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+to_dict(fields=None, include_related_data=True)
+

Returns a dict version of the PropertyState, either with all fields +or masked to just those requested.

+
+ +
+
+total_ghg_emissions
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+total_ghg_emissions_intensity
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+total_marginal_ghg_emissions
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+total_marginal_ghg_emissions_intensity
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+ubid
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+ubidmodel_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+use_description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+water_use
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+wui
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+year_built
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+year_ending
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+class seed.models.properties.PropertyView(*args, **kwargs)
+

Bases: Model

+

Similar to the old world of canonical building.

+

A PropertyView contains a reference to a property (which should not change) and to a +cycle (time period), and a state (characteristics).

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+cycle
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+cycle_id
+
+ +
+
+gapauditlog_view
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+greenassessmentproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property import_filename
+

Get the import file name form the audit logs

+
+ +
+
+initialize_audit_logs(**kwargs)
+
+ +
+
+labels
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+notes
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+property
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+property_id
+
+ +
+
+propertyauditlog_view
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyviewlabel_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+tax_lot_states()
+

Return a list of TaxLotStates associated with this PropertyView and Cycle

+
+
Returns:
+

list of TaxLotStates

+
+
+
+ +
+
+tax_lot_views()
+

Return a list of TaxLotViews that are associated with this PropertyView and Cycle

+
+
Returns:
+

list of TaxLotViews

+
+
+
+ +
+
+taxlotproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.properties.PropertyViewLabel(id, propertyview, statuslabel, goal)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+goal
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+goal_id
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+propertyview
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+propertyview_id
+
+ +
+
+statuslabel
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+statuslabel_id
+
+ +
+ +
+
+seed.models.properties.post_save_property(sender, instance, created, **kwargs)
+
+ +
+
+seed.models.properties.post_save_property_state(sender, **kwargs)
+

Generate UbidModels for a PropertyState if the ubid field is present

+
+ +
+
+seed.models.properties.post_save_property_view(sender, **kwargs)
+

When changing/saving the PropertyView, go ahead and touch the Property (if linked) so that the +record receives an updated datetime

+
+ +
+
+seed.models.properties.pre_delete_state(sender, **kwargs)
+
+ +
+
+seed.models.properties.set_default_access_level_instance(sender, instance, **kwargs)
+

If ALI not set, put this Property as the root.

+
+ +
+
+seed.models.properties.sync_latitude_longitude_and_long_lat(sender, instance, **kwargs)
+
+ +
+
+

TaxLots

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.tax_lots.TaxLot(id, organization, access_level_instance, created, updated)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+access_level_instance
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+access_level_instance_id
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+views
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.tax_lots.TaxLotAuditLog(id, organization, parent1, parent2, parent_state1, parent_state2, state, view, name, description, import_filename, record_type, created)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_record_type_display(*, field=<django.db.models.fields.IntegerField: record_type>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_filename
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+parent1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent1_id
+
+ +
+
+parent2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent2_id
+
+ +
+
+parent_state1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state1_id
+
+ +
+
+parent_state2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state2_id
+
+ +
+
+record_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+taxlotauditlog_parent1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotauditlog_parent2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+view
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+view_id
+
+ +
+ +
+
+class seed.models.tax_lots.TaxLotState(id, import_file, organization, data_state, merge_state, raw_access_level_instance, raw_access_level_instance_error, custom_id_1, jurisdiction_tax_lot_id, block_number, district, address_line_1, address_line_2, normalized_address, city, state, postal_code, number_properties, extra_data, hash_object, latitude, longitude, long_lat, centroid, bounding_box, taxlot_footprint, ubid, geocoding_confidence, created, updated)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+address_line_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+address_line_2
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+block_number
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+bounding_box
+
+ +
+
+centroid
+
+ +
+
+city
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+classmethod coparent(state_id)
+

Return the coparent of the TaxLotState. This will query the TaxLotAuditLog table to +determine if there is a coparent and return it if it is found. The state_id needs to be +the base ID of when the original record was imported

+
+
Parameters:
+

state_id – integer, state id to find coparent.

+
+
Returns:
+

dict

+
+
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+custom_id_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+district
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+extra_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+geocoding_confidence
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_data_state_display(*, field=<django.db.models.fields.IntegerField: data_state>)
+
+ +
+
+get_merge_state_display(*, field=<django.db.models.fields.IntegerField: merge_state>)
+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+hash_object
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+history()
+

Return the history of the taxlot state by parsing through the auditlog. Returns only the ids +of the parent states and some descriptions.

+
+
+

main

+
+

/ / parent1 parent2

+
+

In the records, parent2 is most recent, so make sure to navigate parent two first since we +are returning the data in reverse over (that is most recent changes first)

+
+
Returns:
+

list, history as a list, and the main record

+
+
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_file
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+import_file_id
+
+ +
+
+jurisdiction_tax_lot_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+latitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+long_lat
+
+ +
+
+longitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+classmethod merge_relationships(merged_state, state1, state2)
+

Stub to implement if merging TaxLotState relationships is needed

+
+ +
+
+merge_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+normalized_address
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+number_properties
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+postal_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+promote(cycle)
+

Promote the TaxLotState to the view table for the given cycle

+
+
Args:

cycle: Cycle to assign the view

+
+
Returns:

The resulting TaxLotView (note that it is not returning the +TaxLotState)

+
+
+
+ +
+
+raw_access_level_instance
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+raw_access_level_instance_error
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+raw_access_level_instance_id
+
+ +
+
+save(*args, **kwargs)
+

Save the current instance. Override this in a subclass if you want to +control the saving process.

+

The ‘force_insert’ and ‘force_update’ parameters can be used to insist +that the “save” must be an SQL insert or update (or equivalent for +non-SQL backends), respectively. Normally, they should not be set.

+
+ +
+
+state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+taxlot_footprint
+
+ +
+
+taxlotauditlog_parent_state1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotauditlog_parent_state2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotauditlog_state
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+to_dict(fields=None, include_related_data=True)
+

Returns a dict version of the TaxLotState, either with all fields +or masked to just those requested.

+
+ +
+
+ubid
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+ubidmodel_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+class seed.models.tax_lots.TaxLotView(id, taxlot, state, cycle)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+cycle
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+cycle_id
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property import_filename
+

Get the import file name form the audit logs

+
+ +
+
+initialize_audit_logs(**kwargs)
+
+ +
+
+labels
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+notes
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+property_states()
+

Return a list of PropertyStates associated with this TaxLotView and Cycle

+
+
Returns:
+

list of PropertyStates

+
+
+
+ +
+
+property_views()
+

Return a list of PropertyViews that are associated with this TaxLotView and Cycle

+
+
Returns:
+

list of PropertyViews

+
+
+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+taxlot
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+taxlot_id
+
+ +
+
+taxlotauditlog_view
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+seed.models.tax_lots.post_save_taxlot_state(sender, **kwargs)
+

Generate UbidModels for a TaxLotState if the ubid field is present

+
+ +
+
+seed.models.tax_lots.post_save_taxlot_view(sender, **kwargs)
+

When changing/saving the TaxLotView, go ahead and touch the TaxLot (if linked) so that the record +receives an updated datetime

+
+ +
+
+seed.models.tax_lots.set_default_access_level_instance(sender, instance, **kwargs)
+

If ALI not set, put this TaxLot as the root.

+
+ +
+
+seed.models.tax_lots.sync_latitude_longitude_and_long_lat(sender, instance, **kwargs)
+
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.public.html b/docs/code_documentation/3.1.0/modules/seed.public.html new file mode 100644 index 00000000..2f509fe8 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.public.html @@ -0,0 +1,159 @@ + + + + + + + Public Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Public Package

+
+

Submodules

+
+
+

Models

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.serializers.html b/docs/code_documentation/3.1.0/modules/seed.serializers.html new file mode 100644 index 00000000..60856859 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.serializers.html @@ -0,0 +1,254 @@ + + + + + + + Serializers Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Serializers Package

+
+

Submodules

+
+
+

Serializers

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.serializers.celery.CeleryDatetimeSerializer(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)
+

Bases: JSONEncoder

+
+
+default(obj)
+

Implement this method in a subclass such that it returns +a serializable object for o, or calls the base implementation +(to raise a TypeError).

+

For example, to support arbitrary iterators, you could +implement default like this:

+
def default(self, o):
+    try:
+        iterable = iter(o)
+    except TypeError:
+        pass
+    else:
+        return list(iterable)
+    # Let the base class default method raise the TypeError
+    return JSONEncoder.default(self, o)
+
+
+
+ +
+
+static seed_decoder(obj)
+
+ +
+
+static seed_dumps(obj)
+
+ +
+
+static seed_loads(obj)
+
+ +
+ +
+
+

Labels

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.serializers.labels.LabelSerializer(*args, **kwargs)
+

Bases: ModelSerializer

+
+
+class Meta
+

Bases: object

+
+
+extra_kwargs = {'super_organization': {'write_only': True}}
+
+ +
+
+fields = ('id', 'name', 'color', 'organization_id', 'super_organization', 'is_applied', 'show_in_list')
+
+ +
+
+model
+

alias of StatusLabel

+
+ +
+ +
+
+get_is_applied(obj)
+
+ +
+
+to_representation(instance)
+

Object instance -> Dict of primitive datatypes.

+
+ +
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.templatetags.html b/docs/code_documentation/3.1.0/modules/seed.templatetags.html new file mode 100644 index 00000000..649193e8 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.templatetags.html @@ -0,0 +1,277 @@ + + + + + + + Templatetags Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Templatetags Package

+
+

Submodules

+
+
+

Breadcrumbs

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

breadcrumbs.py, https://bitbucket.org/Mathiasdm/django-simple-breadcrumbs/

+
+
+class seed.templatetags.breadcrumbs.BreadcrumbNode(variables, render_func=<function create_crumb>)
+

Bases: Node

+
+
+render(context)
+

Return the node rendered as a string.

+
+ +
+ +
+
+class seed.templatetags.breadcrumbs.UrlBreadcrumbNode(title, url_node, render_func=<function create_crumb>)
+

Bases: Node

+
+
+render(context)
+

Return the node rendered as a string.

+
+ +
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb(parser, token)
+

Section author: Andriy Drozdyuk

+

Renders the breadcrumb.

+

Example:

+
{% breadcrumb "Title of breadcrumb" url_var %}
+{% breadcrumb context_var  url_var %}
+{% breadcrumb "Just the title" %}
+{% breadcrumb just_context_var %}
+
+
+

Parameters:

+
First parameter is the title of the crumb
+Second (optional) parameter is the url variable to link to, produced by url tag, i.e.:
+    {% url "person_detail" object.id as person_url %}
+    then:
+    {% breadcrumb person.name person_url %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb_root(parser, token)
+

Section author: Andriy Drozdyuk

+

Renders the breadcrumb.

+

Examples:

+
{% breadcrumb "Title of breadcrumb" url_var %}
+{% breadcrumb context_var  url_var %}
+{% breadcrumb "Just the title" %}
+{% breadcrumb just_context_var %}
+
+
+

Parameters:

+
First parameter is the title of the crumb,
+Second (optional) parameter is the url variable to link to, produced by url tag, i.e.:
+    {% url "person_detail/" object.id as person_url %}
+    then:
+    {% breadcrumb person.name person_url %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb_url(parser, token)
+

Same as breadcrumb but instead of url context variable takes in all the +arguments URL tag takes.

+
{% breadcrumb "Title of breadcrumb" person_detail person.id %}
+{% breadcrumb person.name person_detail person.id %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb_url_root(parser, token)
+

Same as breadcrumb but instead of url context variable takes in all the +arguments URL tag takes.

+
{% breadcrumb "Title of breadcrumb" person_detail person.id %}
+{% breadcrumb person.name person_detail person.id %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.create_crumb(title, url=None)
+

Helper function

+
+ +
+
+seed.templatetags.breadcrumbs.create_crumb_first(title, url=None)
+

Helper function

+
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.test_helpers.factory.html b/docs/code_documentation/3.1.0/modules/seed.test_helpers.factory.html new file mode 100644 index 00000000..2181ddf9 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.test_helpers.factory.html @@ -0,0 +1,298 @@ + + + + + + + Test Helper Factor Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Test Helper Factor Package

+
+

Subpackages

+ +
+
+

Submodules

+
+
+

Helpers

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.test_helpers.factory.helpers.DjangoFunctionalFactory
+

Bases: object

+
+
+classmethod invalid_test_cc_number()
+
+ +
+
+classmethod rand_bool()
+
+ +
+
+classmethod rand_city()
+
+ +
+
+classmethod rand_city_suffix()
+
+ +
+
+classmethod rand_currency(start=0, end=100)
+
+ +
+
+classmethod rand_date(start_year=1900, end_year=2011)
+
+ +
+
+classmethod rand_domain()
+
+ +
+
+classmethod rand_email()
+
+ +
+
+classmethod rand_float(start=0, end=100)
+
+ +
+
+classmethod rand_int(start=0, end=100)
+
+ +
+
+classmethod rand_name()
+
+ +
+
+classmethod rand_phone()
+
+ +
+
+classmethod rand_plant_name()
+
+ +
+
+classmethod rand_str(length=None)
+
+ +
+
+classmethod rand_street_address()
+
+ +
+
+classmethod rand_street_suffix()
+
+ +
+
+classmethod test_cc_number(valid=True)
+
+ +
+
+classmethod valid_test_cc_number()
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.test_helpers.factory.lib.html b/docs/code_documentation/3.1.0/modules/seed.test_helpers.factory.lib.html new file mode 100644 index 00000000..5cc19209 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.test_helpers.factory.lib.html @@ -0,0 +1,189 @@ + + + + + + + Test Helper Factory Lib Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.test_helpers.html b/docs/code_documentation/3.1.0/modules/seed.test_helpers.html new file mode 100644 index 00000000..51d4c516 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.test_helpers.html @@ -0,0 +1,229 @@ + + + + + + + Test Helpers Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.tests.functional.html b/docs/code_documentation/3.1.0/modules/seed.tests.functional.html new file mode 100644 index 00000000..dce853e0 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.tests.functional.html @@ -0,0 +1,194 @@ + + + + + + + Tests (Functional) Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.tests.html b/docs/code_documentation/3.1.0/modules/seed.tests.html new file mode 100644 index 00000000..f6c0ee2d --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.tests.html @@ -0,0 +1,965 @@ + + + + + + + Tests Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tests Package

+
+

Submodules

+ +
+
+

Admin Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.test_admin_views.AdminViewsTest(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_add_org()
+

Happy path test for creating a new org.

+
+ +
+
+test_add_org_dupe()
+

Trying to create an org with a dupe name fails.

+
+ +
+
+test_add_owner_existing_org_to_non_root()
+
+ +
+
+test_add_user_existing_org()
+

Test creating a new user, adding them to an existing org +in the process.

+
+ +
+
+test_add_user_new_org()
+

Create a new user and a new org at the same time.

+
+ +
+
+test_add_user_no_org()
+

Should not be able to create a new user without either +selecting or creating an org at the same time.

+
+ +
+
+test_signup_process()
+

Simulates the entire new user signup process, from initial +account creation by an admin to receiving the signup email +to confirming the account and setting a password.

+
+ +
+
+test_signup_process_force_lowercase_email()
+

Simulates the signup and login forcing login username to lowercase

+
+ +
+ +
+
+

Decorators

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.test_decorators.ClassDecoratorTests(methodName='runTest')
+

Bases: TestCase

+
+
+test_ajax_request_class_dict()
+
+ +
+
+test_ajax_request_class_dict_status_error()
+
+ +
+
+test_ajax_request_class_dict_status_false()
+
+ +
+
+test_ajax_request_class_format_type()
+
+ +
+
+test_require_organization_id_class_no_org_id()
+
+ +
+
+test_require_organization_id_class_org_id()
+
+ +
+
+test_require_organization_id_class_org_id_not_int()
+
+ +
+ +
+
+class seed.tests.test_decorators.RequireOrganizationIDTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_require_organization_id_fail_no_key()
+
+ +
+
+test_require_organization_id_fail_not_numeric()
+
+ +
+
+test_require_organization_id_success_integer()
+
+ +
+
+test_require_organization_id_success_string()
+
+ +
+ +
+
+class seed.tests.test_decorators.TestDecorators(methodName='runTest')
+

Bases: TestCase

+

Tests for locking tasks and reporting progress.

+
+
+locked = 1
+
+ +
+
+pk = 34
+
+ +
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_get_prog_key()
+

We format our cache key properly.

+
+ +
+
+test_increment_cache()
+

Sum our progress by increments properly.

+
+ +
+
+test_locking()
+

Make sure we indicate we’re locked if and only if we’re inside the function.

+
+ +
+
+test_locking_w_exception()
+

Make sure we release our lock if we have had an exception.

+
+ +
+
+test_progress()
+

When a task finishes, it increments the progress counter properly.

+
+ +
+
+unlocked = 0
+
+ +
+ +
+
+exception seed.tests.test_decorators.TestError
+

Bases: Exception

+
+ +
+
+

Exporters

+
+
+

Models

+
+
+

Tasks

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.test_tasks.TestTasks(methodName='runTest')
+

Bases: TestCase

+

Tests for dealing with SEED related tasks.

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_delete_organization()
+
+ +
+ +
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.test_views.DatasetPermissionsTests(methodName='runTest')
+

Bases: AccessLevelBaseTestCase

+
+
+setUp()
+

SUPERUSER

+
+ +
+
+test_dataset_count()
+
+ +
+
+test_dataset_create()
+
+ +
+
+test_dataset_destroy()
+
+ +
+
+test_dataset_list()
+
+ +
+
+test_dataset_retrieve()
+
+ +
+
+test_dataset_update()
+
+ +
+ +
+
+class seed.tests.test_views.GetDatasetsViewsTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_delete_dataset()
+
+ +
+
+test_get_dataset()
+
+ +
+
+test_get_datasets()
+
+ +
+
+test_get_datasets_count()
+
+ +
+
+test_get_datasets_count_invalid()
+
+ +
+
+test_update_dataset()
+
+ +
+ +
+
+class seed.tests.test_views.ImportFileViewsTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_delete_file()
+
+ +
+
+test_get_import_file()
+
+ +
+
+test_get_matching_and_geocoding_results()
+
+ +
+ +
+
+class seed.tests.test_views.InventoryViewTests(methodName='runTest')
+

Bases: AssertDictSubsetMixin, DeleteModelsTestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_get_cycles()
+
+ +
+
+test_get_properties()
+
+ +
+
+test_get_properties_cycle_id()
+
+ +
+
+test_get_properties_empty_page()
+
+ +
+
+test_get_properties_page_not_an_integer()
+
+ +
+
+test_get_properties_pint_fields()
+
+ +
+
+test_get_properties_profile_id()
+
+ +
+
+test_get_properties_property_extra_data()
+
+ +
+
+test_get_properties_select_all()
+
+ +
+
+test_get_properties_taxlot_extra_data()
+
+ +
+
+test_get_properties_with_taxlots()
+
+ +
+
+test_get_properties_with_taxlots_with_footprints()
+
+ +
+
+test_get_properties_wrong_query_params()
+
+ +
+
+test_get_property()
+
+ +
+
+test_get_property_columns()
+
+ +
+
+test_get_property_multiple_taxlots()
+
+ +
+
+test_get_taxlot()
+
+ +
+
+test_get_taxlot_columns()
+
+ +
+
+test_get_taxlots()
+
+ +
+
+test_get_taxlots_empty_page()
+
+ +
+
+test_get_taxlots_extra_data()
+
+ +
+
+test_get_taxlots_multiple_taxlots()
+
+ +
+
+test_get_taxlots_no_cycle_id()
+
+ +
+
+test_get_taxlots_page_not_an_integer()
+
+ +
+
+test_get_taxlots_profile_id()
+
+ +
+
+test_postoffice()
+
+ +
+
+test_update_pint_fields_with_modified_display_settings()
+
+ +
+ +
+
+class seed.tests.test_views.MainViewTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_home()
+
+ +
+ +
+
+class seed.tests.test_views.TestMCMViews(methodName='runTest')
+

Bases: TestCase

+
+
+assert_expected_mappings(actual, expected)
+

For each k,v pair of form column_name: [dest_col, confidence] +in actual, assert that expected contains the same column_name +and dest_col mapping.

+
+ +
+
+expected_mappings = {'address': ['owner_address', 70], 'building id': ['Building air leakage', 64], 'name': ['Name of Audit Certification Holder', 47], 'year built': ['year_built', 50]}
+
+ +
+
+raw_columns_expected = {'raw_columns': ['name', 'address', 'year built', 'building id'], 'status': 'success'}
+
+ +
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_create_dataset()
+

tests the create_dataset view, allows duplicate dataset names

+
+ +
+
+test_get_column_mapping_suggestions()
+
+ +
+
+test_get_column_mapping_suggestions_pm_file()
+
+ +
+
+test_get_column_mapping_suggestions_with_columns()
+
+ +
+
+test_get_raw_column_names()
+

Good case for get_raw_column_names.

+
+ +
+
+test_progress()
+

Make sure we retrieve data from cache properly.

+
+ +
+
+test_save_column_mappings()
+
+ +
+
+test_save_column_mappings_idempotent()
+

We need to make successive calls to save_column_mappings.

+
+ +
+ +
+
+

Tests

+
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.util.AccessLevelBaseTestCase(methodName='runTest')
+

Bases: TestCase

+

Base Test Case Class to handle Access Levels +Creates a root owner user, a root member user, +and a child member user +Useful for testing “setup” API endpoints +as well as “data” endpoints +Provides methods for logging in as different +users +Sets up the factories

+
+
+login_as_child_member()
+

Login to client as Child-Level member user

+
+ +
+
+login_as_root_member()
+

Login to client as Root-Level member user

+
+ +
+
+login_as_root_owner()
+

Login to client as Root-Level owner user

+
+ +
+
+setUp()
+

SUPERUSER

+
+ +
+ +
+
+class seed.tests.util.AssertDictSubsetMixin
+

Bases: object

+
+
+assertDictContainsSubset(subset, dictionary)
+

Checks whether dictionary is a superset of subset

+

This is a necessary polyfill b/c assertDictContainsSubset was deprecated +and I believe it’s much more readable compared to the implementation below

+
+ +
+ +
+
+class seed.tests.util.DataMappingBaseTestCase(methodName='runTest')
+

Bases: DeleteModelsTestCase

+

Base Test Case Class to handle data import

+
+
+create_import_file(user, org, cycle, source_type=0, data_state=1)
+
+ +
+
+set_up(import_file_source_type, user_name='test_user@demo.com', user_password='test_pass')
+
+ +
+ +
+
+class seed.tests.util.DeleteModelsTestCase(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+tearDown()
+

Hook method for deconstructing the test fixture after testing it.

+
+ +
+ +
+
+class seed.tests.util.FakeClient
+

Bases: object

+

An extremely light-weight test client.

+
+
+get(view_func, data, headers=None, **kwargs)
+
+ +
+
+post(view_func, data, headers=None, **kwargs)
+
+ +
+ +
+
+class seed.tests.util.FakeRequest(data=None, headers=None, user=None, method='POST', **kwargs)
+

Bases: object

+

A simple request stub.

+
+
+GET: Dict[str, Any] = {}
+
+ +
+
+META = {'REMOTE_ADDR': '127.0.0.1'}
+
+ +
+
+POST: Dict[str, Any] = {}
+
+ +
+
+body = None
+
+ +
+
+path = 'fake_login_path'
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.urls.html b/docs/code_documentation/3.1.0/modules/seed.urls.html new file mode 100644 index 00000000..aa4bc458 --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.urls.html @@ -0,0 +1,161 @@ + + + + + + + URLs Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

URLs Package

+
+

Submodules

+
+
+

Accounts

+
+
+

APIs

+
+
+

Main

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.utils.html b/docs/code_documentation/3.1.0/modules/seed.utils.html new file mode 100644 index 00000000..970db41c --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.utils.html @@ -0,0 +1,569 @@ + + + + + + + Utilities Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Utilities Package

+
+

Submodules

+
+
+

APIs

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.utils.api.APIBypassCSRFMiddleware(get_response)
+

Bases: object

+

This middleware turns off CSRF protection for API clients.

+

It must come before CsrfViewMiddleware in settings.MIDDLEWARE.

+
+ +
+
+class seed.utils.api.OrgCreateMixin
+

Bases: OrgMixin

+

Mixin to add organization when creating model instance

+
+
+perform_create(serializer)
+

Override to add org

+
+ +
+ +
+
+class seed.utils.api.OrgCreateUpdateMixin
+

Bases: OrgCreateMixin, OrgUpdateMixin

+

Mixin to add organization when creating/updating model instance

+
+ +
+
+class seed.utils.api.OrgMixin
+

Bases: object

+

Provides get_organization and get_parent_org method

+
+
+get_organization(request, return_obj=False)
+

Get org from query param or request.user.

+
+
Parameters:
+
    +
  • request – request object.

  • +
  • return_obj – bool. Set to True if obj vs pk is desired.

  • +
+
+
Returns:
+

int representing a valid organization pk or organization object.

+
+
+
+ +
+
+get_parent_org(request)
+

Gets parent organization of org from query param or request. +:param request: Request object. +:return: organization object.

+
+ +
+ +
+
+class seed.utils.api.OrgQuerySetMixin
+

Bases: OrgMixin

+

Mixin proving a get_queryset method that filters on organization.

+

In order to use this mixin you must specify the model attributes on the +View[Set] class. By default, it assumes there is an organization field +on the model. You can override this by setting the orgfilter attribute +to the appropriate fieldname. This also allows nested fields e.g. +foreign_key.organization +By default this retrieves organization from query string param OR the +default_organization or first returned organization of the logged in user. +You can force it to return the appropriate “parent” organization by setting +the force_parent attribute to True.

+
+
+get_queryset()
+

get_queryset filtered on organization

+
+ +
+ +
+
+class seed.utils.api.OrgUpdateMixin
+

Bases: OrgMixin

+

Mixin to add organization when updating model instance

+
+
+perform_update(serializer)
+

Override to add org

+
+ +
+ +
+
+class seed.utils.api.OrgValidateMixin
+

Bases: object

+

Mixin to provide a validate() method organization to ensure users belongs +to the same org as the instance referenced by a foreign key..

+

You must set org_validators on the Serializer that uses this Mixin. +This is a list of OrgValidator named tuples (where key is the key +on request data representing the foreign key, and field the foreign key +that represents the organization on the corresponding model.

+

my_validator = OrgValidator(key=’foreign_key, field=’organization_id’)

+

..example:

+
+
+
class MySerializer(OrgValidateMixin, serializers.ModelSerializer):
+
foreign_key= serializers.PrimaryKeyRelatedField(

query_set=MyModel.objects.all()

+
+
+

) +org_validators = [my_validator]

+
+
+
+

This ensures request.user belongs to the org MyModel.organization

+

You can traverse foreign key relationships by using a double underscore +in validator.field

+

In the example above setting validator field to be ‘property__org_id’ +is equivalent to MyModel.property.org_id

+

If you use this Mixin and write a validate method, you must call super +to ensure validation takes place.

+
+
+validate(data)
+

Object level validation.

+

Checks for self.org_validators on Serializers and +ensures users belongs to org corresponding to the foreign key +being set.

+
+ +
+
+validate_org(instance, user, validator)
+

Raise error if orgs do not match.

+
+
Parameters:
+
    +
  • instance (model instance) – value in request.data.get(key) to check against

  • +
  • validator – validator to user

  • +
+
+
Param:
+

org_id of user, from get_org_id(request)

+
+
Type:
+

OrgValidator named tuple

+
+
+
+ +
+ +
+
+class seed.utils.api.OrgValidator(key, field)
+

Bases: tuple

+
+
+field
+

Alias for field number 1

+
+ +
+
+key
+

Alias for field number 0

+
+ +
+ +
+
+class seed.utils.api.ProfileIdMixin
+

Bases: object

+

Provides methods to get the columns to show based on a profile ID

+
+
+get_show_columns(org_id, profile_id)
+

Get list of columns from the profile_id. The result will be in the form of

+
+
show_columns = {

‘fields’: [‘field_1’, ‘field_2’, …] +‘extra_data’: [‘extra_data_field_1’, ‘extra_data_field_2’, …]

+
+
+

}

+
+
Parameters:
+
    +
  • org_id – str, id of organization

  • +
  • profile_id – str, id of profile to retrieve

  • +
+
+
Returns:
+

dist of lists

+
+
+
+ +
+ +
+
+seed.utils.api.api_endpoint(fn)
+

Decorator function to mark a view as allowed to authenticate via API key.

+

Decorator must be used before login_required or has_perm to set +request.user for those decorators.

+
+ +
+
+seed.utils.api.api_endpoint_class(fn)
+

Decorator function to mark a view as allowed to authenticate via API key.

+

Decorator must be used before login_required or has_perm to set +request.user for those decorators.

+
+ +
+
+seed.utils.api.clean_api_regex(url)
+

Given a django-style url regex pattern, strip it down to a human-readable +url.

+

TODO: If pks ever appear in the url, this will need to account for that.

+
+ +
+
+seed.utils.api.drf_api_endpoint(fn)
+

Decorator to register a Django Rest Framework view with the list of API +endpoints. Marks it with is_api_endpoint = True as well as appending it +to the global endpoints list.

+
+ +
+
+seed.utils.api.format_api_docstring(docstring)
+

Cleans up a python method docstring for human consumption.

+
+ +
+
+seed.utils.api.get_all_urls(urllist, prefix='')
+

Recursive generator that traverses entire tree of URLs, starting with +urllist, yielding a tuple of (url_pattern, view_function) for each +one.

+
+ +
+
+seed.utils.api.get_api_endpoints()
+

Examines all views and returns those with is_api_endpoint set +to true (done by the @api_endpoint decorator).

+
+ +
+
+seed.utils.api.get_api_request_user(request)
+

Determines if this is an API request and returns the corresponding user if so.

+
+ +
+
+seed.utils.api.get_org_id_from_validator(instance, field)
+

For querysets Django enables you to do things like:

+

note double underscore. However you can’t do:

+

This presents an issue as getattr only works 1 level deep:

+
+

getattr(obj, ‘org.id’) does not work either.

+
+

This can be worked around using rgetattr (above). +This functions mimics getattr(obj, ‘org__id’) by +splitting field on __ and calling rgetattr on the result.

+
+ +
+
+seed.utils.api.rgetattr(obj, lst)
+

This enables recursive getattr look ups. +given obj, [‘a’, ‘b’, ‘c’] as params it will look up: +obj.a, a.b, b.c returning b.c unless one of the previous +values was None, in which case it returns None immediately.

+
+
Parameters:
+
    +
  • obj (object) – initial object to examine

  • +
  • lst (list) – list of successive attributes to look up

  • +
+
+
+
+ +
+
+

Buildings

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.utils.buildings.get_source_type(import_file, source_type='')
+

Used for converting ImportFile source_type into an int.

+
+ +
+
+

Organizations

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.utils.organizations.create_organization(user=None, org_name='test_org', *args, **kwargs)
+

Helper script to create a user/org relationship from scratch. This is heavily used and +creates the default labels, columns, and data quality rules when a new organization is created

+
+
Parameters:
+
    +
  • user – user inst.

  • +
  • org_name – str, name of Organization we’d like to create.

  • +
  • kwargs ((optional)) – ‘role’, int; ‘status’, str.

  • +
+
+
+
+ +
+
+seed.utils.organizations.create_suborganization(user, current_org, suborg_name='', user_role=10)
+
+ +
+
+seed.utils.organizations.default_pm_mappings()
+
+ +
+
+seed.utils.organizations.set_default_2fa_method(org)
+
+ +
+
+

Time

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.utils.time.convert_datestr(datestr, make_tz_aware=False)
+

Converts dates like 12/31/2010 into datetime objects. Dates are returned in UTC time

+

TODO: reconcile this with seed/lib/mcm/cleaners.py#L85-L85

+
+
Parameters:
+
    +
  • datestr – string, value to convert

  • +
  • make_tz_aware – bool, if set to true, then will convert the timezone into UTC time

  • +
+
+
Returns:
+

datetime or None

+
+
+
+ +
+
+seed.utils.time.convert_to_js_timestamp(timestamp)
+

converts a django/python datetime object to milliseconds since epoch

+
+ +
+
+seed.utils.time.parse_datetime(maybe_datetime)
+

Process a datetime value that may be None, timestamp, strftime.

+
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/modules/seed.views.html b/docs/code_documentation/3.1.0/modules/seed.views.html new file mode 100644 index 00000000..fe3b496b --- /dev/null +++ b/docs/code_documentation/3.1.0/modules/seed.views.html @@ -0,0 +1,228 @@ + + + + + + + Views Package — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Views Package

+
+

Submodules

+
+
+

Accounts

+
+
+

APIs

+
+
+

Main

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.views.main.angular_js_tests(request)
+

Jasmine JS unit test code covering AngularJS unit tests

+
+ +
+
+seed.views.main.celery_queue(self, request, *args, **kwargs)
+

Returns the number of running and queued celery tasks. This action can only be performed by superusers

+

Returns:

+
{
+    'active': {'total': n, 'tasks': []}, // Tasks that are currently being executed
+    'reserved': {'total': n, 'tasks': []}, // Tasks waiting to be executed
+    'scheduled': {'total': n, 'tasks': []}, // Tasks reserved by the worker when they have an eta or countdown
+    'maxConcurrency': The maximum number of active tasks
+}
+
+
+
+ +
+
+seed.views.main.error404(request, exception)
+
+ +
+
+seed.views.main.error410(request)
+
+ +
+
+seed.views.main.error500(request)
+
+ +
+
+seed.views.main.health_check(request)
+

Perform a health check without requiring authentication

+
+ +
+
+seed.views.main.home(request)
+

the main view for the app +Sets in the context for the django template:

+
+ +
+
+seed.views.main.version(self, request, *args, **kwargs)
+

Returns the SEED version and current git sha

+
+ +
+
+

Meters

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/objects.inv b/docs/code_documentation/3.1.0/objects.inv new file mode 100644 index 00000000..dd2382ca Binary files /dev/null and b/docs/code_documentation/3.1.0/objects.inv differ diff --git a/docs/code_documentation/3.1.0/postgres_upgrade.html b/docs/code_documentation/3.1.0/postgres_upgrade.html new file mode 100644 index 00000000..8198cfb8 --- /dev/null +++ b/docs/code_documentation/3.1.0/postgres_upgrade.html @@ -0,0 +1,162 @@ + + + + + + + Upgrade a SEED database from Postgres 12 to Postgres 16 — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Upgrade a SEED database from Postgres 12 to Postgres 16

+
+

Assumptions

+
    +
  • This process assumes that you’re currently using Postgres 12.7 with TimescaleDB 2.3.0 from timescale/timescaledb-postgis:2.3.0-pg12 or timescale/timescaledb-postgis:latest-pg12

  • +
  • This also assumes that you have a directory in the host filesystem, e.g. ~/share, that is bind mounted to /share in your existing database container

  • +
+
    +
  1. Create a dump of the current database

  2. +
+
docker exec seed_postgres pg_dump -d seed -U seeduser -Fc -f /share/seed-pg12.dump
+
+
+
    +
  1. Create a temporary Postgres 13 container using the Docker image timescale/timescaledb-ha:pg13.14-ts2.14.2-oss

  2. +
+
docker run --rm --name=seed-pg13 -e POSTGRES_DB=seed -e POSTGRES_USER=seeduser -e POSTGRES_PASSWORD=password -v ~/share:/share timescale/timescaledb-ha:pg13.14-ts2.14.2-oss
+
+
+

Once the container has finished initializing, open a separate shell

+
docker exec -it seed-pg13 bash
+psql -d seed -U seeduser -c "CREATE EXTENSION postgis;"
+psql -d seed -U seeduser -c "DROP EXTENSION timescaledb;"
+psql -d seed -U seeduser -c "CREATE EXTENSION timescaledb WITH VERSION '2.3.0';"
+psql -d seed -U seeduser -c "SELECT timescaledb_pre_restore();"
+pg_restore -d seed -U seeduser /share/seed-pg12.dump
+psql -d seed -U seeduser -c "SELECT timescaledb_post_restore();"
+psql -d seed -U seeduser -c "ALTER EXTENSION timescaledb UPDATE;"
+pg_dump -d seed -U seeduser -Fc -f /share/seed-pg13.dump
+
+
+
    +
  1. Start the new, permanent Postgres 16 container using the Docker image timescale/timescaledb-ha:pg16.2-ts2.14.2-oss

  2. +
+
docker run -d --name=seed-pg16 -e POSTGRES_DB=seed -e POSTGRES_USER=seeduser -e POSTGRES_PASSWORD=password -v ~/share:/share timescale/timescaledb-ha:pg16.2-ts2.14.2-oss
+
+
+

Once the container has finished initializing, open a separate shell

+
docker exec -it seed-pg16 bash
+psql -d seed -U seeduser -c "CREATE EXTENSION postgis;"
+psql -d seed -U seeduser -c "SELECT timescaledb_pre_restore();"
+pg_restore -d seed -U seeduser /share/seed-pg13.dump
+psql -d seed -U seeduser -c "SELECT timescaledb_post_restore();"
+pg_dump -d seed -U seeduser -Fc -f /share/seed-pg16.dump
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/py-modindex.html b/docs/code_documentation/3.1.0/py-modindex.html new file mode 100644 index 00000000..cdf7a5f4 --- /dev/null +++ b/docs/code_documentation/3.1.0/py-modindex.html @@ -0,0 +1,408 @@ + + + + + + Python Module Index — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ c | + s +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ c
+ config +
    + config.template_context +
    + config.tests +
    + config.utils +
    + config.views +
    + config.wsgi +
 
+ s
+ seed +
    + seed.data_importer +
    + seed.data_importer.managers +
    + seed.data_importer.utils +
    + seed.decorators +
    + seed.landing +
    + seed.landing.forms +
    + seed.landing.management +
    + seed.landing.management.commands +
    + seed.landing.models +
    + seed.landing.tests +
    + seed.landing.urls +
    + seed.landing.views +
    + seed.lib +
    + seed.lib.mappings +
    + seed.lib.mappings.mapper +
    + seed.lib.mappings.mapping_columns +
    + seed.lib.merging +
    + seed.lib.merging.merging +
    + seed.management +
    + seed.models +
    + seed.models.auditlog +
    + seed.models.columns +
    + seed.models.cycles +
    + seed.models.data_quality +
    + seed.models.models +
    + seed.models.properties +
    + seed.models.tax_lots +
    + seed.public +
    + seed.search +
    + seed.serializers +
    + seed.serializers.celery +
    + seed.serializers.labels +
    + seed.tasks +
    + seed.templatetags.breadcrumbs +
    + seed.test_helpers +
    + seed.test_helpers.factory.helpers +
    + seed.tests.test_admin_views +
    + seed.tests.test_decorators +
    + seed.tests.test_tasks +
    + seed.tests.test_views +
    + seed.tests.util +
    + seed.token_generators +
    + seed.utils +
    + seed.utils.api +
    + seed.utils.buildings +
    + seed.utils.organizations +
    + seed.utils.time +
    + seed.views +
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/search.html b/docs/code_documentation/3.1.0/search.html new file mode 100644 index 00000000..30d8c9e2 --- /dev/null +++ b/docs/code_documentation/3.1.0/search.html @@ -0,0 +1,133 @@ + + + + + + Search — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/searchindex.js b/docs/code_documentation/3.1.0/searchindex.js new file mode 100644 index 00000000..a1b97c5e --- /dev/null +++ b/docs/code_documentation/3.1.0/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "aws", "data_model", "data_quality", "deployment", "developer_resources", "docker", "faq", "getting_started", "help", "index", "kubernetes_deployment", "license", "linux", "mapping", "matching", "migrations", "modules", "modules/config", "modules/seed", "modules/seed.cleansing", "modules/seed.data", "modules/seed.data_importer", "modules/seed.features", "modules/seed.landing", "modules/seed.landing.management", "modules/seed.landing.management.commands", "modules/seed.lib", "modules/seed.lib.mappings", "modules/seed.lib.merging", "modules/seed.management", "modules/seed.managers", "modules/seed.managers.tests", "modules/seed.mappings", "modules/seed.models", "modules/seed.public", "modules/seed.serializers", "modules/seed.templatetags", "modules/seed.test_helpers", "modules/seed.test_helpers.factory", "modules/seed.test_helpers.factory.lib", "modules/seed.tests", "modules/seed.tests.functional", "modules/seed.urls", "modules/seed.utils", "modules/seed.views", "postgres_upgrade", "setup_docker", "setup_osx", "translation"], "filenames": ["api.rst", "aws.rst", "data_model.rst", "data_quality.rst", "deployment.rst", "developer_resources.rst", "docker.rst", "faq.rst", "getting_started.rst", "help.rst", "index.rst", "kubernetes_deployment.rst", "license.rst", "linux.rst", "mapping.rst", "matching.rst", "migrations.rst", "modules.rst", "modules/config.rst", "modules/seed.rst", "modules/seed.cleansing.rst", "modules/seed.data.rst", "modules/seed.data_importer.rst", "modules/seed.features.rst", "modules/seed.landing.rst", "modules/seed.landing.management.rst", "modules/seed.landing.management.commands.rst", "modules/seed.lib.rst", "modules/seed.lib.mappings.rst", "modules/seed.lib.merging.rst", "modules/seed.management.rst", "modules/seed.managers.rst", "modules/seed.managers.tests.rst", "modules/seed.mappings.rst", "modules/seed.models.rst", "modules/seed.public.rst", "modules/seed.serializers.rst", "modules/seed.templatetags.rst", "modules/seed.test_helpers.rst", "modules/seed.test_helpers.factory.rst", "modules/seed.test_helpers.factory.lib.rst", "modules/seed.tests.rst", "modules/seed.tests.functional.rst", "modules/seed.urls.rst", "modules/seed.utils.rst", "modules/seed.views.rst", "postgres_upgrade.rst", "setup_docker.rst", "setup_osx.rst", "translation.rst"], "titles": ["API", "AWS Setup", "Data Model", "Data Quality", "Deployment Guide", "Developer Resources", "Docker Deployment on AWS", "Frequently Asked Questions", "Getting Started", "Help", "Standard Energy Efficiency Data (SEED) Platform", "Kubernetes Deployment Guide with Helm", "License", "General Linux Setup", "Mapping", "Matching", "Migrations", "Modules", "Configuration", "SEED Package", "Data Quality Package", "Data Package", "Data Importer Package", "Features Package", "Landing Package", "seed.landing.management package", "Landing Management Package", "Library Packages", "seed.lib.mappings package", "seed.lib.merging package", "Management Package", "Managers Package", "Manager Tests Package", "Mapping Package", "Models", "Public Package", "Serializers Package", "Templatetags Package", "Test Helpers Package", "Test Helper Factor Package", "Test Helper Factory Lib Package", "Tests Package", "Tests (Functional) Package", "URLs Package", "Utilities Package", "Views Package", "Upgrade a SEED database from Postgres 12 to Postgres 16", "Installation using Docker", "Installation on OSX", "Translating SEED"], "terms": {"i": [0, 1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 16, 19, 20, 22, 24, 28, 34, 37, 41, 44, 46, 47, 48, 49], "handl": [0, 2, 4, 5, 16, 24, 28, 41], "via": [0, 5, 15, 18, 20, 24, 34, 44], "an": [0, 1, 2, 3, 5, 6, 7, 10, 11, 13, 14, 15, 16, 18, 19, 24, 34, 41, 44, 45, 47, 48, 49], "encod": 0, "author": [0, 19, 24, 28, 29, 37], "token": [0, 11, 17, 24, 37, 49], "set": [0, 1, 2, 4, 6, 10, 11, 13, 14, 15, 16, 18, 19, 20, 24, 28, 29, 34, 41, 44, 45, 47, 48], "http": [0, 4, 5, 6, 9, 11, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "header": [0, 5, 14, 19, 24, 41, 49], "To": [0, 1, 2, 3, 4, 5, 11, 47, 48], "request": [0, 2, 9, 11, 13, 14, 18, 19, 24, 34, 41, 44, 45], "go": [0, 5, 34, 47], "app": [0, 1, 5, 7, 10, 11, 13, 22, 45, 48], "profil": [0, 1, 5, 6, 13, 14, 44, 48], "develop": [0, 4, 7, 10, 18, 48], "click": [0, 2, 3], "get": [0, 1, 2, 5, 6, 10, 11, 13, 15, 19, 20, 24, 28, 34, 41, 44, 48, 49], "new": [0, 2, 11, 15, 16, 19, 20, 22, 29, 34, 41, 44, 46, 48, 49], "kei": [0, 2, 4, 5, 6, 8, 11, 16, 19, 20, 24, 28, 29, 34, 41, 44, 49], "everi": [0, 1, 2, 5, 13, 34], "your": [0, 1, 4, 5, 6, 7, 11, 13, 16, 46, 47, 48], "usernam": [0, 1, 5, 11, 13, 24, 41, 47, 48], "email": [0, 5, 6, 7, 11, 13, 19, 24, 34, 41], "all": [0, 2, 5, 7, 11, 12, 13, 15, 16, 19, 20, 22, 24, 34, 37, 44, 48, 49], "lowercas": [0, 14, 41], "basic": [0, 49], "auth": [0, 4, 24], "The": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 19, 20, 24, 28, 34, 44, 45, 47, 48, 49], "sent": [0, 7], "form": [0, 2, 12, 17, 34, 41, 44], "credenti": [0, 11], "where": [0, 2, 3, 5, 9, 15, 20, 22, 44, 48, 49], "base64": 0, "join": [0, 9, 17], "singl": [0, 16, 19, 34, 48], "colon": 0, "us": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19, 20, 22, 24, 28, 34, 41, 44, 46, 48, 49], "python": [0, 4, 7, 8, 9, 10, 19, 34, 44], "librari": [0, 7, 10, 17], "import": [0, 3, 4, 5, 7, 10, 15, 16, 17, 20, 28, 34, 41, 47], "result": [0, 2, 5, 15, 16, 20, 28, 34, 44], "seed": [0, 1, 4, 5, 6, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 27, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "platform": [0, 1, 4, 5, 6, 11, 12, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "org": [0, 5, 6, 7, 9, 11, 13, 16, 19, 22, 24, 37, 41, 44, 47, 48], "version": [0, 4, 5, 6, 7, 11, 28, 34, 45, 46, 47, 48], "user_email": 0, "api_kei": [0, 24, 48], "print": [0, 5], "json": [0, 1, 2, 5, 11, 13, 14, 17, 19, 28, 49], "curl": [0, 1, 6, 13], "pass": [0, 5, 6, 13, 19, 34, 36, 47], "follow": [0, 1, 2, 4, 5, 6, 11, 12, 13, 15, 16, 34, 47, 48], "u": [0, 5, 6, 7, 10, 11, 12, 13, 22, 34, 46], "If": [0, 1, 2, 4, 5, 6, 7, 11, 15, 16, 19, 20, 24, 28, 34, 44, 47, 48, 49], "fail": [0, 5, 6, 16, 41, 47], "": [0, 1, 2, 5, 6, 7, 9, 10, 12, 13, 15, 18, 19, 20, 22, 24, 34, 41, 47, 48, 49], "statu": [0, 19, 41, 44], "code": [0, 5, 9, 11, 12, 16, 19, 34, 45, 47, 48], "302": 0, "redirect": 0, "user": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 15, 16, 19, 24, 34, 41, 44, 47, 49], "login": [0, 5, 8, 11, 13, 24, 41, 47], "mani": [0, 2, 13, 20, 24, 34, 49], "requir": [0, 1, 5, 6, 7, 10, 11, 12, 13, 16, 20, 24, 45, 48, 49], "paramet": [0, 16, 19, 20, 24, 28, 29, 34, 37, 44, 47], "queri": [0, 5, 16, 19, 20, 24, 34, 44], "string": [0, 16, 19, 20, 22, 24, 28, 34, 37, 44, 49], "url": [0, 5, 10, 11, 13, 16, 17, 19, 37, 44], "A": [0, 1, 5, 12, 13, 14, 15, 20, 24, 34, 41, 48], "frequent": [0, 10], "includ": [0, 1, 5, 12, 13, 15, 16, 20, 22, 29, 34, 47], "organization_id": [0, 2, 5, 16, 19, 20, 34, 36, 44], "you": [0, 1, 4, 5, 7, 9, 11, 13, 16, 18, 34, 36, 44, 46, 47, 48, 49], "belong": [0, 2, 44], "For": [0, 1, 2, 5, 6, 10, 11, 15, 18, 34, 36, 41, 44, 47, 48], "exampl": [0, 1, 2, 5, 6, 9, 15, 16, 18, 19, 20, 24, 28, 34, 36, 37, 44, 47, 48, 49], "v2": [0, 11], "organ": [0, 1, 5, 7, 9, 10, 11, 13, 15, 16, 17, 19, 20, 22, 34, 48], "12": [0, 2, 5, 44, 49], "Or": [0, 15], "d": [0, 5, 6, 44, 46, 48], "6": [0, 5, 34], "role": [0, 2, 44, 48], "viewer": 0, "update_rol": 0, "param": [0, 19, 20, 34, 44], "post": [0, 19, 24, 41, 48], "data": [0, 1, 4, 5, 7, 9, 11, 12, 13, 14, 15, 16, 17, 24, 28, 29, 34, 41, 44, 49], "dump": [0, 10, 46, 48], "from": [0, 1, 2, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 19, 20, 22, 24, 28, 29, 34, 41, 44, 47, 48, 49], "object": [0, 5, 7, 14, 16, 19, 20, 22, 24, 28, 34, 36, 37, 39, 41, 44], "specifi": [0, 5, 14, 15, 20, 44, 47], "each": [0, 2, 5, 11, 15, 16, 22, 29, 41, 44], "document": [0, 1, 2, 6, 9, 10, 12, 13, 14, 16], "In": [0, 1, 2, 5, 13, 16, 20, 22, 24, 34, 44, 47, 48], "case": [0, 2, 3, 5, 15, 16, 28, 34, 41, 44, 48], "error": [0, 4, 5, 16, 19, 20, 44, 47], "most": [0, 2, 3, 5, 6, 15, 20, 24, 34], "return": [0, 2, 5, 16, 19, 20, 22, 24, 28, 29, 34, 36, 37, 44, 45], "thi": [0, 1, 2, 3, 4, 5, 6, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 22, 24, 28, 29, 34, 36, 41, 44, 45, 46, 47, 48, 49], "instead": [0, 2, 5, 34, 37, 48], "expect": [0, 5, 13, 16, 22, 41], "messag": [0, 4, 5, 24, 48], "explan": 0, "here": [0, 2, 5, 7, 11, 13, 15, 18, 22, 47], "list": [0, 2, 5, 6, 9, 11, 12, 15, 19, 20, 28, 29, 34, 36, 44], "interact": 0, "ar": [0, 1, 2, 3, 4, 5, 7, 11, 12, 13, 14, 15, 16, 19, 20, 22, 24, 28, 34, 44, 45, 47, 48, 49], "avail": [0, 1, 7, 9, 10, 13, 28, 49], "access": [0, 1, 5, 7, 10, 11, 13, 15, 41, 48], "menu": 0, "item": [0, 5, 11, 16, 28], "left": [0, 29], "navig": [0, 34, 48], "pane": 0, "within": [0, 1, 5, 13, 15, 19, 48], "account": [0, 4, 11, 15, 17, 22, 24, 41, 44], "instanc": [0, 1, 2, 4, 6, 13, 15, 19, 20, 22, 24, 29, 34, 36, 44, 48], "view": [0, 10, 11, 14, 15, 17, 34, 44], "non": [0, 2, 8, 13, 34], "without": [0, 12, 15, 16, 41, 45], "swagger": 0, "server": [0, 1, 4, 5, 6, 8, 11, 14, 18], "provid": [1, 5, 6, 7, 10, 12, 13, 19, 22, 41, 44, 48, 49], "prefer": [1, 2, 6, 13, 16, 20, 22], "host": [1, 6, 7, 13, 16, 46, 48], "django": [1, 2, 4, 6, 7, 8, 10, 11, 16, 18, 19, 20, 24, 34, 37, 44, 45, 47, 49], "project": [1, 4, 5, 6, 13, 18, 19], "excel": [1, 6, 13], "place": [1, 6, 13, 34, 44, 49], "gener": [1, 4, 6, 9, 10, 11, 17, 44, 48], "understand": [1, 6, 13], "layout": [1, 6, 13, 49], "ubuntu": [1, 5, 6, 8, 13], "18": [1, 5, 6, 13], "04": [1, 6, 13], "lt": 1, "These": [1, 2, 11, 14, 15, 34, 48], "instruct": [1, 8, 10, 11, 13, 47], "have": [1, 2, 3, 4, 5, 6, 7, 11, 13, 15, 16, 18, 19, 22, 34, 41, 45, 46, 47, 48, 49], "been": [1, 2, 5, 15, 19, 20, 34, 48], "updat": [1, 2, 5, 6, 7, 13, 15, 16, 20, 24, 25, 29, 34, 44, 46, 48, 49], "It": [1, 2, 6, 9, 11, 18, 34, 44, 47, 49], "recommend": [1, 4, 5, 9, 13, 48], "docker": [1, 4, 5, 8, 10, 11, 13, 46], "base": [1, 2, 5, 7, 10, 13, 19, 20, 22, 24, 28, 29, 34, 36, 37, 39, 41, 44, 47, 48, 49], "deploy": [1, 5, 10, 15, 18], "sudo": [1, 6, 13, 16, 48], "apt": [1, 6, 13, 16], "upgrad": [1, 6, 13, 16, 48], "instal": [1, 4, 5, 8, 11, 13, 16, 19, 49], "y": [1, 6], "libpq": [1, 13], "dev": [1, 11, 13, 47, 48], "pip": [1, 13, 16, 48], "libatla": [1, 13], "gfortran": [1, 13], "build": [1, 2, 7, 8, 9, 10, 13, 15, 17, 19, 20, 34, 41, 48], "essenti": [1, 13], "g": [1, 2, 4, 5, 9, 11, 13, 16, 34, 44, 46, 48, 49], "npm": [1, 5, 8, 13, 16], "libxml2": [1, 13], "libxslt1": [1, 13], "git": [1, 6, 13, 45, 48], "mercuri": [1, 13], "libssl": [1, 13], "libffi": [1, 13], "uwsgi": [1, 13, 48], "core": [1, 13, 16, 19], "plugin": [1, 13], "postgresql": [1, 2, 4, 7, 8, 10, 16], "redi": [1, 8, 13, 16, 20], "abov": [1, 2, 5, 6, 12, 13, 15, 20, 44], "command": [1, 5, 6, 11, 13, 16, 18, 34, 47, 48], "quick": [1, 8, 11, 13], "okai": [1, 6], "local": [1, 4, 5, 6, 13, 16, 48, 49], "more": [1, 2, 4, 5, 11, 13, 15, 16, 41, 49], "perman": [1, 46], "scalabl": 1, "solut": 1, "elasticach": [1, 13], "9": [1, 2, 5, 11, 13], "4": [1, 2, 5, 6, 12, 13, 15, 20, 34, 48], "support": [1, 4, 13, 16, 19, 36], "type": [1, 2, 11, 13, 20, 22, 29, 34, 44], "contrib": [1, 4, 5, 7, 13, 16, 24, 48], "can": [1, 2, 3, 4, 5, 7, 9, 10, 11, 13, 14, 15, 16, 19, 22, 24, 28, 34, 44, 45, 47, 48, 49], "rd": [1, 13], "se": [1, 6], "clone": [1, 6, 13, 48], "repositori": [1, 5, 6, 9, 13, 16, 48], "github": [1, 5, 6, 9, 11, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "com": [1, 5, 6, 9, 11, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "enter": [1, 2, 11, 13], "repo": [1, 11, 13], "cd": [1, 5, 6, 13, 48], "r": [1, 5, 13, 16, 48], "txt": [1, 13, 16, 48], "j": [1, 5, 45, 48, 49], "copi": [1, 5, 13, 16, 19, 34, 48, 49], "local_untrack": [1, 4, 5, 7, 16, 47, 48], "py": [1, 4, 5, 7, 11, 16, 19, 24, 37, 44, 47, 48], "dist": [1, 13, 44, 48], "file": [1, 2, 4, 5, 6, 7, 11, 13, 14, 16, 20, 24, 28, 34, 47, 48, 49], "config": [1, 5, 11, 13, 16, 18, 47, 48], "directori": [1, 5, 6, 11, 13, 16, 46, 47, 48], "add": [1, 4, 5, 6, 13, 14, 16, 20, 24, 28, 44, 47, 48, 49], "password": [1, 5, 11, 13, 16, 19, 24, 41, 46, 47, 48], "port": [1, 13, 16, 47, 48], "point": [1, 2, 5, 13, 14, 15, 22, 24, 34, 47, 48], "manual": [1, 5, 10, 13, 14, 15, 16, 48, 49], "infrastructur": [1, 13], "default": [1, 2, 3, 5, 6, 11, 13, 16, 19, 20, 34, 36, 44, 47, 48], "engin": [1, 6, 13, 16, 24, 48], "db": [1, 5, 6, 11, 13, 16, 20, 24, 34, 48], "backend": [1, 4, 13, 16, 34, 48], "postgresql_psycopg2": [1, 13], "name": [1, 2, 5, 6, 7, 11, 12, 13, 16, 18, 19, 20, 24, 28, 29, 34, 36, 37, 41, 44, 46, 47, 48], "arbitrari": [1, 2, 13, 36], "ani": [1, 2, 3, 4, 5, 6, 12, 13, 14, 15, 16, 18, 20, 22, 28, 29, 34, 41, 47, 48, 49], "valid": [1, 6, 7, 10, 13, 19, 20, 24, 34, 39, 44], "long": [1, 2, 13, 16, 28], "exist": [1, 2, 4, 5, 6, 10, 13, 16, 19, 20, 28, 29, 34, 41, 46, 47, 48], "creat": [1, 2, 4, 5, 6, 11, 14, 15, 16, 19, 20, 22, 24, 28, 34, 41, 44, 46, 47, 48, 49], "postgr": [1, 2, 5, 6, 11, 13, 16, 47, 48], "psql": [1, 5, 13, 46, 48], "shell": [1, 5, 7, 16, 46, 47, 48], "line": [1, 2, 5, 11, 16, 34, 48, 49], "createdb": [1, 13, 48], "tabl": [1, 5, 13, 16, 28, 34, 48], "migrat": [1, 8, 10, 13, 20], "manag": [1, 4, 7, 10, 13, 14, 16, 17, 19, 20, 24, 28, 34, 47, 48, 49], "syncdb": 1, "superus": [1, 5, 13, 41, 45, 48], "system": [1, 2, 5, 11, 13, 15, 48], "create_default_us": [1, 5, 11, 13, 48], "demo": [1, 5, 41, 48], "demo123": [1, 48], "must": [1, 5, 11, 12, 13, 14, 15, 16, 34, 44, 47, 48], "ti": [1, 13, 34], "visit": [1, 9, 13, 48], "admin": [1, 6, 8, 11, 13, 17, 19, 24], "parent": [1, 10, 13, 19, 20, 24, 29, 34, 44], "them": [1, 5, 13, 16, 41, 49], "reli": [1, 13], "both": [1, 2, 5, 7, 10, 13, 15, 19, 20, 34, 48], "should": [1, 2, 5, 11, 13, 15, 16, 18, 22, 34, 41, 47, 48, 49], "celery_broker_url": [1, 13, 16, 48], "ntmprk": 1, "0001": 1, "usw2": 1, "amazonaw": [1, 6, 11], "6379": [1, 13, 16, 48], "1": [1, 2, 4, 5, 6, 8, 11, 12, 13, 15, 20, 22, 34, 41, 44, 47], "django_redi": [1, 13, 16, 48], "rediscach": [1, 13, 16, 48], "locat": [1, 5, 13, 16, 20, 48], "save": [1, 5, 7, 10, 13, 14, 20, 22, 24, 29, 34, 48], "match": [1, 5, 10, 11, 13, 16, 19, 20, 22, 28, 44], "qualiti": [1, 7, 10, 13, 17, 44], "check": [1, 3, 13, 16, 19, 20, 28, 34, 41, 44, 45, 49], "etc": [1, 2, 5, 6, 13, 14, 15, 19, 47, 49], "connect": [1, 9, 11, 13, 15, 16, 47], "queue": [1, 13, 16], "start": [1, 2, 5, 10, 11, 13, 24, 34, 39, 44, 46, 47], "l": [1, 6, 13, 48], "info": [1, 5, 11, 13, 34, 48], "c": [1, 5, 6, 12, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 48], "2": [1, 2, 5, 6, 8, 11, 12, 13, 15, 20, 34, 46, 49], "max": [1, 5, 11, 13, 20, 48], "per": [1, 13, 15, 19, 20, 48, 49], "child": [1, 2, 13, 20, 24, 34, 41, 48], "1000": [1, 13, 20, 48], "eb": [1, 13, 48], "django_celery_beat": [1, 5, 13, 48], "schedul": [1, 13, 19, 45, 48], "databaseschedul": [1, 13, 48], "below": [2, 5, 6, 11, 16, 20, 22, 24, 28, 34, 41, 47, 48, 49], "out": [2, 5, 6, 7, 9, 12, 13, 20, 48, 49], "state": [2, 5, 12, 20, 29, 34], "need": [2, 5, 7, 9, 11, 13, 14, 15, 16, 19, 22, 34, 41, 44, 47, 48, 49], "our": [2, 9, 13, 29, 41], "primari": [2, 19, 20], "tree": [2, 44, 49], "structur": [2, 20, 28], "node": [2, 11, 37, 48], "tip": 2, "referenc": [2, 44], "take": [2, 11, 16, 28, 34, 37, 44], "ha": [2, 5, 13, 14, 15, 19, 20, 34, 46, 47], "load": [2, 13, 20, 24, 34], "csv": [2, 28], "contain": [2, 6, 8, 9, 11, 12, 16, 18, 24, 34, 41, 46, 49], "inform": [2, 4, 5, 7, 9, 10, 11, 14, 34], "about": [2, 5, 34], "one": [2, 3, 4, 5, 7, 11, 15, 16, 18, 20, 24, 28, 34, 44, 49], "first": [2, 5, 6, 11, 15, 16, 19, 20, 24, 28, 34, 37, 44, 47, 48], "bs0": 2, "At": [2, 4, 14, 15, 48, 49], "time": [2, 5, 6, 15, 16, 17, 20, 24, 34, 41, 47, 48, 49], "link": [2, 11, 16, 34, 37], "cb0": 2, "also": [2, 5, 9, 11, 12, 13, 15, 16, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 47, 48], "relat": [2, 5, 16, 20, 24, 34, 41], "repres": [2, 5, 15, 19, 44], "databas": [2, 4, 6, 7, 8, 10, 14, 16, 20, 22, 29, 34, 47], "foreign": [2, 16, 44], "come": [2, 11, 20, 44], "fruition": 2, "sai": [2, 15], "bs1": 2, "wa": [2, 5, 15, 20, 22, 28, 34, 41, 44], "occur": [2, 5, 14, 15, 16], "bs2": 2, "merg": [2, 5, 10, 14, 16, 17, 34], "togeth": [2, 34], "given": [2, 3, 5, 15, 19, 22, 28, 34, 44], "record": [2, 3, 5, 14, 15, 19, 34], "b3": 2, "snapshot": [2, 15], "becaus": [2, 16, 19, 20, 49], "newer": [2, 5, 6, 13], "two": [2, 4, 5, 11, 15, 16, 22, 28, 34], "perspect": 2, "By": [2, 13, 34, 44, 48], "recent": [2, 15, 34], "allow": [2, 15, 18, 41, 44], "evolv": 2, "over": [2, 15, 34, 48, 49], "canon": [2, 29, 34, 49], "site": [2, 5, 7, 11, 34], "eui": [2, 16, 20, 34], "valu": [2, 4, 11, 13, 15, 20, 22, 24, 28, 34, 44, 47, 48, 49], "75": 2, "some": [2, 5, 7, 11, 15, 16, 34, 47, 48, 49], "chang": [2, 5, 15, 16, 20, 34, 47, 48, 49], "caus": [2, 12, 16, 49], "80": [2, 11, 13], "submit": [2, 5, 9], "linkag": 2, "other": [2, 4, 5, 7, 9, 10, 12, 13, 15, 16, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 48, 49], "order": [2, 5, 11, 14, 15, 16, 44, 47, 49], "keep": [2, 16], "track": [2, 49], "addit": [2, 5, 14, 15, 16], "seed_buildingsnapshot_children": 2, "would": [2, 13, 15, 19, 28], "throughout": [2, 34], "applic": [2, 5, 7, 9, 10, 11, 15, 18], "search_build": 2, "endpoint": [2, 5, 10, 28, 41, 44], "search": [2, 10, 17], "activ": [2, 7, 10, 17, 24, 45, 48], "search_mapping_result": 2, "regardless": [2, 34], "whether": [2, 3, 12, 14, 19, 28, 41], "dure": [2, 3, 5, 15, 19], "map": [2, 5, 10, 16, 17, 19, 22, 29, 34, 41, 49], "preview": [2, 15], "section": [2, 7, 11, 37, 48], "illustr": 2, "purpos": [2, 5, 12, 34], "let": [2, 36], "suppos": 2, "bs3": 2, "bs4": 2, "And": 2, "correspond": [2, 14, 44], "look": [2, 6, 11, 16, 44, 48, 49], "like": [2, 5, 6, 11, 16, 36, 44, 47, 48, 49], "process": [2, 5, 14, 15, 19, 24, 28, 34, 41, 44, 46, 48, 49], "raw": [2, 28, 34], "b0": 2, "c0": 2, "id1": 2, "11": [2, 5, 8], "id2": 2, "id3": 2, "13": [2, 5, 46], "id4": 2, "14": [2, 5, 46], "15": [2, 5], "sinc": [2, 5, 13, 15, 16, 34, 44, 48], "choos": [2, 15, 47, 49], "move": [2, 5, 13, 34], "onli": [2, 6, 15, 19, 20, 34, 41, 44, 45, 48], "deactiv": 2, "secondari": 2, "true": [2, 4, 5, 13, 19, 20, 22, 24, 28, 34, 36, 39, 44], "bs5": 2, "cb1": 2, "decid": [2, 13, 14, 28], "fals": [2, 5, 13, 18, 19, 20, 24, 28, 29, 34, 36, 44], "after": [2, 3, 4, 5, 6, 11, 15, 16, 19, 24, 34, 41, 47], "bs6": 2, "even": [2, 12, 15, 22, 48], "though": [2, 15, 22, 48], "normal": [2, 5, 15, 16, 22, 28, 34, 48], "its": [2, 11, 12, 15], "anytim": 2, "unmatch": 2, "leaf": 2, "conceptu": 2, "sometim": 2, "devil": 2, "detail": [2, 6, 15], "ad": [2, 15, 20, 22, 24, 28, 41], "least": [2, 15, 49], "consid": [2, 15, 22], "simpl": [2, 6, 11, 13, 15, 20, 34, 37, 41], "properti": [2, 3, 5, 6, 15, 16, 17, 19, 20, 22, 24, 28, 44], "id": [2, 5, 11, 16, 19, 20, 22, 24, 34, 36, 37, 41, 44, 48], "year": [2, 15, 20, 34, 41], "end": [2, 7, 10, 14, 34, 39], "floor": [2, 34], "area": [2, 20, 34], "address": [2, 5, 13, 16, 19, 20, 34, 41], "releas": [2, 6, 10, 11, 16, 34, 41], "date": [2, 20, 34, 44], "499045": 2, "2000": 2, "1234": [2, 5], "fake": [2, 16], "st": 2, "thing": [2, 44, 48], "upload": [2, 7, 10, 14], "see": [2, 4, 5, 7, 11, 13, 16, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 49], "success": [2, 11, 19, 41, 44], "dialog": 2, "73700": 2, "modifi": [2, 11, 16, 34], "timestamp": [2, 44], "Then": [2, 15, 48], "lot": [2, 15, 20, 34], "empti": [2, 5, 11, 34], "source_typ": [2, 34, 41, 44], "0": [2, 4, 5, 7, 8, 13, 20, 28, 34, 39, 41, 44, 46, 47], "column": [2, 10, 14, 16, 17, 28, 29, 44], "which": [2, 5, 11, 13, 15, 16, 22, 24, 28, 34, 44, 47, 48, 49], "content": [2, 6, 17, 41], "extra_data_sourc": 2, "popul": [2, 5], "e": [2, 4, 5, 11, 13, 16, 28, 34, 37, 44, 46, 47, 48, 49], "owner_postal_code_source_id": 2, "interest": [2, 34], "import_file_id": [2, 34], "refer": [2, 15, 16, 34], "data_importer_importfil": 2, "befor": [2, 6, 11, 15, 16, 20, 24, 41, 44, 47, 48], "hit": [2, 11], "continu": 2, "button": [2, 3, 49], "second": [2, 37], "73701": 2, "screen": [2, 16], "pm_property_id": [2, 20, 34], "year_end": [2, 20, 34], "gross_floor_area": [2, 20, 34], "address_line_1": [2, 20, 34], "release_d": [2, 20, 34], "That": [2, 15], "now": [2, 11, 19, 28, 48, 49], "same": [2, 5, 7, 10, 11, 15, 16, 28, 34, 37, 41, 44, 48], "next": [2, 15, 28], "2001": 2, "As": [2, 15, 49], "73702": 2, "pattern": [2, 44], "similarli": 2, "73703": 2, "appear": [2, 5, 44, 47], "howev": [2, 4, 5, 12, 16, 20, 44], "abl": [2, 11, 41], "make": [2, 5, 6, 7, 11, 15, 16, 18, 34, 41, 47, 48, 49], "confirm": [2, 41], "73704": 2, "ident": 2, "term": 2, "except": [2, 20, 24, 34, 36, 41, 45], "differ": [2, 5, 9, 11, 13, 15, 20, 22, 28, 29, 41, 47, 48, 49], "confid": [2, 5, 28, 34, 41], "canonical_building_id": 2, "null": 2, "last_modified_by_id": 2, "landing_seedus": [2, 48], "address_line_1_source_id": 2, "gross_floor_area_source_id": 2, "pm_property_id_source_id": 2, "release_date_source_id": 2, "year_ending_source_id": 2, "summar": 2, "5": [2, 5, 8, 12, 20, 34], "were": [2, 5, 15, 16, 22, 34], "twice": [2, 15], "row": [2, 3, 16, 20], "step": [2, 5, 11, 13, 15, 16, 24, 48, 49], "20505": 2, "There": [2, 5, 11, 16, 49], "still": [2, 5, 48], "orgs_organ": 2, "filter": [2, 5, 19, 44], "get_build": 2, "membership": 2, "sourc": [2, 5, 7, 9, 10, 12, 16, 34, 47, 48, 49], "extend": [2, 19], "note": [2, 4, 6, 10, 13, 16, 19, 24, 34, 44, 47, 48, 49], "made": [2, 28], "input": 2, "none": [2, 5, 11, 19, 20, 24, 28, 34, 36, 37, 39, 41, 44], "itself": [2, 5], "so": [2, 5, 7, 14, 15, 16, 22, 28, 34, 44, 47, 49], "block": [2, 11, 34, 48], "number": [2, 5, 11, 15, 16, 19, 20, 34, 44, 45, 48], "block_number_source_id": 2, "unlik": [2, 11], "who": [2, 48], "block_numb": [2, 34], "nevertheless": 2, "year_built": [2, 20, 34, 41], "those": [2, 11, 15, 28, 34, 44], "street": 2, "usual": [2, 18, 48], "cannot": [2, 20, 34], "serv": 2, "storag": [2, 13, 16, 20, 24], "an_unknown_field": 2, "something_els": [2, 19], "some_buildingsnapshot_id": 2, "another_buildingsnapshot_id": 2, "truncat": 2, "too": [2, 49], "255": 2, "charact": 2, "jurisdiction_tax_lot_id": [2, 20, 34], "custom_id_1": [2, 20, 34], "ubid": [2, 34], "lot_numb": [2, 34], "district": [2, 34], "owner": [2, 12, 13, 15, 34, 41, 48], "owner_email": [2, 34], "owner_telephon": [2, 34], "owner_address": [2, 34, 41], "owner_city_st": [2, 34], "owner_postal_cod": [2, 34], "property_nam": [2, 34], "address_line_2": [2, 34], "citi": [2, 34], "postal_cod": [2, 34], "state_provinc": 2, "building_certif": [2, 34], "No": [2, 16], "store": [2, 5, 11, 20, 24, 34, 47], "run": [3, 4, 5, 6, 8, 11, 15, 16, 19, 45, 46, 49], "pair": [3, 10, 15, 16, 20, 41], "taxlot": [3, 5, 15, 16, 17, 19, 20, 49], "demand": 3, "select": [3, 5, 9, 11, 15, 24, 28, 41, 46], "inventori": [3, 29, 34], "page": [3, 4, 5, 10, 15, 19, 41, 48], "action": [3, 4, 5, 11, 15, 45], "defin": [3, 5, 14, 20, 24, 28, 34], "rule": [3, 15, 17, 20, 44], "broken": 3, "satisfi": 3, "notabl": 3, "when": [3, 5, 10, 11, 13, 14, 16, 19, 20, 24, 34, 41, 44, 45, 47, 48], "label": [3, 5, 15, 17, 20, 34, 44], "appli": [3, 5, 14, 20], "elabor": 3, "attach": [3, 48], "break": [3, 47], "doe": [3, 4, 5, 7, 10, 20, 29, 44, 48], "happen": [3, 10, 14, 15, 16], "due": [3, 5, 13, 47], "perform": [3, 4, 5, 7, 10, 16, 19, 45], "reason": [3, 15], "intend": [4, 48], "linux": [4, 6, 10, 47], "cloud": [4, 11], "aw": [4, 10, 48], "hardwar": 4, "offici": 4, "window": [4, 5, 8, 11], "product": [4, 5, 6, 12, 18, 47], "desir": [4, 5, 11, 13, 44, 48], "setup": [4, 5, 10, 19, 24, 41, 48], "prerequisit": [4, 8], "depend": [4, 5, 8, 11, 16], "javascript": [4, 5, 7, 8, 10], "configur": [4, 5, 8, 10, 16, 17, 20, 47], "cach": [4, 16, 19, 20, 34, 41, 48], "broker": [4, 48], "celeri": [4, 5, 16, 20, 36, 45, 47, 48], "background": 4, "task": [4, 17, 20, 22, 45, 48], "worker": [4, 45, 48], "initi": [4, 5, 15, 20, 24, 28, 41, 44, 46, 48], "web": [4, 5, 6, 7, 10, 14, 47], "environ": [4, 5, 11, 47, 48], "variabl": [4, 5, 11, 18, 37, 47, 48], "mail": 4, "servic": [4, 6, 11, 12, 16, 49], "deploi": [4, 5, 11, 16], "kubernet": [4, 10], "helm": [4, 10], "cluster": 4, "resourc": [4, 10], "through": [4, 5, 11, 12, 34, 49], "variou": [4, 5, 9, 16], "custom": [4, 5, 6, 16, 18, 20, 22, 28, 34], "webserv": [4, 47], "issu": [4, 5, 9, 10, 13, 16, 44, 47], "enabl": [4, 5, 9, 11, 20, 44, 48], "up": [4, 5, 11, 13, 15, 16, 20, 24, 41, 44, 47, 48, 49], "io": [4, 5, 6], "raven_config": 4, "sentry_js_dsn": [4, 11], "frontend": 4, "moment": [4, 13], "sentry_sdk": 4, "integr": [4, 10], "djangointegr": 4, "celeryintegr": 4, "init": [4, 48], "dsn": [4, 11], "ingest": 4, "job": 4, "traces_sample_r": 4, "captur": [4, 5, 15], "100": [4, 11, 20, 39], "transact": 4, "we": [4, 5, 11, 13, 14, 19, 34, 41, 44, 49], "adjust": [4, 49], "wish": 4, "associ": [4, 15, 20, 34], "assum": [4, 11, 24, 44, 46, 48], "mai": [4, 12, 15, 16, 34, 44, 47, 48], "send": [4, 11, 13, 19, 20, 24], "pii": 4, "send_default_pii": 4, "job_id": 4, "3": [5, 11, 12, 13, 15, 20, 34, 46, 47, 48], "beta": 5, "22": 5, "21": [5, 11], "20": 5, "19": 5, "17": 5, "16": [5, 13], "10": [5, 11, 13, 20, 44, 47], "7": [5, 46], "osx": [5, 8], "translat": [5, 10], "philosophi": 5, "style": [5, 44], "don": [5, 47], "t": [5, 15, 16, 34, 44, 47, 48], "crazi": 5, "indirect": [5, 12], "interpol": 5, "precommit": 5, "format": [5, 11, 16, 19, 20, 28, 34, 41, 49], "static": [5, 13, 16, 20, 34, 36], "verifi": [5, 6, 13, 49], "syntax": 5, "call": [5, 11, 14, 20, 24, 28, 34, 36, 41, 44, 48], "tox": 5, "begin": 5, "codebas": [5, 22], "benefit": [5, 7, 10], "elimin": 5, "accident": [5, 15], "mistak": 5, "prevent": [5, 15], "bug": 5, "well": [5, 7, 10, 16, 41, 44], "better": [5, 48, 49], "experi": 5, "exhaust": 5, "annot": 5, "function": [5, 7, 10, 11, 17, 19, 34, 37, 41, 44], "refactor": 5, "might": [5, 15, 18], "benefici": 5, "ambigu": [5, 15], "determin": [5, 34, 44], "ton": 5, "effort": 5, "built": [5, 20, 24, 34, 41], "collect": 5, "dict": [5, 19, 20, 28, 29, 34, 36, 41], "tupl": [5, 28, 34, 44], "capit": 5, "modul": [5, 10, 18, 41], "typeddict": 5, "notrequir": 5, "typing_extens": 5, "packag": [5, 8, 10, 11, 13, 17], "option": [5, 13, 19, 24, 34, 37, 44], "dictionari": [5, 20, 29, 34, 41], "common": [5, 6, 11], "gotcha": 5, "try": [5, 15, 28, 36, 41, 47], "class": [5, 19, 20, 22, 24, 28, 34, 36, 37, 39, 41, 44], "method": [5, 7, 10, 16, 19, 20, 22, 24, 28, 34, 36, 41, 44], "__future__": 5, "re": [5, 11, 15, 41, 46, 48, 49], "warn": [5, 20], "runtim": 5, "sure": [5, 6, 7, 11, 16, 34, 41, 47, 48], "wast": 5, "pleas": [5, 9], "checker": 5, "feel": 5, "free": 5, "throw": 5, "ignor": [5, 15, 34], "problemat": 5, "top": [5, 24, 34, 49], "ci": 5, "current": [5, 19, 20, 34, 45, 46, 49], "mypi": 5, "own": [5, 13, 15], "extens": [5, 16, 34, 46, 48], "vscode": 5, "pylanc": 5, "microsoft": 5, "pyright": 5, "typecheck": 5, "complic": 5, "mix": 5, "extra": [5, 29, 34], "propertyst": [5, 16, 17, 20, 29, 34], "taxlotst": [5, 16, 17, 20, 29, 34], "model": [5, 7, 10, 14, 16, 17, 29, 36, 44], "yet": 5, "database_column": [5, 34], "copar": [5, 34], "sql": [5, 34], "keep_field": 5, "makemigr": 5, "script": [5, 6, 16, 44, 48, 49], "new_db_field": 5, "def": [5, 19, 36], "forward": [5, 11, 20, 24, 34], "schema_editor": 5, "get_model": 5, "column_nam": [5, 16, 34, 41], "geocoding_confid": [5, 34], "table_nam": [5, 16, 20, 34], "display_nam": [5, 20, 34], "geocod": [5, 16, 34, 48], "column_descript": [5, 34], "data_typ": [5, 20, 34], "is_extra_data": [5, 16, 34], "count": [5, 34], "elif": 5, "col": [5, 28], "els": [5, 36], "than": [5, 11, 12, 15, 20, 28, 49], "0090_auto_20180425_1154": 5, "oper": 5, "runpython": 5, "unit": [5, 12, 16, 17, 20, 22, 34, 45], "fix": [5, 16], "failur": 5, "test_mapping_data": [5, 17], "test_kei": 5, "test_column": 5, "test_column_retrieve_schema": 5, "test_column_retrieve_db_field": 5, "workflow": [5, 9, 28], "toggl": 5, "mainten": 5, "mode": [5, 47, 48], "displai": [5, 15, 16, 34, 47], "api": [5, 7, 8, 9, 10, 14, 16, 17, 19, 24, 28, 41, 49], "exec": [5, 11, 16, 46, 47], "seed_web": [5, 47], "sh": [5, 6, 16, 48, 49], "off": [5, 44, 47], "angular": [5, 49], "delimit": 5, "thu": 5, "renam": [5, 34], "interpolateprovid": 5, "startsymbol": 5, "endsymbol": 5, "eas": [5, 11], "automat": [5, 15, 16, 49], "readthedoc": 5, "en": 5, "latest": [5, 11, 15, 46], "html": [5, 11, 13, 49], "xmlhttprequest": 5, "cooki": [5, 24], "x": [5, 6], "csrftoken": 5, "seed_app": 5, "statehelperprovid": 5, "urlrouterprovid": 5, "locationprovid": 5, "home": [5, 6, 34, 45], "templateurl": 5, "static_url": [5, 13], "control": [5, 16, 34, 49], "profile_control": 5, "resolv": [5, 6, 15], "auth_payload": 5, "auth_servic": 5, "q": [5, 13, 19], "user_servic": 5, "var": [5, 48], "get_organ": [5, 44], "is_author": 5, "requires_superus": 5, "user_profile_payload": 5, "get_user_profil": 5, "found": [5, 11, 15, 34, 48], "doc": [5, 11, 48], "djangoproject": 5, "topic": [5, 9], "standard": [5, 7, 12, 18], "logger": 5, "level": [5, 15, 18, 20, 41, 44], "describ": [5, 14, 15, 34, 47], "sever": [5, 16, 20], "debug": [5, 13], "low": [5, 16, 20, 34], "minor": 5, "problem": [5, 9], "major": [5, 49], "critic": 5, "written": [5, 7, 10, 12, 19], "do": [5, 11, 15, 16, 19, 28, 34, 44, 47, 48, 49], "hardcod": 5, "goal": [5, 15, 20, 34], "dynam": [5, 20, 24, 34], "espm": 5, "blob": [5, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "lib": [5, 10, 16, 17, 19, 38, 39, 44, 48], "pm": [5, 22, 28, 34], "brief": 5, "descript": [5, 18, 20, 34], "how": [5, 9, 10, 49], "drop": [5, 46], "distribut": [5, 12], "part": [5, 16, 28], "third": [5, 11, 13], "last": [5, 15], "span": 5, "multipl": [5, 7, 10, 15, 16, 34], "createus": [5, 13, 48], "seedus": [5, 9, 11, 13, 16, 17, 24, 46, 48], "IF": [5, 12], "NOT": [5, 12], "postgi": [5, 8, 13, 16, 46], "timescaledb": [5, 8, 13, 16, 46], "testorg": 5, "timescaledb_pre_restor": [5, 46], "previou": [5, 44], "pg_restor": [5, 46], "backup": [5, 6, 16, 24, 47], "prod": [5, 11, 13], "prod_20191203_000002": 5, "installed_vers": 5, "being": [5, 15, 19, 24, 44, 45, 47, 48], "default_vers": 5, "pg_available_extens": 5, "timescaledb_post_restor": [5, 46], "disabl": 5, "celerybeat": 5, "salesforc": [5, 19], "domain": [5, 19], "dev1": 5, "salesforce_en": 5, "periodictask": 5, "name__startswith": 5, "salesforce_sync_org": 5, "update_chang": 5, "jasmin": [5, 45], "angular_js_test": [5, 45], "vcr": 5, "cassett": 5, "reus": 5, "respons": [5, 6, 10, 19, 24], "unless": [5, 44, 47], "want": [5, 11, 16, 24, 34, 47, 48], "refresh": 5, "isn": 5, "anyth": [5, 7], "logic": [5, 34], "mapquest": [5, 8, 16], "work": [5, 6, 7, 10, 11, 12, 13, 16, 44, 47, 48], "ll": [5, 47, 49], "small": [5, 19], "testing_mapquest_api_kei": 5, "actual": [5, 15, 41], "just": [5, 11, 15, 24, 34, 37, 47, 48, 49], "delet": [5, 16, 20, 22, 34], "old": [5, 6, 15, 16, 34], "ones": [5, 16, 22], "vcr_cassett": 5, "hidden": 5, "push": [5, 49], "coverag": 5, "report": [5, 9, 34, 41], "under": [5, 48, 49], "83": 5, "eslint": 5, "scss": 5, "stylelint": 5, "prettier": 5, "lint": 5, "older": [5, 16, 47], "websit": [5, 9, 11, 13, 48, 49], "rm": [5, 6, 16, 46], "rf": [5, 16], "htmlout": 5, "sphinx": 5, "b": [5, 15, 28, 41, 44], "code_document": 5, "new_vers": 5, "developer_resourc": 5, "md": [5, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "outsid": 5, "nation": [5, 7, 10, 12], "lab": 5, "review": [5, 9, 49], "fill": [5, 6, 9, 34, 49], "agreement": 5, "fork": 5, "otherwis": [5, 6, 12], "ensur": [5, 11, 20, 24, 34, 44], "ticket": 5, "assign": [5, 19, 34], "board": 5, "progress": [5, 19, 20, 41, 49], "tracker": 5, "branch": [5, 19], "hotfix": 5, "appropri": [5, 6, 44, 47], "convent": 5, "issue_id": 5, "short": [5, 6, 24], "write": [5, 15, 44], "upon": [5, 16], "complet": [5, 15, 16], "pull": [5, 11, 49], "pr": [5, 16], "against": [5, 19, 20, 44], "auto": [5, 10, 49], "featur": [5, 9, 10, 15, 17, 19, 24, 49], "donotpublish": 5, "present": [5, 34, 44], "enhanc": 5, "improv": [5, 7, 10], "publish": [5, 11], "onc": [5, 11, 13, 14, 15, 19, 46, 47, 49], "approv": [5, 12], "readi": [5, 11, 13, 48], "prepar": [5, 16], "prep": 5, "root": [5, 11, 16, 34, 41, 48], "alwai": [5, 15, 34], "rst": 5, "draft": 5, "changelog": 5, "cleanup": [5, 22, 34], "spell": 5, "correct": [5, 11, 16, 19, 34], "letter": 5, "miss": [5, 20, 34], "ui": [5, 11, 14, 34, 49], "lokalis": [5, 49], "main": [5, 9, 11, 14, 17, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 48], "hub": 5, "seedplatform": [5, 6, 11], "amazon": [6, 11, 13], "m5ad": 6, "xlarg": 6, "launch": [6, 11], "remov": [6, 11, 16, 20, 28, 34, 47], "containerd": 6, "runc": 6, "commun": [6, 9, 16], "edit": [6, 15, 48], "transport": 6, "ca": 6, "certif": [6, 34, 41], "gnupg": 6, "agent": 6, "softwar": [6, 7, 10, 12], "fssl": 6, "download": [6, 11, 48], "gpg": 6, "deb": 6, "arch": 6, "amd64": 6, "lsb_releas": 6, "stabl": 6, "ce": 6, "cli": [6, 49], "group": [6, 7, 10, 15, 24], "groupadd": 6, "usermod": 6, "ag": [6, 16], "newgrp": 6, "dn": [6, 13], "correctli": [6, 20, 34], "ip": 6, "v6": 6, "getent": 6, "tutum": 6, "dnsutil": 6, "nslookup": 6, "west": [6, 11], "compos": [6, 16, 47], "25": 6, "unam": 6, "m": 6, "o": [6, 36], "usr": [6, 13, 16, 48], "bin": [6, 13, 16, 48], "chmod": 6, "checkout": [6, 16, 48], "export": [6, 13, 17, 19, 48], "postgres_us": [6, 11, 46], "postgres_db": [6, 11, 46], "postgres_password": [6, 11, 46], "gdeus3fasd1askj89qkaldjfx": 6, "postgres_port": [6, 11], "5432": [6, 11, 13, 16, 48], "secret_kei": [6, 11], "96": 6, "7jg": 6, "_": 6, "z9c9qwwu2": 6, "w": 6, "hb3r322yf3lz": 6, "ekw": 6, "ly": 6, "until": [6, 11, 47], "restor": [6, 10, 48], "seed_admin_us": [6, 11], "seed_admin_password": [6, 11], "7febwal38": 6, "k3jlfa92lakj8ih4": 6, "seed_admin_org": [6, 11], "aws_access_key_id": [6, 11], "aws_access_kei": 6, "aws_secret_access_kei": [6, 11], "aws_secret_kei": 6, "aws_ses_region_nam": [6, 11], "aws_ses_region_endpoint": [6, 11], "server_email": [6, 11], "persist": [6, 15, 34], "volum": [6, 11, 22, 47], "seed_pgdata": [6, 47], "seed_media": [6, 47], "mkdir": [6, 48], "p": [6, 13, 48], "path": [6, 19, 24, 34, 41, 48], "dir": 6, "wai": [6, 11, 12, 13, 48, 49], "swarm": 6, "stack": 6, "implement": [6, 7, 10, 20, 24, 34, 36, 41], "simpli": [6, 16, 20], "yml": [6, 11, 16, 47, 49], "filenam": [6, 34], "bash": [6, 11, 46], "replac": [6, 11, 13, 16, 18, 48], "energi": [7, 9, 12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "effici": [7, 12, 34], "help": [7, 10, 16, 47, 48], "easili": [7, 10, 16, 19, 28], "larg": [7, 10, 11], "combin": [7, 10, 15, 18, 48], "clean": [7, 10, 16, 34, 44], "share": [7, 10, 16, 19, 46], "easi": [7, 10, 11, 13, 48], "flexibl": [7, 10], "cost": [7, 10], "effect": [7, 10, 16], "demonstr": [7, 10], "econom": [7, 10], "environment": [7, 10], "program": [7, 10, 12, 15], "target": [7, 10, 15, 48], "invest": [7, 10], "angularj": [7, 10, 45], "bootstrap": [7, 10, 48], "front": [7, 10], "back": [7, 10, 14, 48], "browser": [7, 10, 48, 49], "interfac": [7, 10, 11], "full": [7, 10, 22, 34], "renew": [7, 10], "laboratori": [7, 10, 12], "fund": [7, 10], "depart": [7, 10, 12], "newdomain": 7, "staticfiles_storag": [7, 16], "comment": [7, 34, 48], "redeploi": 7, "recollect": 7, "compress": 7, "nodej": [8, 13], "nativ": [8, 11, 16, 49], "tutori": 9, "learn": 9, "forum": 9, "announc": 9, "question": [9, 10, 34], "buildingenergytool": 9, "inquiri": 9, "specif": [9, 12, 13, 15, 20, 22, 34], "tool": [9, 11, 49], "desk": 9, "relev": 9, "buildingdata": 9, "gov": [9, 28, 29], "open": [9, 16, 46, 47, 48], "compon": 9, "client": [9, 14, 41, 44], "dataset": [9, 41], "encourag": 9, "seeddevelop": 9, "guid": 10, "monitor": [10, 11], "authent": [10, 13, 44, 45], "payload": 10, "children": [10, 20, 24, 34], "v": [10, 41, 44, 46], "what": [10, 11, 13, 34, 47, 48], "realli": [10, 15], "buildingsnapshot": 10, "canonicalbuild": 10, "_source_id": 10, "field": [10, 15, 16, 19, 20, 24, 28, 29, 34, 36, 44, 48], "extra_data": [10, 20, 34, 44], "possibl": [10, 12, 15, 22, 29], "loss": [10, 12], "why": 10, "depth": 10, "land": [10, 17, 19], "public": [10, 17, 34], "serial": [10, 17, 44], "test": [10, 13, 16, 17, 19, 22, 31, 45, 48], "util": [10, 16, 17, 24], "nginx": [10, 13], "log": [10, 19, 34, 41, 44, 47, 48, 49], "bede": [10, 17], "complianc": 10, "reset": [10, 19, 20, 24, 47], "contribut": 10, "best": [10, 15], "practic": 10, "licens": [10, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "ask": 10, "index": [10, 13], "robust": 11, "orchestr": 11, "further": 11, "choic": 11, "slightli": 11, "provis": 11, "googl": [11, 49], "gcp": 11, "azur": 11, "ak": 11, "userguid": 11, "cliv2": 11, "insert": [11, 34, 47], "secret": [11, 47, 48], "region": [11, 13], "east": [11, 13, 34], "output": [11, 47], "mac": [11, 47, 48], "homebrew": [11, 48], "brew": [11, 16, 48, 49], "did": [11, 20], "properli": [11, 41], "pod": 11, "replicaset": 11, "unfamiliar": 11, "gui": 11, "One": 11, "dashboard": 11, "parti": [11, 12, 13], "octant": 11, "eksctl": 11, "elast": 11, "disregard": 11, "eksct": 11, "termin": [11, 48], "adequ": 11, "permiss": [11, 12, 24], "bracket": 11, "m5": 11, "min": [11, 20, 28], "tag": [11, 37, 49], "env": [11, 47, 48], "persistentvolum": 11, "media": [11, 24, 47], "access_key_id": 11, "secret_access_kei": 11, "django_settings_modul": [11, 13, 48], "super": [11, 44, 47, 48], "yaml": [11, 19], "bsyncr": 11, "analysi": [11, 15], "bsyncr_server_port": 11, "5000": [11, 16], "bsyncr_server_host": 11, "sentri": 11, "sentry_raven_dsn": 11, "self": [11, 19, 24, 28, 34, 36, 44, 45], "registr": 11, "secur": 11, "google_recaptcha_site_kei": 11, "recaptcha": 11, "google_recaptcha_secret_kei": 11, "imag": [11, 46, 47], "noaa": 11, "noaa_token": 11, "context": [11, 17, 37, 45], "onlin": 11, "status": 11, "extern": 11, "ingress": 11, "someth": [11, 47, 48], "loadbalanc": 11, "154": 11, "227": 11, "my": [11, 13, 48], "uniqu": [11, 16, 34], "32291": 11, "tcp": 11, "dedeploi": 11, "find": [11, 15, 20, 34, 48], "talk": 11, "kubeconfig": 11, "yourself": [11, 47, 48], "seedorg": [11, 48], "badpass": [11, 13, 48], "restart": [11, 13, 16, 24, 47, 48], "rollout": 11, "copyright": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "2017": 12, "2024": [12, 20], "allianc": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "sustain": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "llc": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "contributor": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "right": [12, 29, 49], "reserv": [12, 45], "redistribut": 12, "binari": 12, "modif": [12, 19], "permit": 12, "condit": [12, 20, 34], "met": 12, "retain": [12, 34], "notic": 12, "disclaim": 12, "reproduc": 12, "materi": 12, "neither": 12, "holder": [12, 41], "nor": 12, "endors": 12, "promot": [12, 34], "deriv": [12, 34], "prior": 12, "claus": 12, "trademark": 12, "confusingli": 12, "similar": [12, 13, 34], "design": 12, "govern": 12, "employe": 12, "respect": [12, 34], "BY": 12, "THE": 12, "AND": 12, "AS": 12, "express": [12, 49], "OR": [12, 44], "impli": 12, "warranti": 12, "BUT": 12, "limit": 12, "TO": [12, 13, 48], "OF": 12, "merchant": 12, "fit": 12, "FOR": 12, "particular": [12, 14, 15, 24, 34], "IN": 12, "NO": 12, "event": [12, 15, 34], "shall": 12, "THEIR": 12, "BE": 12, "liabl": 12, "direct": 12, "incident": 12, "special": [12, 16, 34], "exemplari": 12, "consequenti": 12, "damag": 12, "procur": 12, "substitut": 12, "good": [12, 41], "profit": 12, "busi": 12, "interrupt": 12, "ON": [12, 13, 48], "theori": 12, "liabil": 12, "contract": 12, "strict": 12, "tort": 12, "neglig": 12, "aris": 12, "advis": 12, "SUCH": 12, "2014": 12, "regent": 12, "univers": 12, "california": 12, "lawrenc": 12, "berkelei": 12, "subject": [12, 24], "receipt": 12, "dept": 12, "thereof": 12, "while": [13, 15, 47], "bare": 13, "bone": 13, "counterpart": 13, "desktop": [13, 47], "ppa": [13, 16], "timescal": [13, 16, 46, 48], "python3": [13, 48], "gdal": 13, "seeddb": [13, 16, 48], "seedpass": [13, 16, 48], "prompt": [13, 48], "tune": [13, 16], "su": [13, 48], "grant": [13, 48], "privileg": [13, 48], "alter": [13, 46, 48], "createrol": 13, "exit": [13, 48], "pip3": [13, 16], "gi": [13, 16, 48], "localhost": [13, 16, 48], "could": [13, 16, 18, 28, 36, 47, 48], "mysql": 13, "dbshell": 13, "127": [13, 16, 41, 47, 48], "lbnl": 13, "Of": [13, 48], "cours": [13, 48], "somewher": [13, 48], "8000": [13, 48], "runserv": [13, 18, 48], "sit": 13, "behind": [13, 16], "dj": 13, "collectstat": 13, "lock": [13, 19, 41], "node_modul": 13, "openlay": 13, "ext": 13, "static_root": 13, "collected_stat": 13, "dedic": 13, "receiv": [13, 34, 41], "bashrc": [13, 48], "overrid": [13, 22, 34, 44], "sentry_dsn": 13, "xyz": 13, "getsentri": 13, "123": 13, "only_http": 13, "email_backend": 13, "django_s": 13, "sesbackend": 13, "consol": [13, 49], "quickstart": 13, "sandbox": 13, "sender": [13, 34], "recipi": 13, "notif": 13, "sn": 13, "notifi": 13, "bounc": 13, "dkim": 13, "spf": 13, "put": [13, 34, 48, 49], "compat": [13, 20], "gmail": 13, "emailbackend": 13, "domain_urlconf": 13, "down": [14, 44, 47], "overview": 14, "batch": 14, "invok": 14, "save_raw_data": 14, "done": [14, 19, 44, 48, 49], "know": [14, 15], "portfolio": [14, 22, 28], "metadata": 14, "data_import": [14, 22], "dataimportbackend": 14, "upload_complet": 14, "attribut": [14, 29, 44], "importfil": [14, 22, 44], "subsequ": [14, 15], "exactli": 14, "space": [14, 24, 34], "uppercas": 14, "relationship": [15, 34, 44], "between": [15, 24, 47, 48], "tax": [15, 20, 34], "thei": [15, 20, 28, 34, 45, 48], "criteria": 15, "customiz": 15, "high": [15, 20, 34], "identifi": [15, 16, 20], "represent": [15, 19], "discard": 15, "phone": 15, "shouldn": [15, 16], "much": [15, 41, 48], "whenev": 15, "execut": [15, 20, 24, 34, 45], "few": [15, 49], "unrel": 15, "scope": 15, "scenario": [15, 34], "exclud": [15, 19, 20, 22, 34], "overlap": 15, "prioriti": [15, 29, 34], "final": [15, 16, 28], "give": [15, 48], "protect": [15, 44], "period": [15, 34], "meter": [15, 16, 17, 22, 34], "mean": 15, "aggreg": 15, "altern": 15, "themselv": [15, 49], "mention": 15, "earlier": 15, "assumpt": 15, "avoid": [15, 48, 49], "unresolv": 15, "situat": [15, 47], "wouldn": 15, "cross": 15, "alreadi": [15, 16, 34, 48], "individu": 15, "explicit": 15, "trigger": [15, 47], "explicitli": 15, "chosen": 15, "incom": 15, "whole": [15, 18, 49], "round": 15, "origin": [15, 34], "establish": 15, "reestablish": 15, "commit": [15, 49], "affect": 15, "difficult": 15, "revers": [15, 20, 24, 34], "tri": 15, "unmerg": 15, "unlink": 15, "intervent": 15, "accomplish": 15, "veri": [15, 16, 34], "fact": 15, "lead": 15, "carri": 15, "consider": [15, 22], "taken": [15, 19, 22], "entri": [15, 19], "anoth": [15, 18], "oppos": 15, "amongst": 15, "duplic": [15, 16, 28, 34, 41, 48, 49], "flag": 15, "doesn": [15, 47], "bit": 16, "celery_result_backend": 16, "celery_task_default_queu": 16, "celery_task_queu": 16, "exchang": 16, "routing_kei": 16, "notat": 16, "protocol": 16, "censu": 16, "tract": 16, "disadvantag": 16, "around": [16, 44], "minut": 16, "across": [16, 19, 34], "gaug": 16, "impact": 16, "deprec": [16, 41], "often": 16, "aros": 16, "upsert": 16, "typic": [16, 20, 34], "seed_column": 16, "300": 16, "kbtu": [16, 20], "ft2": 16, "units_pint": [16, 34], "complex": 16, "column_id": [16, 34], "seed_columnmapping_": 16, "constraint": 16, "seed_columnmapping_column_raw": 16, "old_id": 16, "seed_columnmapping_column_map": 16, "encount": [16, 19], "0118_match_merge_link_all_org": 16, "reorder": 16, "118": 16, "recogn": 16, "cycl": [16, 17, 41], "fulli": [16, 24], "superperm": 16, "whole_org_match_merge_link": 16, "insid": [16, 41, 47], "seri": 16, "tap": [16, 49], "timescaledb_mov": 16, "awhil": 16, "recalcul": 16, "pars": [16, 19, 34], "bldg": [16, 34], "cast": [16, 34], "bytestr": 16, "On": 16, "indic": [16, 41], "postgres_container_id": 16, "operationalerror": 16, "bower": 16, "vendor": 16, "css": 16, "default_file_storag": 16, "filesystemstorag": 16, "sign": 16, "submodul": [17, 25, 38], "templat": [17, 34, 45, 48], "sentry_j": [17, 18], "session_kei": [17, 18], "de_camel_cas": [17, 18], "robots_txt": [17, 18], "wsgi": [17, 19], "inherit": 17, "comparisonerror": [17, 20], "dataqualitycheck": [17, 20], "dataqualitytypecasterror": [17, 20], "unitmismatcherror": [17, 20], "format_pint_viol": [17, 20], "notdeletedmanag": [17, 22], "kbtu_thermal_conversion_factor": [17, 22], "kgal_water_conversion_factor": [17, 22], "usage_point_id": [17, 22], "subpackag": [17, 41], "customcreateuserform": [17, 24], "loginform": [17, 24], "userlogintest": [17, 24], "customloginview": [17, 24], "account_activation_s": [17, 24], "create_account": [17, 24], "landing_pag": [17, 24], "password_reset": [17, 24], "password_reset_complet": [17, 24], "password_reset_confirm": [17, 24], "password_reset_don": [17, 24], "password_set": [17, 24], "signup": [17, 19, 24, 41], "mapper": [17, 19], "create_column_regex": [17, 28], "get_pm_map": [17, 28], "mapping_column": 17, "mappingcolumn": [17, 28], "sort_dupl": [17, 28], "mapping_data": 17, "test_mapp": 17, "test_mapping_column": 17, "get_attrs_with_map": [17, 29], "get_propertystate_attr": [17, 29], "get_state_attr": [17, 29], "get_state_to_state_tupl": [17, 29], "get_taxlotstate_attr": [17, 29], "merge_st": [17, 29, 34], "seed_map": [17, 19], "auditlog": 17, "columncasterror": [17, 34], "validate_model": [17, 34], "statuslabel": [17, 20, 34, 36], "propertyauditlog": [17, 34], "propertyview": [17, 20, 34], "propertyviewlabel": [17, 34], "post_save_properti": [17, 34], "post_save_property_st": [17, 34], "post_save_property_view": [17, 34], "pre_delete_st": [17, 34], "set_default_access_level_inst": [17, 34], "sync_latitude_longitude_and_long_lat": [17, 34], "taxlotauditlog": [17, 34], "taxlotview": [17, 20, 34], "post_save_taxlot_st": [17, 34], "post_save_taxlot_view": [17, 34], "templatetag": [17, 19], "helper": [17, 19, 28, 37, 41, 44], "decor": [17, 44], "drfendpointmixin": [17, 19], "ajax_request": [17, 19], "ajax_request_class": [17, 19], "decorator_to_mixin": [17, 19], "get_prog_kei": [17, 19], "lock_and_track": [17, 19], "require_organization_id": [17, 19], "require_organization_id_class": [17, 19], "require_organization_membership": [17, 19], "factori": [17, 38, 39, 41], "build_shared_buildings_org": [17, 19], "create_inventory_queryset": [17, 19], "get_inventory_fieldnam": [17, 19], "get_orgs_w_public_field": [17, 19], "inventory_search_filter_sort": [17, 19], "parse_bodi": [17, 19], "process_search_param": [17, 19], "search_inventori": [17, 19], "search_properti": [17, 19], "search_taxlot": [17, 19], "delete_organ": [17, 19], "invite_new_user_to_se": [17, 19], "send_salesforce_error_log": [17, 19], "signuptokengener": [17, 19], "celerydatetimeseri": [17, 36], "labelseri": [17, 36], "adminviewstest": [17, 19, 41], "classdecoratortest": [17, 19, 41], "requireorganizationidtest": [17, 19, 41], "testdecor": [17, 19, 41], "testerror": [17, 19, 41], "testtask": [17, 19, 41], "datasetpermissionstest": [17, 19, 41], "getdatasetsviewstest": [17, 19, 41], "importfileviewstest": [17, 19, 41], "inventoryviewtest": [17, 19, 41], "mainviewtest": [17, 19, 41], "testmcmview": [17, 19, 41], "accesslevelbasetestcas": [17, 19, 41], "assertdictsubsetmixin": [17, 19, 41], "datamappingbasetestcas": [17, 19, 41], "deletemodelstestcas": [17, 19, 41], "fakecli": [17, 19, 41], "fakerequest": [17, 19, 41], "apibypasscsrfmiddlewar": [17, 44], "orgcreatemixin": [17, 44], "orgcreateupdatemixin": [17, 44], "orgmixin": [17, 44], "orgquerysetmixin": [17, 44], "orgupdatemixin": [17, 44], "orgvalidatemixin": [17, 44], "orgvalid": [17, 44], "profileidmixin": [17, 44], "api_endpoint": [17, 44], "api_endpoint_class": [17, 44], "clean_api_regex": [17, 44], "drf_api_endpoint": [17, 44], "format_api_docstr": [17, 44], "get_all_url": [17, 44], "get_api_endpoint": [17, 44], "get_api_request_us": [17, 44], "get_org_id_from_valid": [17, 44], "rgetattr": [17, 44], "get_source_typ": [17, 44], "create_organ": [17, 44], "create_suborgan": [17, 44], "default_pm_map": [17, 44], "set_default_2fa_method": [17, 44], "convert_datestr": [17, 44], "convert_to_js_timestamp": [17, 44], "parse_datetim": [17, 44], "tm": [18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "template_context": 18, "expos": 18, "runfcgi": 18, "discov": 18, "wsgi_appl": 18, "sens": 18, "later": [18, 24, 28, 47], "deleg": [18, 20, 24, 34], "introduc": 18, "middlewar": [18, 44], "framework": [18, 44], "breadcrumb": 19, "breadcrumbnod": [19, 37], "render": [19, 24, 37, 49], "urlbreadcrumbnod": [19, 37], "breadcrumb_root": [19, 37], "breadcrumb_url": [19, 37], "breadcrumb_url_root": [19, 37], "create_crumb": [19, 37], "create_crumb_first": [19, 37], "factor": [19, 22, 38], "chomski": [19, 38, 39], "djangofunctionalfactori": [19, 38, 39], "invalid_test_cc_numb": [19, 38, 39], "rand_bool": [19, 38, 39], "rand_citi": [19, 38, 39], "rand_city_suffix": [19, 38, 39], "rand_curr": [19, 38, 39], "rand_dat": [19, 38, 39], "rand_domain": [19, 38, 39], "rand_email": [19, 38, 39], "rand_float": [19, 38, 39], "rand_int": [19, 38, 39], "rand_nam": [19, 38, 39], "rand_phon": [19, 38, 39], "rand_plant_nam": [19, 38, 39], "rand_str": [19, 38, 39], "rand_street_address": [19, 38, 39], "rand_street_suffix": [19, 38, 39], "test_cc_numb": [19, 38, 39], "valid_test_cc_numb": [19, 38, 39], "test_add_org": [19, 41], "test_add_org_dup": [19, 41], "test_add_owner_existing_org_to_non_root": [19, 41], "test_add_user_existing_org": [19, 41], "test_add_user_new_org": [19, 41], "test_add_user_no_org": [19, 41], "test_signup_process": [19, 41], "test_signup_process_force_lowercase_email": [19, 41], "test_ajax_request_class_dict": [19, 41], "test_ajax_request_class_dict_status_error": [19, 41], "test_ajax_request_class_dict_status_fals": [19, 41], "test_ajax_request_class_format_typ": [19, 41], "test_require_organization_id_class_no_org_id": [19, 41], "test_require_organization_id_class_org_id": [19, 41], "test_require_organization_id_class_org_id_not_int": [19, 41], "test_require_organization_id_fail_no_kei": [19, 41], "test_require_organization_id_fail_not_numer": [19, 41], "test_require_organization_id_success_integ": [19, 41], "test_require_organization_id_success_str": [19, 41], "pk": [19, 41, 44], "test_get_prog_kei": [19, 41], "test_increment_cach": [19, 41], "test_lock": [19, 41], "test_locking_w_except": [19, 41], "test_progress": [19, 41], "unlock": [19, 41], "test_delete_organ": [19, 41], "test_dataset_count": [19, 41], "test_dataset_cr": [19, 41], "test_dataset_destroi": [19, 41], "test_dataset_list": [19, 41], "test_dataset_retriev": [19, 41], "test_dataset_upd": [19, 41], "test_delete_dataset": [19, 41], "test_get_dataset": [19, 41], "test_get_datasets_count": [19, 41], "test_get_datasets_count_invalid": [19, 41], "test_update_dataset": [19, 41], "test_delete_fil": [19, 41], "test_get_import_fil": [19, 41], "test_get_matching_and_geocoding_result": [19, 41], "test_get_cycl": [19, 41], "test_get_properti": [19, 41], "test_get_properties_cycle_id": [19, 41], "test_get_properties_empty_pag": [19, 41], "test_get_properties_page_not_an_integ": [19, 41], "test_get_properties_pint_field": [19, 41], "test_get_properties_profile_id": [19, 41], "test_get_properties_property_extra_data": [19, 41], "test_get_properties_select_al": [19, 41], "test_get_properties_taxlot_extra_data": [19, 41], "test_get_properties_with_taxlot": [19, 41], "test_get_properties_with_taxlots_with_footprint": [19, 41], "test_get_properties_wrong_query_param": [19, 41], "test_get_property_column": [19, 41], "test_get_property_multiple_taxlot": [19, 41], "test_get_taxlot": [19, 41], "test_get_taxlot_column": [19, 41], "test_get_taxlots_empty_pag": [19, 41], "test_get_taxlots_extra_data": [19, 41], "test_get_taxlots_multiple_taxlot": [19, 41], "test_get_taxlots_no_cycle_id": [19, 41], "test_get_taxlots_page_not_an_integ": [19, 41], "test_get_taxlots_profile_id": [19, 41], "test_postoffic": [19, 41], "test_update_pint_fields_with_modified_display_set": [19, 41], "test_hom": [19, 41], "assert_expected_map": [19, 41], "expected_map": [19, 41], "raw_columns_expect": [19, 41], "test_create_dataset": [19, 41], "test_get_column_mapping_suggest": [19, 41], "test_get_column_mapping_suggestions_pm_fil": [19, 41], "test_get_column_mapping_suggestions_with_column": [19, 41], "test_get_raw_column_nam": [19, 41], "test_save_column_map": [19, 41], "test_save_column_mappings_idempot": [19, 41], "login_as_child_memb": [19, 41], "login_as_root_memb": [19, 41], "login_as_root_own": [19, 41], "assertdictcontainssubset": [19, 41], "create_import_fil": [19, 41], "set_up": [19, 41], "teardown": [19, 41], "meta": [19, 24, 36, 41], "bodi": [19, 41], "alia": [19, 24, 36, 44, 48], "mixin": [19, 44], "func": 19, "annoi": 19, "slash": 19, "serializ": [19, 36], "http_accept": 19, "my_view": 19, "news_titl": 19, "titl": [19, 37], "convert": [19, 44], "loginrequiredmixin": 19, "login_requir": [19, 44], "myview": 19, "someview": 19, "some_decor": 19, "func_nam": 19, "import_file_pk": 19, "fn": [19, 44], "arg": [19, 20, 22, 24, 34, 36, 44, 45], "kwarg": [19, 20, 22, 24, 34, 36, 41, 44, 45], "executor": 19, "int": [19, 28, 34, 44], "pertain": [19, 22], "sibl": 19, "inventory_typ": [19, 34, 49], "order_bi": 19, "other_org": 19, "cycle_id": [19, 34], "queryset": [19, 20, 22, 44], "inst": [19, 29, 34, 44], "str": [19, 34, 41, 44], "publicli": 19, "sort": [19, 28], "tax_lot_id": [19, 20], "sort_revers": 19, "bool": [19, 20, 28, 34, 44], "asc": 19, "dsc": 19, "pagin": 19, "number_per_pag": 19, "show_shared_build": [19, 24], "global": [19, 44, 48], "other_search_param": 19, "project_id": 19, "is_api_request": 19, "intern": 19, "boolean": [19, 20, 28, 34], "fieldnam": [19, 20, 44], "unicod": [19, 20], "org_pk": 19, "delete_organization_build": 19, "email_address": 19, "user_pk": 19, "first_nam": [19, 24], "invit": 19, "newli": 19, "default_token_gener": 19, "new_us": 19, "noth": 19, "sync": [19, 24], "aleck": 19, "landgraf": 19, "token_gener": 19, "master": [19, 24], "expir": 19, "three": 19, "dai": 19, "strategi": 19, "mechan": 19, "check_token": 19, "token_expir": 19, "make_token": 19, "data_qu": 20, "doesnotexist": [20, 24, 34], "objectdoesnotexist": [20, 24, 34], "multipleobjectsreturn": [20, 24, 34], "required_field": [20, 24], "add_goal_rule_label": 20, "add_invalid_geometry_entry_provid": 20, "row_id": 20, "add_result_comparison_error": 20, "rule_check": 20, "add_result_dimension_error": 20, "add_result_is_nul": 20, "add_result_max_error": 20, "rule_max": 20, "add_result_min_error": 20, "rule_min": 20, "add_result_missing_and_non": 20, "add_result_missing_req": 20, "add_result_range_error": 20, "add_result_string_error": 20, "add_result_type_error": 20, "add_rul": 20, "add_rule_if_new": 20, "cache_kei": 20, "check_data": 20, "record_typ": [20, 34], "check_data_cross_cycl": 20, "goal_id": [20, 34], "state_pair": 20, "goalnot": 20, "passed_check": 20, "baselin": 20, "get_fieldnam": 20, "get_valu": 20, "property_obj": 20, "cycle_kei": 20, "wrapper": [20, 24, 34], "defer": [20, 24, 34], "read": [20, 22, 24, 34], "init_result": 20, "initialize_cach": 20, "chunk": 20, "random": 20, "initialize_rul": 20, "accessor": [20, 24, 34], "side": [20, 24, 34, 49], "forwardonetoonedescriptor": [20, 24, 34], "subclass": [20, 22, 24, 34, 36], "foreignkei": [20, 24, 34], "related_nam": [20, 24, 34], "forwardmanytoonedescriptor": [20, 24, 34], "prune_result": 20, "remove_all_rul": 20, "remove_status_label": 20, "label_class": 20, "linked_id": 20, "rang": 20, "either": [20, 34, 41, 44, 47, 48, 49], "reset_all_rul": 20, "reiniti": 20, "reset_default_rul": 20, "reset_result": 20, "classmethod": [20, 24, 34, 39], "retriev": [20, 34, 41, 44], "previous": 20, "backward": 20, "obj": [20, 36, 44], "retrieve_result_by_address": 20, "retrieve_result_by_tax_lot_id": 20, "jurisdict": [20, 34], "reversemanytoonedescriptor": [20, 24, 34], "create_forward_many_to_many_manag": [20, 24, 34], "save_to_cach": 20, "rememb": 20, "update_status_label": 20, "add_to_result": 20, "default_rul": 20, "not_nul": 20, "rule_typ": 20, "conditioned_floor_area": [20, 34], "7000000": 20, "ft": 20, "energy_scor": [20, 34], "generation_d": [20, 34], "20241231": 20, "18890101": 20, "occupied_floor_area": [20, 34], "recent_sale_d": [20, 34], "site_eui": [20, 34], "site_eui_weather_norm": [20, 34], "source_eui": [20, 34], "source_eui_weather_norm": [20, 34], "1700": 20, "cross_cycl": 20, "40": 20, "1000000": 20, "rule_exclud": 20, "rule_includ": 20, "rule_not_nul": 20, "rule_rang": 20, "rule_requir": 20, "rule_type_custom": 20, "rule_type_default": 20, "severity_error": 20, "severity_valid": 20, "severity_warn": 20, "type_area": 20, "type_d": 20, "type_eui": 20, "type_numb": 20, "type_str": 20, "type_year": 20, "data_quality_check": 20, "data_quality_check_id": 20, "for_derived_column": 20, "format_str": 20, "get_data_type_displai": 20, "integerfield": [20, 34], "get_rule_type_displai": 20, "get_severity_displai": 20, "maximum_valid": 20, "greater": [20, 28, 48], "maximum": [20, 45], "minimum_valid": 20, "less": 20, "minimum": 20, "status_label": 20, "status_label_id": 20, "str_to_data_typ": 20, "therefor": 20, "definit": 20, "variant": 20, "text_match": 20, "valid_text": 20, "text": 20, "regex": [20, 28, 44], "source_valu": 20, "pint": 20, "violat": [20, 34], "human": [20, 44], "readabl": [20, 41, 44], "quantiti": 20, "formatted_valu": 20, "formatted_min": 20, "formatted_max": 20, "get_al": 22, "filesystem": [22, 46], "get_queryset": [22, 44], "behavior": 22, "use_for_related_field": 22, "countri": 22, "thermal": 22, "convers": 22, "nrel": [22, 28], "deduc": 22, "regard": 22, "align": 22, "thermal_conversion_assumpt": 22, "enum": 22, "concept": 22, "sole": 22, "irrespect": 22, "coutri": 22, "water": [22, 34], "www": 22, "kylesconvert": 22, "kilogallon": 22, "raw_source_id": 22, "extract": 22, "usag": 22, "greenbutton": 22, "uri": 22, "eula": [24, 25], "usercreationform": 24, "widget": 24, "emailinput": 24, "base_field": 24, "password1": 24, "charfield": [24, 34], "password2": 24, "emailfield": 24, "declared_field": 24, "auto_id": 24, "id_": 24, "prefix": [24, 44], "error_class": 24, "errorlist": 24, "label_suffix": 24, "empty_permit": 24, "field_ord": 24, "use_required_attribut": 24, "abstractbaseus": 24, "permissionsmixin": 24, "abstract": 24, "compliant": [24, 34], "username_field": 24, "analysis_set": 24, "columnmapping_set": 24, "cycle_set": 24, "date_join": 24, "deactivate_us": 24, "default_building_detail_custom_column": 24, "default_custom_column": 24, "default_organ": [24, 44], "default_organization_id": 24, "email_us": 24, "from_email": 24, "emaildevice_set": 24, "generate_kei": 24, "adapt": 24, "tastypi": 24, "toastdriven": 24, "l47": 24, "get_absolute_url": 24, "get_full_nam": 24, "plu": 24, "last_nam": 24, "get_next_by_date_join": 24, "datetimefield": [24, 34], "is_next": [24, 34], "get_previous_by_date_join": 24, "get_short_nam": 24, "greenassessmentpropertyauditlog_set": 24, "pizza": [24, 34], "manytomanyfield": [24, 34], "manytomanydescriptor": [24, 34], "importrecord_set": 24, "is_staff": 24, "logentry_set": 24, "modified_import_record": 24, "oauth2_provider_accesstoken": 24, "oauth2_provider_appl": 24, "oauth2_provider_gr": 24, "oauth2_provider_refreshtoken": 24, "usermanag": 24, "organizationuser_set": 24, "phonedevice_set": 24, "postofficeemail_set": 24, "postofficeemailtemplate_set": 24, "process_header_request": 24, "prompt_2fa": 24, "staticdevice_set": 24, "totpdevice_set": 24, "user_permiss": 24, "methodnam": [24, 41], "runtest": [24, 41], "testcas": [24, 41], "hook": [24, 34, 41], "fixtur": [24, 41], "exercis": [24, 41], "test_simple_login": 24, "happi": [24, 41], "loginview": 24, "dispatch": 24, "rout": 24, "argument": [24, 37], "httprequest": 24, "reach": 24, "wizard": 24, "handle_2fa_prompt": 24, "handle_auth": 24, "handle_token": 24, "devic": 24, "challeng": 24, "uidb64": 24, "dan": [28, 29], "gunter": [28, 29], "dkgunter": [28, 29], "lbl": [28, 29, 48], "raw_column": [28, 41], "sanit": 28, "raw_data": 28, "resolve_dupl": 28, "xlsx": 28, "attempt": 28, "from_field": 28, "nichola": 28, "dest_column": 28, "previous_map": 28, "map_arg": 28, "default_map": 28, "threshold": 28, "probabilist": 28, "unknown": 28, "mainli": 28, "build_column_map": 28, "add_map": 28, "potenti": 28, "preced": 28, "apply_threshold": 28, "suggest": 28, "meet": 28, "forc": [28, 34, 41, 44], "separ": [28, 36, 46, 47], "equal": 28, "final_map": 28, "downstream": 28, "raw_column_1": 28, "db_column_1": 28, "raw_column_2": 28, "first_suggested_map": 28, "grab": 28, "dup_map_field": 28, "highest": 28, "win": 28, "battl": 28, "set_initial_mapping_cmp": 28, "initial_mapping_cmp": 28, "hash": [28, 34], "detect": 28, "cmp": 28, "data_set_build": 29, "attr": 29, "state_list": 29, "merged_st": [29, 34], "state1": [29, 34], "state2": [29, 34], "ignore_merge_protect": 29, "favor": [29, 34], "column_exclude_field": 34, "bounding_box": 34, "centroid": 34, "data_st": [34, 41], "import_fil": [34, 44], "long_lat": 34, "raw_access_level_instance_error": 34, "raw_access_level_instance_id": 34, "hash_object": 34, "normalized_address": 34, "source_eui_modeled_orig": 34, "site_eui_orig": 34, "occupied_floor_area_orig": 34, "site_eui_weather_normalized_orig": 34, "site_eui_modeled_orig": 34, "source_eui_orig": 34, "gross_floor_area_orig": 34, "conditioned_floor_area_orig": 34, "source_eui_weather_normalized_orig": 34, "column_merge_favor_exist": 34, "column_merge_favor_new": 34, "column_merge_protect": 34, "pm_parent_property_id": 34, "jurisdiction_property_id": 34, "audit": [34, 41], "audit_template_building_id": 34, "postal": 34, "latitud": 34, "longitud": 34, "footprint": 34, "property_footprint": 34, "geometri": 34, "taxlot_footprint": 34, "datetim": [34, 44], "gross": 34, "use_descript": 34, "star": 34, "score": 34, "integ": 34, "property_not": 34, "property_typ": 34, "telephon": 34, "building_count": 34, "sale": 34, "occupi": 34, "home_energy_score_id": 34, "weather": 34, "site_eui_model": 34, "source_eui_model": 34, "alert": 34, "energy_alert": 34, "space_alert": 34, "number_properti": 34, "egrid": 34, "subregion": 34, "egrid_subregion_cod": 34, "total": [34, 45], "ghg": 34, "emiss": 34, "total_ghg_emiss": 34, "margin": 34, "total_marginal_ghg_emiss": 34, "intens": 34, "total_ghg_emissions_intens": 34, "ghg_intens": 34, "total_marginal_ghg_emissions_intens": 34, "zone": 34, "property_timezon": 34, "water_us": 34, "indoor": 34, "indoor_water_us": 34, "outdoor": 34, "outdoor_water_us": 34, "wui": 34, "indoor_wui": 34, "data_type_pars": 34, "callabl": 34, "lambda": 34, "fromisoformat": 34, "float": 34, "excluded_column_return_field": 34, "excluded_mapping_field": 34, "geocoded_address": 34, "geocoded_postal_cod": 34, "geocoded_side_of_street": 34, "geocoded_countri": 34, "geocoded_st": 34, "geocoded_counti": 34, "geocoded_c": 34, "geocoded_neighborhood": 34, "excluded_rename_from_field": 34, "excluded_rename_to_field": 34, "internal_type_to_data_typ": 34, "booleanfield": 34, "datefield": 34, "floatfield": 34, "doubl": [34, 44], "jsonfield": 34, "pointfield": 34, "polygonfield": 34, "textfield": 34, "pinned_column": 34, "quantity_unit_column": 34, "shared_field_typ": 34, "shared_non": 34, "shared_publ": 34, "unmappable_property_field": 34, "unmappable_taxlot_field": 34, "account_name_column": 34, "actual_emission_column": 34, "actual_energy_column": 34, "benchmark_id_column": 34, "cast_column_valu": 34, "column_data_typ": 34, "allow_non": 34, "rais": [34, 36, 44], "castexcept": 34, "wide": 34, "clean_field": 34, "validationerror": 34, "non_field_error": 34, "column_list_profil": 34, "columnlistprofilecolumn_set": 34, "comstock_map": 34, "contact_email_column": 34, "contact_name_column": 34, "create_map": 34, "arrai": 34, "columnmap": 34, "create_mappings_from_fil": 34, "absolut": 34, "data_admin_account_name_column": 34, "data_admin_email_column": 34, "data_admin_name_column": 34, "dataviewparameter_set": 34, "delete_al": 34, "invalid": 34, "irrevers": 34, "column_map": 34, "derived_column": 34, "restaur": 34, "onetoonefield": 34, "derived_column_id": 34, "derivedcolumn_set": 34, "derivedcolumnparameter_set": 34, "geocoding_ord": 34, "get_merge_protection_displai": 34, "merge_protect": 34, "get_next_by_cr": 34, "get_next_by_modifi": 34, "get_previous_by_cr": 34, "get_previous_by_modifi": 34, "get_shared_field_type_displai": 34, "goal_area_column": 34, "goal_eui_column1": 34, "goal_eui_column2": 34, "goal_eui_column3": 34, "is_matching_criteria": 34, "is_option_for_reports_x_axi": 34, "is_option_for_reports_y_axi": 34, "mapped_map": 34, "raw_map": 34, "recognize_empti": 34, "rename_column": 34, "new_column_nam": 34, "vice": 34, "versa": 34, "overwrit": [34, 47], "retrieve_al": 34, "org_id": [34, 44], "liter": 34, "only_us": 34, "include_rel": 34, "exclude_deriv": 34, "grid": 34, "retrieve_all_by_tupl": 34, "retrieve_db_field_name_for_hash_comparison": 34, "independ": 34, "md5": 34, "quickli": 34, "superset": [34, 41], "retrieve_db_field_table_and_names_from_db_t": 34, "retrieve_db_field": 34, "retrieve_db_fields_from_db_t": 34, "retrieve_db_typ": 34, "field_nam": 34, "field_name_2": 34, "data_type_2": 34, "retrieve_mapping_column": 34, "retrieve_prior": 34, "data_007": 34, "data_008": 34, "salesforce_column": 34, "force_insert": 34, "force_upd": 34, "insist": 34, "equival": [34, 44], "save_column_nam": 34, "model_obj": 34, "ever": [34, 44], "seen": [34, 47], "target_emission_column": 34, "target_energy_column": 34, "unit_id": 34, "x_axis_column": 34, "analysispropertyview_set": 34, "dataview_set": 34, "event_set": 34, "get_next_by_end": 34, "get_next_by_start": 34, "get_or_create_default": 34, "get_previous_by_end": 34, "get_previous_by_start": 34, "goal_baseline_cycl": 34, "goal_current_cycl": 34, "importfile_set": 34, "propertyview_set": 34, "taxlotproperty_set": 34, "taxlotview_set": 34, "user_id": 34, "color": [34, 36], "super_organ": [34, 36], "show_in_list": [34, 36], "timestampedmodel": 34, "blue_choic": 34, "blue": 34, "color_choic": 34, "red": 34, "light": [34, 41], "green": [34, 48], "white": 34, "orang": 34, "grai": 34, "default_label": 34, "residenti": 34, "exempt": 34, "ownership": 34, "gray_choic": 34, "green_choic": 34, "light_blue_choic": 34, "orange_choic": 34, "red_choic": 34, "white_choic": 34, "and_filter_group": 34, "compliance_label": 34, "exclude_filter_group": 34, "get_color_displai": 34, "django_extens": 34, "creationdatetimefield": 34, "modificationdatetimefield": 34, "indication_label": 34, "or_filter_group": 34, "propertyviewlabel_set": 34, "rule_set": 34, "super_organization_id": 34, "to_dict": 34, "violation_label": 34, "measur": 34, "decim": 34, "unit_typ": 34, "column_set": 34, "get_unit_type_displai": 34, "unit_nam": 34, "overtim": 34, "remain": [34, 48, 49], "unchang": 34, "access_level_inst": 34, "access_level_instance_id": 34, "copy_met": 34, "source_property_id": 34, "source_persist": 34, "aren": 34, "bulk": 34, "reassign": 34, "data_logg": 34, "element": [34, 49], "get_next_by_upd": 34, "get_previous_by_upd": 34, "goalnote_set": 34, "historical_not": 34, "reverseonetoonedescriptor": 34, "inventory_docu": 34, "parent_properti": 34, "parent_property_id": 34, "property_set": 34, "parent1": 34, "parent2": 34, "parent_state1": 34, "parent_state2": 34, "import_filenam": 34, "get_record_type_displai": 34, "parent1_id": 34, "parent2_id": 34, "parent_state1_id": 34, "parent_state2_id": 34, "propertyauditlog_parent1": 34, "propertyauditlog_parent2": 34, "state_id": 34, "view_id": 34, "pytz": 34, "timezon": [34, 44], "all_timezon": 34, "alaska": 34, "aleutian": 34, "arizona": 34, "central": 34, "indiana": 34, "eastern": 34, "hawaii": 34, "stark": 34, "michigan": 34, "mountain": 34, "pacif": 34, "samoa": 34, "analysispropertyview": 34, "building_fil": 34, "get_data_state_displai": 34, "get_merge_state_displai": 34, "get_source_type_displai": 34, "histori": 34, "measure_set": 34, "merge_relationship": 34, "property_id": 34, "propertyauditlog_st": 34, "propertymeasure_set": 34, "raw_access_level_inst": 34, "simul": [34, 41], "include_related_data": 34, "mask": 34, "ubidmodel_set": 34, "world": 34, "characterist": 34, "gapauditlog_view": 34, "greenassessmentproperty_set": 34, "initialize_audit_log": 34, "propertyauditlog_view": 34, "tax_lot_st": 34, "tax_lot_view": 34, "propertyview_id": 34, "statuslabel_id": 34, "ubidmodel": 34, "ahead": 34, "touch": 34, "ali": 34, "tax_lot": 34, "taxlotauditlog_parent1": 34, "taxlotauditlog_parent2": 34, "stub": [34, 41], "taxlotauditlog_parent_state1": 34, "taxlotauditlog_parent_state2": 34, "taxlotauditlog_st": 34, "property_st": 34, "property_view": 34, "taxlot_id": 34, "taxlotauditlog_view": 34, "skipkei": 36, "ensure_ascii": 36, "check_circular": 36, "allow_nan": 36, "sort_kei": 36, "indent": 36, "jsonencod": 36, "typeerror": 36, "iter": 36, "seed_decod": 36, "seed_dump": 36, "seed_load": 36, "modelseri": [36, 44], "extra_kwarg": 36, "write_onli": 36, "is_appli": 36, "get_is_appli": 36, "to_represent": 36, "primit": 36, "datatyp": 36, "bitbucket": 37, "mathiasdm": 37, "render_func": 37, "url_nod": 37, "parser": 37, "andrii": 37, "drozdyuk": 37, "url_var": 37, "context_var": 37, "just_context_var": 37, "crumb": 37, "produc": 37, "person_detail": 37, "person_url": 37, "person": 37, "test_help": 39, "start_year": 39, "1900": 39, "end_year": 39, "2011": 39, "length": 39, "test_admin_view": 41, "dupe": 41, "entir": [41, 44], "creation": 41, "test_decor": 41, "34": 41, "sum": 41, "increment": 41, "had": 41, "finish": [41, 46, 47], "counter": 41, "test_task": 41, "deal": 41, "test_view": 41, "k": 41, "dest_col": 41, "assert": 41, "70": 41, "air": 41, "leakag": 41, "64": 41, "47": 41, "50": 41, "create_dataset": 41, "get_raw_column_nam": 41, "save_column_map": 41, "member": 41, "subset": 41, "necessari": [41, 47], "polyfil": 41, "believ": 41, "compar": [41, 49], "import_file_source_typ": 41, "user_nam": 41, "test_us": 41, "user_password": 41, "test_pass": 41, "deconstruct": 41, "extrem": 41, "weight": 41, "view_func": 41, "remote_addr": 41, "fake_login_path": 41, "get_respons": 44, "turn": 44, "csrf": 44, "csrfviewmiddlewar": 44, "perform_cr": 44, "get_parent_org": 44, "return_obj": 44, "prove": 44, "orgfilt": 44, "nest": 44, "foreign_kei": 44, "force_par": 44, "perform_upd": 44, "org_valid": 44, "my_valid": 44, "myseri": 44, "primarykeyrelatedfield": 44, "query_set": 44, "mymodel": 44, "travers": 44, "underscor": 44, "property__org_id": 44, "validate_org": 44, "get_org_id": 44, "show": [44, 48], "get_show_column": 44, "profile_id": 44, "show_column": 44, "field_1": 44, "field_2": 44, "extra_data_field_1": 44, "extra_data_field_2": 44, "mark": 44, "has_perm": 44, "strip": 44, "todo": 44, "regist": [44, 48], "rest": 44, "is_api_endpoint": 44, "append": 44, "docstr": 44, "consumpt": 44, "urllist": 44, "recurs": 44, "yield": 44, "url_pattern": 44, "view_funct": 44, "examin": [44, 48], "getattr": 44, "deep": 44, "mimic": 44, "org__id": 44, "split": 44, "__": 44, "lst": 44, "immedi": 44, "org_nam": 44, "test_org": 44, "scratch": 44, "heavili": 44, "current_org": 44, "suborg_nam": 44, "user_rol": 44, "datestr": 44, "make_tz_awar": 44, "31": 44, "2010": 44, "utc": 44, "reconcil": 44, "mcm": 44, "cleaner": 44, "l85": 44, "millisecond": 44, "epoch": 44, "maybe_datetim": 44, "strftime": 44, "cover": 45, "celery_queu": 45, "queu": 45, "n": 45, "wait": [45, 47], "eta": 45, "countdown": 45, "maxconcurr": 45, "error404": 45, "error410": 45, "error500": 45, "health_check": 45, "health": 45, "sha": 45, "pg12": 46, "bind": 46, "mount": [46, 47], "seed_postgr": 46, "pg_dump": 46, "fc": 46, "f": [46, 47], "temporari": 46, "pg13": 46, "ts2": 46, "oss": 46, "WITH": [46, 48], "pg16": 46, "toolbox": 47, "concours": 47, "6038": 47, "Be": 47, "patient": 47, "successfulli": 47, "coupl": 47, "everyth": 47, "converg": 47, "overridden": 47, "forget": 47, "live": 47, "reload": 47, "docker_dev": 47, "probabl": [47, 49], "unfortun": 47, "seed_db_volum": 47, "seed_media_volum": 47, "folder": [47, 48], "switch": [47, 48], "seed_pgdata_prod": 47, "nocaptur": 47, "stdout": 47, "worth": 47, "_log": 47, "pdb": 47, "remot": 47, "remote_pdb": 47, "set_trac": 47, "breakpoint": 47, "remotepdb": 47, "session": 47, "41653": 47, "netcat": 47, "nc": 47, "machin": 48, "skip": 48, "virtualenv": 48, "conda": 48, "succe": 48, "forg": 48, "crfsuit": 48, "macport": 48, "graphviz": 48, "pyenv": 48, "although": 48, "easiest": 48, "pollut": 48, "easier": 48, "postgresql94": 48, "opt": 48, "defaultdb": 48, "chown": 48, "initdb": 48, "stop": 48, "alias": 48, "postactiv": 48, "pg_start": 48, "pg_ctl": 48, "pg_stop": 48, "launchag": 48, "whoami": 48, "postgis2": 48, "becom": 48, "remaind": 48, "maintain": 48, "compil": 48, "gcc": 48, "clang": 48, "cmake": 48, "openssl": 48, "dopenssl_root_dir": 48, "conf": 48, "uncom": [48, 49], "shared_preload_librari": 48, "config_fil": 48, "virtualenvwrapp": 48, "workon": 48, "cc": 48, "cp": 48, "favorit": 48, "editor": 48, "plan_purchas": 48, "business_edit": 48, "business_edition_fre": 48, "me": 48, "consum": 48, "directli": 48, "deadbeef": 48, "hard": 48, "statement": 48, "encapsul": 48, "stand": 48, "alon": 48, "foreground": 48, "seem": 48, "lokalise2": 49, "get_python_transl": 49, "get_angular_transl": 49, "usemissingtranslationhandlerlog": 49, "untransl": 49, "lokal": 49, "tl": 49, "dr": 49, "english": 49, "littl": 49, "care": 49, "held": 49, "languag": 49, "mo": 49, "suppli": 49, "sniff": 49, "accept": 49, "swap": 49, "dom": 49, "wherev": 49, "wrinkl": 49, "plural": 49, "flow": 49, "visibl": 49, "smooth": 49, "nice": 49, "speaker": 49, "screenshot": 49, "clarifi": 49, "phrase": 49, "placehold": 49, "fairli": 49, "straightforward": 49, "profession": 49, "mostli": 49, "visual": 49, "ok": 49, "french": 49, "german": 49, "wordi": 49, "rel": 49, "expand": 49, "oddli": 49, "err": 49, "clever": 49, "aim": 49, "compet": 49, "h2": 49, "include_shared_taxlot": 49, "include_shar": 49}, "objects": {"config": [[18, 0, 0, "-", "template_context"], [18, 0, 0, "-", "tests"], [18, 0, 0, "-", "utils"], [18, 0, 0, "-", "views"], [18, 0, 0, "-", "wsgi"]], "config.template_context": [[18, 1, 1, "", "sentry_js"], [18, 1, 1, "", "session_key"]], "config.utils": [[18, 1, 1, "", "de_camel_case"]], "config.views": [[18, 1, 1, "", "robots_txt"]], "": [[19, 0, 0, "-", "seed"]], "seed": [[22, 0, 0, "-", "data_importer"], [19, 0, 0, "-", "decorators"], [24, 0, 0, "-", "landing"], [27, 0, 0, "-", "lib"], [30, 0, 0, "-", "management"], [34, 0, 0, "-", "models"], [35, 0, 0, "-", "public"], [19, 0, 0, "-", "search"], [36, 0, 0, "-", "serializers"], [19, 0, 0, "-", "tasks"], [38, 0, 0, "-", "test_helpers"], [19, 0, 0, "-", "token_generators"], [19, 0, 0, "-", "utils"], [45, 0, 0, "-", "views"]], "seed.data_importer": [[22, 0, 0, "-", "managers"], [22, 0, 0, "-", "utils"]], "seed.data_importer.managers": [[22, 2, 1, "", "NotDeletedManager"]], "seed.data_importer.managers.NotDeletedManager": [[22, 3, 1, "", "get_all"], [22, 3, 1, "", "get_queryset"], [22, 4, 1, "", "use_for_related_fields"]], "seed.data_importer.utils": [[22, 1, 1, "", "kbtu_thermal_conversion_factors"], [22, 1, 1, "", "kgal_water_conversion_factors"], [22, 1, 1, "", "usage_point_id"]], "seed.decorators": [[19, 4, 1, "", "DRFEndpointMixin"], [19, 1, 1, "", "ajax_request"], [19, 1, 1, "", "ajax_request_class"], [19, 1, 1, "", "decorator_to_mixin"], [19, 1, 1, "", "get_prog_key"], [19, 1, 1, "", "lock_and_track"], [19, 1, 1, "", "require_organization_id"], [19, 1, 1, "", "require_organization_id_class"], [19, 1, 1, "", "require_organization_membership"]], "seed.landing": [[24, 0, 0, "-", "forms"], [25, 0, 0, "-", "management"], [24, 0, 0, "-", "models"], [24, 0, 0, "-", "tests"], [24, 0, 0, "-", "urls"], [24, 0, 0, "-", "views"]], "seed.landing.forms": [[24, 2, 1, "", "CustomCreateUserForm"], [24, 2, 1, "", "LoginForm"]], "seed.landing.forms.CustomCreateUserForm": [[24, 2, 1, "", "Meta"], [24, 4, 1, "", "base_fields"], [24, 4, 1, "", "declared_fields"], [24, 5, 1, "", "media"]], "seed.landing.forms.CustomCreateUserForm.Meta": [[24, 4, 1, "", "fields"], [24, 4, 1, "", "model"], [24, 4, 1, "", "widgets"]], "seed.landing.forms.LoginForm": [[24, 4, 1, "", "base_fields"], [24, 4, 1, "", "declared_fields"], [24, 5, 1, "", "media"]], "seed.landing.management": [[26, 0, 0, "-", "commands"]], "seed.landing.models": [[24, 2, 1, "", "SEEDUser"]], "seed.landing.models.SEEDUser": [[24, 6, 1, "", "DoesNotExist"], [24, 6, 1, "", "MultipleObjectsReturned"], [24, 4, 1, "", "REQUIRED_FIELDS"], [24, 4, 1, "", "USERNAME_FIELD"], [24, 4, 1, "", "analysis_set"], [24, 4, 1, "", "api_key"], [24, 4, 1, "", "columnmapping_set"], [24, 4, 1, "", "cycle_set"], [24, 4, 1, "", "date_joined"], [24, 3, 1, "", "deactivate_user"], [24, 4, 1, "", "default_building_detail_custom_columns"], [24, 4, 1, "", "default_custom_columns"], [24, 4, 1, "", "default_organization"], [24, 4, 1, "", "default_organization_id"], [24, 4, 1, "", "email"], [24, 3, 1, "", "email_user"], [24, 4, 1, "", "emaildevice_set"], [24, 4, 1, "", "first_name"], [24, 3, 1, "", "generate_key"], [24, 3, 1, "", "get_absolute_url"], [24, 3, 1, "", "get_full_name"], [24, 3, 1, "", "get_next_by_date_joined"], [24, 3, 1, "", "get_previous_by_date_joined"], [24, 3, 1, "", "get_short_name"], [24, 4, 1, "", "greenassessmentpropertyauditlog_set"], [24, 4, 1, "", "groups"], [24, 4, 1, "", "id"], [24, 4, 1, "", "importrecord_set"], [24, 4, 1, "", "is_staff"], [24, 4, 1, "", "last_name"], [24, 4, 1, "", "logentry_set"], [24, 4, 1, "", "modified_import_records"], [24, 4, 1, "", "notes"], [24, 4, 1, "", "oauth2_provider_accesstoken"], [24, 4, 1, "", "oauth2_provider_application"], [24, 4, 1, "", "oauth2_provider_grant"], [24, 4, 1, "", "oauth2_provider_refreshtoken"], [24, 4, 1, "", "objects"], [24, 4, 1, "", "organizationuser_set"], [24, 4, 1, "", "orgs"], [24, 4, 1, "", "phonedevice_set"], [24, 4, 1, "", "postofficeemail_set"], [24, 4, 1, "", "postofficeemailtemplate_set"], [24, 3, 1, "", "process_header_request"], [24, 4, 1, "", "prompt_2fa"], [24, 3, 1, "", "save"], [24, 4, 1, "", "show_shared_buildings"], [24, 4, 1, "", "staticdevice_set"], [24, 4, 1, "", "totpdevice_set"], [24, 4, 1, "", "user_permissions"], [24, 4, 1, "", "username"]], "seed.landing.tests": [[24, 2, 1, "", "UserLoginTest"]], "seed.landing.tests.UserLoginTest": [[24, 3, 1, "", "setUp"], [24, 3, 1, "", "test_simple_login"]], "seed.landing.views": [[24, 2, 1, "", "CustomLoginView"], [24, 1, 1, "", "account_activation_sent"], [24, 1, 1, "", "activate"], [24, 1, 1, "", "create_account"], [24, 1, 1, "", "landing_page"], [24, 1, 1, "", "password_reset"], [24, 1, 1, "", "password_reset_complete"], [24, 1, 1, "", "password_reset_confirm"], [24, 1, 1, "", "password_reset_done"], [24, 1, 1, "", "password_set"], [24, 1, 1, "", "signup"]], "seed.landing.views.CustomLoginView": [[24, 3, 1, "", "dispatch"], [24, 3, 1, "", "get"], [24, 3, 1, "", "handle_2fa_prompt"], [24, 3, 1, "", "handle_auth"], [24, 3, 1, "", "handle_token"], [24, 3, 1, "", "post"]], "seed.lib": [[28, 0, 0, "-", "mappings"], [29, 0, 0, "-", "merging"]], "seed.lib.mappings": [[28, 0, 0, "-", "mapper"], [28, 0, 0, "-", "mapping_columns"]], "seed.lib.mappings.mapper": [[28, 1, 1, "", "create_column_regexes"], [28, 1, 1, "", "get_pm_mapping"]], "seed.lib.mappings.mapping_columns": [[28, 2, 1, "", "MappingColumns"], [28, 1, 1, "", "sort_duplicates"]], "seed.lib.mappings.mapping_columns.MappingColumns": [[28, 3, 1, "", "add_mappings"], [28, 3, 1, "", "apply_threshold"], [28, 5, 1, "", "duplicates"], [28, 5, 1, "", "final_mappings"], [28, 3, 1, "", "first_suggested_mapping"], [28, 3, 1, "", "resolve_duplicate"], [28, 3, 1, "", "set_initial_mapping_cmp"]], "seed.lib.merging": [[29, 0, 0, "-", "merging"]], "seed.lib.merging.merging": [[29, 1, 1, "", "get_attrs_with_mapping"], [29, 1, 1, "", "get_propertystate_attrs"], [29, 1, 1, "", "get_state_attrs"], [29, 1, 1, "", "get_state_to_state_tuple"], [29, 1, 1, "", "get_taxlotstate_attrs"], [29, 1, 1, "", "merge_state"]], "seed.models": [[34, 0, 0, "-", "auditlog"], [34, 0, 0, "-", "columns"], [34, 0, 0, "-", "cycles"], [20, 0, 0, "-", "data_quality"], [34, 0, 0, "-", "models"], [34, 0, 0, "-", "properties"], [34, 0, 0, "-", "tax_lots"]], "seed.models.columns": [[34, 2, 1, "", "Column"], [34, 6, 1, "", "ColumnCastError"], [34, 1, 1, "", "validate_model"]], "seed.models.columns.Column": [[34, 4, 1, "", "COLUMN_EXCLUDE_FIELDS"], [34, 4, 1, "", "COLUMN_MERGE_FAVOR_EXISTING"], [34, 4, 1, "", "COLUMN_MERGE_FAVOR_NEW"], [34, 4, 1, "", "COLUMN_MERGE_PROTECTION"], [34, 4, 1, "", "DATABASE_COLUMNS"], [34, 4, 1, "", "DATA_TYPE_PARSERS"], [34, 6, 1, "", "DoesNotExist"], [34, 4, 1, "", "EXCLUDED_COLUMN_RETURN_FIELDS"], [34, 4, 1, "", "EXCLUDED_MAPPING_FIELDS"], [34, 4, 1, "", "EXCLUDED_RENAME_FROM_FIELDS"], [34, 4, 1, "", "EXCLUDED_RENAME_TO_FIELDS"], [34, 4, 1, "", "INTERNAL_TYPE_TO_DATA_TYPE"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "PINNED_COLUMNS"], [34, 4, 1, "", "QUANTITY_UNIT_COLUMNS"], [34, 4, 1, "", "SHARED_FIELD_TYPES"], [34, 4, 1, "", "SHARED_NONE"], [34, 4, 1, "", "SHARED_PUBLIC"], [34, 4, 1, "", "UNMAPPABLE_PROPERTY_FIELDS"], [34, 4, 1, "", "UNMAPPABLE_TAXLOT_FIELDS"], [34, 4, 1, "", "account_name_column"], [34, 4, 1, "", "actual_emission_column"], [34, 4, 1, "", "actual_energy_column"], [34, 4, 1, "", "benchmark_id_column"], [34, 3, 1, "", "cast"], [34, 3, 1, "", "cast_column_value"], [34, 3, 1, "", "clean"], [34, 4, 1, "", "column_description"], [34, 4, 1, "", "column_list_profiles"], [34, 4, 1, "", "column_name"], [34, 4, 1, "", "columnlistprofilecolumn_set"], [34, 4, 1, "", "comstock_mapping"], [34, 4, 1, "", "contact_email_column"], [34, 4, 1, "", "contact_name_column"], [34, 3, 1, "", "create_mappings"], [34, 3, 1, "", "create_mappings_from_file"], [34, 4, 1, "", "created"], [34, 4, 1, "", "data_admin_account_name_column"], [34, 4, 1, "", "data_admin_email_column"], [34, 4, 1, "", "data_admin_name_column"], [34, 4, 1, "", "data_type"], [34, 4, 1, "", "dataviewparameter_set"], [34, 3, 1, "", "delete_all"], [34, 4, 1, "", "derived_column"], [34, 4, 1, "", "derived_column_id"], [34, 4, 1, "", "derivedcolumn_set"], [34, 4, 1, "", "derivedcolumnparameter_set"], [34, 4, 1, "", "display_name"], [34, 4, 1, "", "geocoding_order"], [34, 3, 1, "", "get_merge_protection_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_modified"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_modified"], [34, 3, 1, "", "get_shared_field_type_display"], [34, 4, 1, "", "goal_area_columns"], [34, 4, 1, "", "goal_eui_column1s"], [34, 4, 1, "", "goal_eui_column2s"], [34, 4, 1, "", "goal_eui_column3s"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_file"], [34, 4, 1, "", "import_file_id"], [34, 4, 1, "", "is_extra_data"], [34, 4, 1, "", "is_matching_criteria"], [34, 4, 1, "", "is_option_for_reports_x_axis"], [34, 4, 1, "", "is_option_for_reports_y_axis"], [34, 4, 1, "", "mapped_mappings"], [34, 4, 1, "", "merge_protection"], [34, 4, 1, "", "modified"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "raw_mappings"], [34, 4, 1, "", "recognize_empty"], [34, 3, 1, "", "rename_column"], [34, 3, 1, "", "retrieve_all"], [34, 3, 1, "", "retrieve_all_by_tuple"], [34, 3, 1, "", "retrieve_db_field_name_for_hash_comparison"], [34, 3, 1, "", "retrieve_db_field_table_and_names_from_db_tables"], [34, 3, 1, "", "retrieve_db_fields"], [34, 3, 1, "", "retrieve_db_fields_from_db_tables"], [34, 3, 1, "", "retrieve_db_types"], [34, 3, 1, "", "retrieve_mapping_columns"], [34, 3, 1, "", "retrieve_priorities"], [34, 4, 1, "", "salesforce_column"], [34, 3, 1, "", "save"], [34, 3, 1, "", "save_column_names"], [34, 4, 1, "", "shared_field_type"], [34, 4, 1, "", "table_name"], [34, 4, 1, "", "target_emission_column"], [34, 4, 1, "", "target_energy_column"], [34, 4, 1, "", "unit"], [34, 4, 1, "", "unit_id"], [34, 4, 1, "", "units_pint"], [34, 4, 1, "", "x_axis_columns"]], "seed.models.cycles": [[34, 2, 1, "", "Cycle"]], "seed.models.cycles.Cycle": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "analysispropertyview_set"], [34, 4, 1, "", "created"], [34, 4, 1, "", "cycles"], [34, 4, 1, "", "dataview_set"], [34, 4, 1, "", "end"], [34, 4, 1, "", "event_set"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_end"], [34, 3, 1, "", "get_next_by_start"], [34, 3, 1, "", "get_or_create_default"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_end"], [34, 3, 1, "", "get_previous_by_start"], [34, 4, 1, "", "goal_baseline_cycles"], [34, 4, 1, "", "goal_current_cycles"], [34, 4, 1, "", "id"], [34, 4, 1, "", "importfile_set"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "propertyview_set"], [34, 4, 1, "", "start"], [34, 4, 1, "", "taxlotproperty_set"], [34, 4, 1, "", "taxlotview_set"], [34, 4, 1, "", "user"], [34, 4, 1, "", "user_id"]], "seed.models.data_quality": [[20, 6, 1, "", "ComparisonError"], [20, 2, 1, "", "DataQualityCheck"], [20, 6, 1, "", "DataQualityTypeCastError"], [20, 2, 1, "", "Rule"], [20, 6, 1, "", "UnitMismatchError"], [20, 1, 1, "", "format_pint_violation"]], "seed.models.data_quality.DataQualityCheck": [[20, 6, 1, "", "DoesNotExist"], [20, 6, 1, "", "MultipleObjectsReturned"], [20, 4, 1, "", "REQUIRED_FIELDS"], [20, 3, 1, "", "add_goal_rule_labels"], [20, 3, 1, "", "add_invalid_geometry_entry_provided"], [20, 3, 1, "", "add_result_comparison_error"], [20, 3, 1, "", "add_result_dimension_error"], [20, 3, 1, "", "add_result_is_null"], [20, 3, 1, "", "add_result_max_error"], [20, 3, 1, "", "add_result_min_error"], [20, 3, 1, "", "add_result_missing_and_none"], [20, 3, 1, "", "add_result_missing_req"], [20, 3, 1, "", "add_result_range_error"], [20, 3, 1, "", "add_result_string_error"], [20, 3, 1, "", "add_result_type_error"], [20, 3, 1, "", "add_rule"], [20, 3, 1, "", "add_rule_if_new"], [20, 3, 1, "", "cache_key"], [20, 3, 1, "", "check_data"], [20, 3, 1, "", "check_data_cross_cycle"], [20, 3, 1, "", "get_fieldnames"], [20, 3, 1, "", "get_value"], [20, 4, 1, "", "id"], [20, 3, 1, "", "init_result"], [20, 3, 1, "", "initialize_cache"], [20, 3, 1, "", "initialize_rules"], [20, 4, 1, "", "name"], [20, 4, 1, "", "objects"], [20, 4, 1, "", "organization"], [20, 4, 1, "", "organization_id"], [20, 3, 1, "", "prune_results"], [20, 3, 1, "", "remove_all_rules"], [20, 3, 1, "", "remove_status_label"], [20, 3, 1, "", "reset_all_rules"], [20, 3, 1, "", "reset_default_rules"], [20, 3, 1, "", "reset_results"], [20, 3, 1, "", "retrieve"], [20, 3, 1, "", "retrieve_result_by_address"], [20, 3, 1, "", "retrieve_result_by_tax_lot_id"], [20, 4, 1, "", "rules"], [20, 3, 1, "", "save_to_cache"], [20, 3, 1, "", "update_status_label"]], "seed.models.data_quality.Rule": [[20, 4, 1, "", "DATA_TYPES"], [20, 4, 1, "", "DEFAULT_RULES"], [20, 6, 1, "", "DoesNotExist"], [20, 6, 1, "", "MultipleObjectsReturned"], [20, 4, 1, "", "RULE_EXCLUDE"], [20, 4, 1, "", "RULE_INCLUDE"], [20, 4, 1, "", "RULE_NOT_NULL"], [20, 4, 1, "", "RULE_RANGE"], [20, 4, 1, "", "RULE_REQUIRED"], [20, 4, 1, "", "RULE_TYPE"], [20, 4, 1, "", "RULE_TYPE_CUSTOM"], [20, 4, 1, "", "RULE_TYPE_DEFAULT"], [20, 4, 1, "", "SEVERITY"], [20, 4, 1, "", "SEVERITY_ERROR"], [20, 4, 1, "", "SEVERITY_VALID"], [20, 4, 1, "", "SEVERITY_WARNING"], [20, 4, 1, "", "TYPE_AREA"], [20, 4, 1, "", "TYPE_DATE"], [20, 4, 1, "", "TYPE_EUI"], [20, 4, 1, "", "TYPE_NUMBER"], [20, 4, 1, "", "TYPE_STRING"], [20, 4, 1, "", "TYPE_YEAR"], [20, 4, 1, "", "condition"], [20, 4, 1, "", "cross_cycle"], [20, 4, 1, "", "data_quality_check"], [20, 4, 1, "", "data_quality_check_id"], [20, 4, 1, "", "data_type"], [20, 4, 1, "", "description"], [20, 4, 1, "", "enabled"], [20, 4, 1, "", "field"], [20, 4, 1, "", "for_derived_column"], [20, 3, 1, "", "format_strings"], [20, 3, 1, "", "get_data_type_display"], [20, 3, 1, "", "get_rule_type_display"], [20, 3, 1, "", "get_severity_display"], [20, 4, 1, "", "id"], [20, 4, 1, "", "max"], [20, 3, 1, "", "maximum_valid"], [20, 4, 1, "", "min"], [20, 3, 1, "", "minimum_valid"], [20, 4, 1, "", "name"], [20, 4, 1, "", "not_null"], [20, 4, 1, "", "objects"], [20, 4, 1, "", "required"], [20, 4, 1, "", "rule_type"], [20, 4, 1, "", "severity"], [20, 4, 1, "", "status_label"], [20, 4, 1, "", "status_label_id"], [20, 3, 1, "", "str_to_data_type"], [20, 4, 1, "", "table_name"], [20, 4, 1, "", "text_match"], [20, 4, 1, "", "units"], [20, 3, 1, "", "valid_text"]], "seed.models.models": [[34, 2, 1, "", "StatusLabel"], [34, 2, 1, "", "Unit"]], "seed.models.models.StatusLabel": [[34, 4, 1, "", "BLUE_CHOICE"], [34, 4, 1, "", "COLOR_CHOICES"], [34, 4, 1, "", "DEFAULT_LABELS"], [34, 6, 1, "", "DoesNotExist"], [34, 4, 1, "", "GRAY_CHOICE"], [34, 4, 1, "", "GREEN_CHOICE"], [34, 4, 1, "", "LIGHT_BLUE_CHOICE"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "ORANGE_CHOICE"], [34, 4, 1, "", "RED_CHOICE"], [34, 4, 1, "", "WHITE_CHOICE"], [34, 4, 1, "", "and_filter_groups"], [34, 4, 1, "", "color"], [34, 4, 1, "", "compliance_label"], [34, 4, 1, "", "exclude_filter_groups"], [34, 3, 1, "", "get_color_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_modified"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_modified"], [34, 4, 1, "", "id"], [34, 4, 1, "", "indication_label"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "or_filter_groups"], [34, 4, 1, "", "propertyview_set"], [34, 4, 1, "", "propertyviewlabel_set"], [34, 4, 1, "", "rule_set"], [34, 4, 1, "", "show_in_list"], [34, 4, 1, "", "super_organization"], [34, 4, 1, "", "super_organization_id"], [34, 4, 1, "", "taxlotview_set"], [34, 3, 1, "", "to_dict"], [34, 4, 1, "", "violation_label"]], "seed.models.models.Unit": [[34, 4, 1, "", "DATE"], [34, 4, 1, "", "DATETIME"], [34, 4, 1, "", "DECIMAL"], [34, 6, 1, "", "DoesNotExist"], [34, 4, 1, "", "FLOAT"], [34, 4, 1, "", "INTEGER"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "STRING"], [34, 4, 1, "", "UNIT_TYPES"], [34, 4, 1, "", "column_set"], [34, 3, 1, "", "get_unit_type_display"], [34, 4, 1, "", "id"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "unit_name"], [34, 4, 1, "", "unit_type"]], "seed.models.properties": [[34, 2, 1, "", "Property"], [34, 2, 1, "", "PropertyAuditLog"], [34, 2, 1, "", "PropertyState"], [34, 2, 1, "", "PropertyView"], [34, 2, 1, "", "PropertyViewLabel"], [34, 1, 1, "", "post_save_property"], [34, 1, 1, "", "post_save_property_state"], [34, 1, 1, "", "post_save_property_view"], [34, 1, 1, "", "pre_delete_state"], [34, 1, 1, "", "set_default_access_level_instance"], [34, 1, 1, "", "sync_latitude_longitude_and_long_lat"]], "seed.models.properties.Property": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "access_level_instance"], [34, 4, 1, "", "access_level_instance_id"], [34, 4, 1, "", "analysispropertyview_set"], [34, 3, 1, "", "copy_meters"], [34, 4, 1, "", "created"], [34, 4, 1, "", "data_loggers"], [34, 4, 1, "", "elements"], [34, 4, 1, "", "events"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 4, 1, "", "goalnote_set"], [34, 4, 1, "", "historical_note"], [34, 4, 1, "", "id"], [34, 4, 1, "", "inventory_documents"], [34, 4, 1, "", "meters"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "parent_property"], [34, 4, 1, "", "parent_property_id"], [34, 4, 1, "", "property_set"], [34, 4, 1, "", "updated"], [34, 4, 1, "", "views"]], "seed.models.properties.PropertyAuditLog": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "created"], [34, 4, 1, "", "description"], [34, 3, 1, "", "get_record_type_display"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_filename"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "parent1"], [34, 4, 1, "", "parent1_id"], [34, 4, 1, "", "parent2"], [34, 4, 1, "", "parent2_id"], [34, 4, 1, "", "parent_state1"], [34, 4, 1, "", "parent_state1_id"], [34, 4, 1, "", "parent_state2"], [34, 4, 1, "", "parent_state2_id"], [34, 4, 1, "", "propertyauditlog_parent1"], [34, 4, 1, "", "propertyauditlog_parent2"], [34, 4, 1, "", "record_type"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 4, 1, "", "view"], [34, 4, 1, "", "view_id"]], "seed.models.properties.PropertyState": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "address_line_1"], [34, 4, 1, "", "address_line_2"], [34, 4, 1, "", "analysispropertyview"], [34, 4, 1, "", "audit_template_building_id"], [34, 4, 1, "", "bounding_box"], [34, 4, 1, "", "building_certification"], [34, 4, 1, "", "building_count"], [34, 4, 1, "", "building_files"], [34, 4, 1, "", "centroid"], [34, 4, 1, "", "city"], [34, 3, 1, "", "clean"], [34, 4, 1, "", "conditioned_floor_area"], [34, 4, 1, "", "conditioned_floor_area_orig"], [34, 3, 1, "", "coparent"], [34, 4, 1, "", "created"], [34, 4, 1, "", "custom_id_1"], [34, 4, 1, "", "data_state"], [34, 4, 1, "", "egrid_subregion_code"], [34, 4, 1, "", "energy_alerts"], [34, 4, 1, "", "energy_score"], [34, 4, 1, "", "extra_data"], [34, 4, 1, "", "generation_date"], [34, 4, 1, "", "geocoding_confidence"], [34, 3, 1, "", "get_data_state_display"], [34, 3, 1, "", "get_merge_state_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 3, 1, "", "get_source_type_display"], [34, 4, 1, "", "gross_floor_area"], [34, 4, 1, "", "gross_floor_area_orig"], [34, 4, 1, "", "hash_object"], [34, 3, 1, "", "history"], [34, 4, 1, "", "home_energy_score_id"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_file"], [34, 4, 1, "", "import_file_id"], [34, 4, 1, "", "indoor_water_use"], [34, 4, 1, "", "indoor_wui"], [34, 4, 1, "", "jurisdiction_property_id"], [34, 4, 1, "", "latitude"], [34, 4, 1, "", "long_lat"], [34, 4, 1, "", "longitude"], [34, 4, 1, "", "lot_number"], [34, 4, 1, "", "measure_set"], [34, 4, 1, "", "measures"], [34, 3, 1, "", "merge_relationships"], [34, 4, 1, "", "merge_state"], [34, 4, 1, "", "normalized_address"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "occupied_floor_area"], [34, 4, 1, "", "occupied_floor_area_orig"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "outdoor_water_use"], [34, 4, 1, "", "owner"], [34, 4, 1, "", "owner_address"], [34, 4, 1, "", "owner_city_state"], [34, 4, 1, "", "owner_email"], [34, 4, 1, "", "owner_postal_code"], [34, 4, 1, "", "owner_telephone"], [34, 4, 1, "", "parent_state1"], [34, 4, 1, "", "parent_state2"], [34, 4, 1, "", "pm_parent_property_id"], [34, 4, 1, "", "pm_property_id"], [34, 4, 1, "", "postal_code"], [34, 3, 1, "", "promote"], [34, 4, 1, "", "property_footprint"], [34, 4, 1, "", "property_name"], [34, 4, 1, "", "property_notes"], [34, 4, 1, "", "property_timezone"], [34, 4, 1, "", "property_type"], [34, 4, 1, "", "propertyauditlog_state"], [34, 4, 1, "", "propertymeasure_set"], [34, 4, 1, "", "propertyview_set"], [34, 4, 1, "", "raw_access_level_instance"], [34, 4, 1, "", "raw_access_level_instance_error"], [34, 4, 1, "", "raw_access_level_instance_id"], [34, 4, 1, "", "recent_sale_date"], [34, 4, 1, "", "release_date"], [34, 3, 1, "", "save"], [34, 4, 1, "", "scenarios"], [34, 4, 1, "", "simulation"], [34, 4, 1, "", "site_eui"], [34, 4, 1, "", "site_eui_modeled"], [34, 4, 1, "", "site_eui_modeled_orig"], [34, 4, 1, "", "site_eui_orig"], [34, 4, 1, "", "site_eui_weather_normalized"], [34, 4, 1, "", "site_eui_weather_normalized_orig"], [34, 4, 1, "", "source_eui"], [34, 4, 1, "", "source_eui_modeled"], [34, 4, 1, "", "source_eui_modeled_orig"], [34, 4, 1, "", "source_eui_orig"], [34, 4, 1, "", "source_eui_weather_normalized"], [34, 4, 1, "", "source_eui_weather_normalized_orig"], [34, 4, 1, "", "source_type"], [34, 4, 1, "", "space_alerts"], [34, 4, 1, "", "state"], [34, 3, 1, "", "to_dict"], [34, 4, 1, "", "total_ghg_emissions"], [34, 4, 1, "", "total_ghg_emissions_intensity"], [34, 4, 1, "", "total_marginal_ghg_emissions"], [34, 4, 1, "", "total_marginal_ghg_emissions_intensity"], [34, 4, 1, "", "ubid"], [34, 4, 1, "", "ubidmodel_set"], [34, 4, 1, "", "updated"], [34, 4, 1, "", "use_description"], [34, 4, 1, "", "water_use"], [34, 4, 1, "", "wui"], [34, 4, 1, "", "year_built"], [34, 4, 1, "", "year_ending"]], "seed.models.properties.PropertyView": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "cycle"], [34, 4, 1, "", "cycle_id"], [34, 4, 1, "", "gapauditlog_view"], [34, 4, 1, "", "greenassessmentproperty_set"], [34, 4, 1, "", "id"], [34, 5, 1, "", "import_filename"], [34, 3, 1, "", "initialize_audit_logs"], [34, 4, 1, "", "labels"], [34, 4, 1, "", "notes"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "property"], [34, 4, 1, "", "property_id"], [34, 4, 1, "", "propertyauditlog_view"], [34, 4, 1, "", "propertyviewlabel_set"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 3, 1, "", "tax_lot_states"], [34, 3, 1, "", "tax_lot_views"], [34, 4, 1, "", "taxlotproperty_set"]], "seed.models.properties.PropertyViewLabel": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "goal"], [34, 4, 1, "", "goal_id"], [34, 4, 1, "", "id"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "propertyview"], [34, 4, 1, "", "propertyview_id"], [34, 4, 1, "", "statuslabel"], [34, 4, 1, "", "statuslabel_id"]], "seed.models.tax_lots": [[34, 2, 1, "", "TaxLot"], [34, 2, 1, "", "TaxLotAuditLog"], [34, 2, 1, "", "TaxLotState"], [34, 2, 1, "", "TaxLotView"], [34, 1, 1, "", "post_save_taxlot_state"], [34, 1, 1, "", "post_save_taxlot_view"], [34, 1, 1, "", "set_default_access_level_instance"], [34, 1, 1, "", "sync_latitude_longitude_and_long_lat"]], "seed.models.tax_lots.TaxLot": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "access_level_instance"], [34, 4, 1, "", "access_level_instance_id"], [34, 4, 1, "", "created"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 4, 1, "", "id"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "updated"], [34, 4, 1, "", "views"]], "seed.models.tax_lots.TaxLotAuditLog": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "created"], [34, 4, 1, "", "description"], [34, 3, 1, "", "get_record_type_display"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_filename"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "parent1"], [34, 4, 1, "", "parent1_id"], [34, 4, 1, "", "parent2"], [34, 4, 1, "", "parent2_id"], [34, 4, 1, "", "parent_state1"], [34, 4, 1, "", "parent_state1_id"], [34, 4, 1, "", "parent_state2"], [34, 4, 1, "", "parent_state2_id"], [34, 4, 1, "", "record_type"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 4, 1, "", "taxlotauditlog_parent1"], [34, 4, 1, "", "taxlotauditlog_parent2"], [34, 4, 1, "", "view"], [34, 4, 1, "", "view_id"]], "seed.models.tax_lots.TaxLotState": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "address_line_1"], [34, 4, 1, "", "address_line_2"], [34, 4, 1, "", "block_number"], [34, 4, 1, "", "bounding_box"], [34, 4, 1, "", "centroid"], [34, 4, 1, "", "city"], [34, 3, 1, "", "coparent"], [34, 4, 1, "", "created"], [34, 4, 1, "", "custom_id_1"], [34, 4, 1, "", "data_state"], [34, 4, 1, "", "district"], [34, 4, 1, "", "extra_data"], [34, 4, 1, "", "geocoding_confidence"], [34, 3, 1, "", "get_data_state_display"], [34, 3, 1, "", "get_merge_state_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 4, 1, "", "hash_object"], [34, 3, 1, "", "history"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_file"], [34, 4, 1, "", "import_file_id"], [34, 4, 1, "", "jurisdiction_tax_lot_id"], [34, 4, 1, "", "latitude"], [34, 4, 1, "", "long_lat"], [34, 4, 1, "", "longitude"], [34, 3, 1, "", "merge_relationships"], [34, 4, 1, "", "merge_state"], [34, 4, 1, "", "normalized_address"], [34, 4, 1, "", "number_properties"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "postal_code"], [34, 3, 1, "", "promote"], [34, 4, 1, "", "raw_access_level_instance"], [34, 4, 1, "", "raw_access_level_instance_error"], [34, 4, 1, "", "raw_access_level_instance_id"], [34, 3, 1, "", "save"], [34, 4, 1, "", "state"], [34, 4, 1, "", "taxlot_footprint"], [34, 4, 1, "", "taxlotauditlog_parent_state1"], [34, 4, 1, "", "taxlotauditlog_parent_state2"], [34, 4, 1, "", "taxlotauditlog_state"], [34, 4, 1, "", "taxlotview_set"], [34, 3, 1, "", "to_dict"], [34, 4, 1, "", "ubid"], [34, 4, 1, "", "ubidmodel_set"], [34, 4, 1, "", "updated"]], "seed.models.tax_lots.TaxLotView": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "cycle"], [34, 4, 1, "", "cycle_id"], [34, 4, 1, "", "id"], [34, 5, 1, "", "import_filename"], [34, 3, 1, "", "initialize_audit_logs"], [34, 4, 1, "", "labels"], [34, 4, 1, "", "notes"], [34, 4, 1, "", "objects"], [34, 3, 1, "", "property_states"], [34, 3, 1, "", "property_views"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 4, 1, "", "taxlot"], [34, 4, 1, "", "taxlot_id"], [34, 4, 1, "", "taxlotauditlog_view"], [34, 4, 1, "", "taxlotproperty_set"]], "seed.search": [[19, 1, 1, "", "build_shared_buildings_orgs"], [19, 1, 1, "", "create_inventory_queryset"], [19, 1, 1, "", "get_inventory_fieldnames"], [19, 1, 1, "", "get_orgs_w_public_fields"], [19, 1, 1, "", "inventory_search_filter_sort"], [19, 1, 1, "", "parse_body"], [19, 1, 1, "", "process_search_params"], [19, 1, 1, "", "search_inventory"], [19, 1, 1, "", "search_properties"], [19, 1, 1, "", "search_taxlots"]], "seed.serializers": [[36, 0, 0, "-", "celery"], [36, 0, 0, "-", "labels"]], "seed.serializers.celery": [[36, 2, 1, "", "CeleryDatetimeSerializer"]], "seed.serializers.celery.CeleryDatetimeSerializer": [[36, 3, 1, "", "default"], [36, 3, 1, "", "seed_decoder"], [36, 3, 1, "", "seed_dumps"], [36, 3, 1, "", "seed_loads"]], "seed.serializers.labels": [[36, 2, 1, "", "LabelSerializer"]], "seed.serializers.labels.LabelSerializer": [[36, 2, 1, "", "Meta"], [36, 3, 1, "", "get_is_applied"], [36, 3, 1, "", "to_representation"]], "seed.serializers.labels.LabelSerializer.Meta": [[36, 4, 1, "", "extra_kwargs"], [36, 4, 1, "", "fields"], [36, 4, 1, "", "model"]], "seed.tasks": [[19, 1, 1, "", "delete_organization"], [19, 1, 1, "", "invite_new_user_to_seed"], [19, 1, 1, "", "send_salesforce_error_log"]], "seed.templatetags": [[37, 0, 0, "-", "breadcrumbs"]], "seed.templatetags.breadcrumbs": [[37, 2, 1, "", "BreadcrumbNode"], [37, 2, 1, "", "UrlBreadcrumbNode"], [37, 1, 1, "", "breadcrumb"], [37, 1, 1, "", "breadcrumb_root"], [37, 1, 1, "", "breadcrumb_url"], [37, 1, 1, "", "breadcrumb_url_root"], [37, 1, 1, "", "create_crumb"], [37, 1, 1, "", "create_crumb_first"]], "seed.templatetags.breadcrumbs.BreadcrumbNode": [[37, 3, 1, "", "render"]], "seed.templatetags.breadcrumbs.UrlBreadcrumbNode": [[37, 3, 1, "", "render"]], "seed.test_helpers.factory": [[39, 0, 0, "-", "helpers"]], "seed.test_helpers.factory.helpers": [[39, 2, 1, "", "DjangoFunctionalFactory"]], "seed.test_helpers.factory.helpers.DjangoFunctionalFactory": [[39, 3, 1, "", "invalid_test_cc_number"], [39, 3, 1, "", "rand_bool"], [39, 3, 1, "", "rand_city"], [39, 3, 1, "", "rand_city_suffix"], [39, 3, 1, "", "rand_currency"], [39, 3, 1, "", "rand_date"], [39, 3, 1, "", "rand_domain"], [39, 3, 1, "", "rand_email"], [39, 3, 1, "", "rand_float"], [39, 3, 1, "", "rand_int"], [39, 3, 1, "", "rand_name"], [39, 3, 1, "", "rand_phone"], [39, 3, 1, "", "rand_plant_name"], [39, 3, 1, "", "rand_str"], [39, 3, 1, "", "rand_street_address"], [39, 3, 1, "", "rand_street_suffix"], [39, 3, 1, "", "test_cc_number"], [39, 3, 1, "", "valid_test_cc_number"]], "seed.tests": [[41, 0, 0, "-", "test_admin_views"], [41, 0, 0, "-", "test_decorators"], [41, 0, 0, "-", "test_tasks"], [41, 0, 0, "-", "test_views"], [41, 0, 0, "-", "util"]], "seed.tests.test_admin_views": [[41, 2, 1, "", "AdminViewsTest"]], "seed.tests.test_admin_views.AdminViewsTest": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_add_org"], [41, 3, 1, "", "test_add_org_dupe"], [41, 3, 1, "", "test_add_owner_existing_org_to_non_root"], [41, 3, 1, "", "test_add_user_existing_org"], [41, 3, 1, "", "test_add_user_new_org"], [41, 3, 1, "", "test_add_user_no_org"], [41, 3, 1, "", "test_signup_process"], [41, 3, 1, "", "test_signup_process_force_lowercase_email"]], "seed.tests.test_decorators": [[41, 2, 1, "", "ClassDecoratorTests"], [41, 2, 1, "", "RequireOrganizationIDTests"], [41, 2, 1, "", "TestDecorators"], [41, 6, 1, "", "TestError"]], "seed.tests.test_decorators.ClassDecoratorTests": [[41, 3, 1, "", "test_ajax_request_class_dict"], [41, 3, 1, "", "test_ajax_request_class_dict_status_error"], [41, 3, 1, "", "test_ajax_request_class_dict_status_false"], [41, 3, 1, "", "test_ajax_request_class_format_type"], [41, 3, 1, "", "test_require_organization_id_class_no_org_id"], [41, 3, 1, "", "test_require_organization_id_class_org_id"], [41, 3, 1, "", "test_require_organization_id_class_org_id_not_int"]], "seed.tests.test_decorators.RequireOrganizationIDTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_require_organization_id_fail_no_key"], [41, 3, 1, "", "test_require_organization_id_fail_not_numeric"], [41, 3, 1, "", "test_require_organization_id_success_integer"], [41, 3, 1, "", "test_require_organization_id_success_string"]], "seed.tests.test_decorators.TestDecorators": [[41, 4, 1, "", "locked"], [41, 4, 1, "", "pk"], [41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_get_prog_key"], [41, 3, 1, "", "test_increment_cache"], [41, 3, 1, "", "test_locking"], [41, 3, 1, "", "test_locking_w_exception"], [41, 3, 1, "", "test_progress"], [41, 4, 1, "", "unlocked"]], "seed.tests.test_tasks": [[41, 2, 1, "", "TestTasks"]], "seed.tests.test_tasks.TestTasks": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_delete_organization"]], "seed.tests.test_views": [[41, 2, 1, "", "DatasetPermissionsTests"], [41, 2, 1, "", "GetDatasetsViewsTests"], [41, 2, 1, "", "ImportFileViewsTests"], [41, 2, 1, "", "InventoryViewTests"], [41, 2, 1, "", "MainViewTests"], [41, 2, 1, "", "TestMCMViews"]], "seed.tests.test_views.DatasetPermissionsTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_dataset_count"], [41, 3, 1, "", "test_dataset_create"], [41, 3, 1, "", "test_dataset_destroy"], [41, 3, 1, "", "test_dataset_list"], [41, 3, 1, "", "test_dataset_retrieve"], [41, 3, 1, "", "test_dataset_update"]], "seed.tests.test_views.GetDatasetsViewsTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_delete_dataset"], [41, 3, 1, "", "test_get_dataset"], [41, 3, 1, "", "test_get_datasets"], [41, 3, 1, "", "test_get_datasets_count"], [41, 3, 1, "", "test_get_datasets_count_invalid"], [41, 3, 1, "", "test_update_dataset"]], "seed.tests.test_views.ImportFileViewsTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_delete_file"], [41, 3, 1, "", "test_get_import_file"], [41, 3, 1, "", "test_get_matching_and_geocoding_results"]], "seed.tests.test_views.InventoryViewTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_get_cycles"], [41, 3, 1, "", "test_get_properties"], [41, 3, 1, "", "test_get_properties_cycle_id"], [41, 3, 1, "", "test_get_properties_empty_page"], [41, 3, 1, "", "test_get_properties_page_not_an_integer"], [41, 3, 1, "", "test_get_properties_pint_fields"], [41, 3, 1, "", "test_get_properties_profile_id"], [41, 3, 1, "", "test_get_properties_property_extra_data"], [41, 3, 1, "", "test_get_properties_select_all"], [41, 3, 1, "", "test_get_properties_taxlot_extra_data"], [41, 3, 1, "", "test_get_properties_with_taxlots"], [41, 3, 1, "", "test_get_properties_with_taxlots_with_footprints"], [41, 3, 1, "", "test_get_properties_wrong_query_params"], [41, 3, 1, "", "test_get_property"], [41, 3, 1, "", "test_get_property_columns"], [41, 3, 1, "", "test_get_property_multiple_taxlots"], [41, 3, 1, "", "test_get_taxlot"], [41, 3, 1, "", "test_get_taxlot_columns"], [41, 3, 1, "", "test_get_taxlots"], [41, 3, 1, "", "test_get_taxlots_empty_page"], [41, 3, 1, "", "test_get_taxlots_extra_data"], [41, 3, 1, "", "test_get_taxlots_multiple_taxlots"], [41, 3, 1, "", "test_get_taxlots_no_cycle_id"], [41, 3, 1, "", "test_get_taxlots_page_not_an_integer"], [41, 3, 1, "", "test_get_taxlots_profile_id"], [41, 3, 1, "", "test_postoffice"], [41, 3, 1, "", "test_update_pint_fields_with_modified_display_settings"]], "seed.tests.test_views.MainViewTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_home"]], "seed.tests.test_views.TestMCMViews": [[41, 3, 1, "", "assert_expected_mappings"], [41, 4, 1, "", "expected_mappings"], [41, 4, 1, "", "raw_columns_expected"], [41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_create_dataset"], [41, 3, 1, "", "test_get_column_mapping_suggestions"], [41, 3, 1, "", "test_get_column_mapping_suggestions_pm_file"], [41, 3, 1, "", "test_get_column_mapping_suggestions_with_columns"], [41, 3, 1, "", "test_get_raw_column_names"], [41, 3, 1, "", "test_progress"], [41, 3, 1, "", "test_save_column_mappings"], [41, 3, 1, "", "test_save_column_mappings_idempotent"]], "seed.tests.util": [[41, 2, 1, "", "AccessLevelBaseTestCase"], [41, 2, 1, "", "AssertDictSubsetMixin"], [41, 2, 1, "", "DataMappingBaseTestCase"], [41, 2, 1, "", "DeleteModelsTestCase"], [41, 2, 1, "", "FakeClient"], [41, 2, 1, "", "FakeRequest"]], "seed.tests.util.AccessLevelBaseTestCase": [[41, 3, 1, "", "login_as_child_member"], [41, 3, 1, "", "login_as_root_member"], [41, 3, 1, "", "login_as_root_owner"], [41, 3, 1, "", "setUp"]], "seed.tests.util.AssertDictSubsetMixin": [[41, 3, 1, "", "assertDictContainsSubset"]], "seed.tests.util.DataMappingBaseTestCase": [[41, 3, 1, "", "create_import_file"], [41, 3, 1, "", "set_up"]], "seed.tests.util.DeleteModelsTestCase": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "tearDown"]], "seed.tests.util.FakeClient": [[41, 3, 1, "", "get"], [41, 3, 1, "", "post"]], "seed.tests.util.FakeRequest": [[41, 4, 1, "", "GET"], [41, 4, 1, "", "META"], [41, 4, 1, "", "POST"], [41, 4, 1, "", "body"], [41, 4, 1, "", "path"]], "seed.token_generators": [[19, 2, 1, "", "SignupTokenGenerator"]], "seed.token_generators.SignupTokenGenerator": [[19, 3, 1, "", "check_token"], [19, 3, 1, "", "make_token"]], "seed.utils": [[44, 0, 0, "-", "api"], [44, 0, 0, "-", "buildings"], [44, 0, 0, "-", "organizations"], [44, 0, 0, "-", "time"]], "seed.utils.api": [[44, 2, 1, "", "APIBypassCSRFMiddleware"], [44, 2, 1, "", "OrgCreateMixin"], [44, 2, 1, "", "OrgCreateUpdateMixin"], [44, 2, 1, "", "OrgMixin"], [44, 2, 1, "", "OrgQuerySetMixin"], [44, 2, 1, "", "OrgUpdateMixin"], [44, 2, 1, "", "OrgValidateMixin"], [44, 2, 1, "", "OrgValidator"], [44, 2, 1, "", "ProfileIdMixin"], [44, 1, 1, "", "api_endpoint"], [44, 1, 1, "", "api_endpoint_class"], [44, 1, 1, "", "clean_api_regex"], [44, 1, 1, "", "drf_api_endpoint"], [44, 1, 1, "", "format_api_docstring"], [44, 1, 1, "", "get_all_urls"], [44, 1, 1, "", "get_api_endpoints"], [44, 1, 1, "", "get_api_request_user"], [44, 1, 1, "", "get_org_id_from_validator"], [44, 1, 1, "", "rgetattr"]], "seed.utils.api.OrgCreateMixin": [[44, 3, 1, "", "perform_create"]], "seed.utils.api.OrgMixin": [[44, 3, 1, "", "get_organization"], [44, 3, 1, "", "get_parent_org"]], "seed.utils.api.OrgQuerySetMixin": [[44, 3, 1, "", "get_queryset"]], "seed.utils.api.OrgUpdateMixin": [[44, 3, 1, "", "perform_update"]], "seed.utils.api.OrgValidateMixin": [[44, 3, 1, "", "validate"], [44, 3, 1, "", "validate_org"]], "seed.utils.api.OrgValidator": [[44, 4, 1, "", "field"], [44, 4, 1, "", "key"]], "seed.utils.api.ProfileIdMixin": [[44, 3, 1, "", "get_show_columns"]], "seed.utils.buildings": [[44, 1, 1, "", "get_source_type"]], "seed.utils.organizations": [[44, 1, 1, "", "create_organization"], [44, 1, 1, "", "create_suborganization"], [44, 1, 1, "", "default_pm_mappings"], [44, 1, 1, "", "set_default_2fa_method"]], "seed.utils.time": [[44, 1, 1, "", "convert_datestr"], [44, 1, 1, "", "convert_to_js_timestamp"], [44, 1, 1, "", "parse_datetime"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute", "5": "py:property", "6": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"], "5": ["py", "property", "Python property"], "6": ["py", "exception", "Python exception"]}, "titleterms": {"api": [0, 43, 44, 45, 48], "authent": 0, "payload": 0, "respons": 0, "endpoint": 0, "aw": [1, 6, 11, 13], "setup": [1, 8, 11, 13], "prerequisit": [1, 13, 48], "amazon": 1, "web": [1, 11, 13], "servic": [1, 13], "depend": [1, 13, 48], "python": [1, 5, 13, 48], "javascript": [1, 13, 48], "databas": [1, 5, 13, 46, 48], "configur": [1, 11, 13, 18, 48], "cach": [1, 13], "messag": [1, 13], "broker": [1, 13], "run": [1, 13, 47, 48], "celeri": [1, 11, 13], "background": [1, 13], "task": [1, 13, 19, 41], "worker": [1, 13], "data": [2, 3, 10, 20, 21, 22], "model": [2, 19, 20, 22, 24, 34, 35, 41], "todo": [2, 14], "parent": 2, "children": 2, "match": [2, 14, 15], "manual": 2, "v": 2, "auto": 2, "what": [2, 7, 15], "realli": 2, "happen": 2, "buildingsnapshot": 2, "tabl": [2, 10], "import": [2, 14, 22], "when": [2, 15], "canonicalbuild": 2, "organ": [2, 44], "_source_id": 2, "field": [2, 5], "extra_data": 2, "save": 2, "possibl": 2, "loss": 2, "qualiti": [3, 20], "deploy": [4, 6, 11, 16], "guid": [4, 11], "migrat": [4, 5, 16, 48], "monitor": 4, "sentri": 4, "develop": [5, 8, 9, 13, 16, 47], "resourc": [5, 11], "gener": [5, 13, 19, 34, 49], "note": [5, 15], "pre": 5, "commit": 5, "ruff": 5, "set": [5, 7], "type": 5, "hint": 5, "usag": 5, "check": 5, "django": [5, 13, 48], "ad": 5, "new": 5, "nginx": 5, "angularj": 5, "integr": 5, "templat": [5, 18], "tag": 5, "csrf": 5, "token": [5, 19], "ajax": 5, "request": 5, "rout": 5, "partial": 5, "view": [5, 18, 19, 20, 22, 24, 41, 45], "log": [5, 11], "bede": [5, 21], "complianc": 5, "manag": [5, 11, 22, 25, 26, 30, 31, 32], "column": [5, 34], "reset": 5, "restor": 5, "dump": 5, "test": [5, 18, 20, 24, 32, 38, 39, 40, 41, 42, 47], "build": [5, 44, 47], "document": 5, "contribut": 5, "instruct": [5, 48], "best": 5, "practic": 5, "releas": 5, "docker": [6, 16, 47], "instal": [6, 47, 48], "deploi": 6, "frequent": 7, "ask": 7, "question": 7, "i": [7, 15], "seed": [7, 9, 10, 19, 25, 28, 29, 33, 46, 49], "platform": [7, 9, 10], "issu": 7, "why": [7, 15], "domain": 7, "exampl": 7, "com": 7, "aren": 7, "t": [7, 49], "static": 7, "asset": 7, "being": 7, "serv": 7, "correctli": 7, "get": 8, "start": [8, 48], "help": 9, "For": 9, "user": [9, 13, 48], "standard": 10, "energi": 10, "effici": 10, "indic": 10, "kubernet": 11, "helm": 11, "cluster": 11, "cli": 11, "kubectl": 11, "ek": 11, "control": 11, "specif": 11, "chart": 11, "exist": [11, 15], "upgrad": [11, 46], "redeploi": 11, "stack": 11, "In": [11, 15], "updat": [11, 26], "other": 11, "licens": 12, "linux": 13, "postgresql": [13, 48], "creat": 13, "initi": 13, "server": [13, 47, 48], "product": 13, "environ": 13, "variabl": 13, "mail": 13, "se": 13, "smtp": 13, "local_untrack": 13, "py": 13, "map": [14, 28, 33], "pair": 14, "doe": 15, "how": 15, "us": [15, 47], "cycl": [15, 34], "merg": [15, 29], "link": 15, "across": 15, "put": 15, "them": 15, "togeth": 15, "Not": 15, "search": [15, 19], "depth": 15, "version": 16, "3": 16, "1": [16, 48], "0": [16, 48], "beta": 16, "2": [16, 48], "22": 16, "21": 16, "20": 16, "19": 16, "18": 16, "17": 16, "4": 16, "16": [16, 46], "15": 16, "14": 16, "13": 16, "12": [16, 46], "11": [16, 48], "10": 16, "7": 16, "9": 16, "6": 16, "base": [16, 42], "ubuntu": [16, 47], "max": 16, "osx": [16, 47, 48], "5": [16, 48], "modul": [17, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 45], "submodul": [18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42, 43, 44, 45], "context": 18, "util": [18, 19, 22, 41, 44], "wsgi": 18, "packag": [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48], "subpackag": [19, 24, 25, 30, 31, 38, 39], "inherit": [19, 20], "decor": [19, 41], "factori": [19, 40], "content": [19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 45], "url": [22, 24, 43], "featur": 23, "land": [24, 25, 26], "form": 24, "eula": 26, "librari": 27, "lib": [28, 29, 40], "mapper": [28, 33], "mapping_column": 28, "mapping_data": 28, "test_mapp": 28, "test_mapping_column": 28, "test_mapping_data": 28, "json": [31, 32], "seed_map": 33, "auditlog": 34, "join": 34, "properti": 34, "taxlot": 34, "public": 35, "serial": 36, "label": 36, "templatetag": 37, "breadcrumb": 37, "helper": [38, 39, 40], "factor": 39, "chomski": 40, "admin": [41, 48], "export": 41, "function": 42, "page": 42, "account": [43, 45], "main": [43, 45], "time": 44, "meter": 45, "from": 46, "postgr": 46, "assumpt": 46, "nativ": 47, "window": 47, "contain": 47, "non": 47, "debug": 47, "quick": 48, "postgi": 48, "timescaledb": 48, "nodej": 48, "npm": 48, "mapquest": 48, "kei": 48, "redi": 48, "login": 48, "translat": 49, "philosophi": 49, "style": 49, "don": 49, "go": 49, "crazi": 49, "indirect": 49, "interpol": 49}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx.ext.intersphinx": 1, "sphinx": 60}, "alltitles": {"API": [[0, "api"]], "Authentication": [[0, "authentication"]], "Payloads": [[0, "payloads"]], "Responses": [[0, "responses"]], "API Endpoints": [[0, "api-endpoints"]], "AWS Setup": [[1, "aws-setup"]], "Prerequisites": [[1, "prerequisites"], [13, "prerequisites"], [48, "prerequisites"]], "Amazon Web Services (AWS) Dependencies": [[1, "amazon-web-services-aws-dependencies"]], "Python Dependencies": [[1, "python-dependencies"], [13, "python-dependencies"]], "JavaScript Dependencies": [[1, "javascript-dependencies"], [13, "javascript-dependencies"]], "Database Configuration": [[1, "database-configuration"]], "Cache and Message Broker": [[1, "cache-and-message-broker"], [13, "cache-and-message-broker"]], "Running Celery the Background Task Worker": [[1, "running-celery-the-background-task-worker"]], "Data Model": [[2, "data-model"]], "Todo": [[2, "id1"], [14, "id2"], [14, "id3"]], "parents and children": [[2, "parents-and-children"]], "matching": [[2, "matching"]], "manual-matching vs auto-matching": [[2, "manual-matching-vs-auto-matching"]], "what really happens to the BuildingSnapshot table on import (and when)": [[2, "what-really-happens-to-the-buildingsnapshot-table-on-import-and-when"]], "what really happens to the CanonicalBuilding table on import (and when)": [[2, "what-really-happens-to-the-canonicalbuilding-table-on-import-and-when"]], "organization": [[2, "organization"]], "*_source_id fields": [[2, "source-id-fields"]], "extra_data": [[2, "extra-data"]], "saving and possible data loss": [[2, "saving-and-possible-data-loss"]], "Data Quality": [[3, "data-quality"]], "Deployment Guide": [[4, "deployment-guide"]], "Migrations": [[4, "migrations"], [16, "migrations"]], "Monitoring": [[4, "monitoring"]], "Sentry": [[4, "sentry"]], "Developer Resources": [[5, "developer-resources"]], "General Notes": [[5, "general-notes"]], "Pre-commit": [[5, "pre-commit"]], "Ruff Settings": [[5, "ruff-settings"]], "Python Type Hints": [[5, "python-type-hints"]], "Usage": [[5, "usage"]], "Type Checking": [[5, "type-checking"]], "Django Notes": [[5, "django-notes"]], "Adding New Fields to Database": [[5, "adding-new-fields-to-database"]], "NGINX Notes": [[5, "nginx-notes"]], "AngularJS Integration Notes": [[5, "angularjs-integration-notes"]], "Template Tags": [[5, "template-tags"]], "Django CSRF Token and AJAX Requests": [[5, "django-csrf-token-and-ajax-requests"]], "Routes and Partials or Views": [[5, "routes-and-partials-or-views"]], "Logging": [[5, "logging"]], "BEDES Compliance and Managing Columns": [[5, "bedes-compliance-and-managing-columns"]], "Resetting the Database": [[5, "resetting-the-database"]], "Restoring a Database Dump": [[5, "restoring-a-database-dump"]], "Migrating the Database": [[5, "migrating-the-database"]], "Testing": [[5, "testing"]], "Building Documentation": [[5, "building-documentation"]], "Contribution Instructions / Best Practices": [[5, "contribution-instructions-best-practices"]], "Release Instructions": [[5, "release-instructions"]], "Docker Deployment on AWS": [[6, "docker-deployment-on-aws"]], "Installation": [[6, "installation"]], "Deploying with Docker": [[6, "deploying-with-docker"]], "Frequently Asked Questions": [[7, "frequently-asked-questions"]], "Questions": [[7, "questions"]], "What is the SEED Platform?": [[7, "what-is-the-seed-platform"]], "Issues": [[7, "issues"]], "Why is the domain set to example.com?": [[7, "why-is-the-domain-set-to-example-com"]], "Why aren\u2019t the static assets being served correctly?": [[7, "why-aren-t-the-static-assets-being-served-correctly"]], "Getting Started": [[8, "getting-started"]], "Development Setup": [[8, "development-setup"]], "Help": [[9, "help"]], "For SEED Platform Users": [[9, "for-seed-platform-users"]], "For SEED Platform Developers": [[9, "for-seed-platform-developers"]], "Standard Energy Efficiency Data (SEED) Platform": [[10, "standard-energy-efficiency-data-seed-platform"]], "Indices and tables": [[10, "indices-and-tables"]], "Kubernetes Deployment Guide with Helm": [[11, "kubernetes-deployment-guide-with-helm"]], "Setup": [[11, "setup"]], "Cluster": [[11, "cluster"]], "AWS CLI Configuration": [[11, "aws-cli-configuration"]], "Kubectl": [[11, "kubectl"]], "Helm": [[11, "helm"]], "EKS Control (AWS Specific)": [[11, "eks-control-aws-specific"]], "Charts": [[11, "charts"]], "Deployment": [[11, "deployment"]], "Managing Existing Clusters": [[11, "managing-existing-clusters"]], "Upgrade/Redeploy the Helm Stack": [[11, "upgrade-redeploy-the-helm-stack"]], "Managing the Kubernetes Cluster (AWS Specific)": [[11, "managing-the-kubernetes-cluster-aws-specific"]], "Logging In": [[11, "logging-in"]], "Update web and web-celery": [[11, "update-web-and-web-celery"]], "Other Resources": [[11, "other-resources"]], "License": [[12, "license"]], "General Linux Setup": [[13, "general-linux-setup"]], "Configure PostgreSQL": [[13, "configure-postgresql"]], "Django Database Configuration": [[13, "django-database-configuration"]], "Creating the initial user": [[13, "creating-the-initial-user"]], "Running celery the background task worker": [[13, "running-celery-the-background-task-worker"]], "Running the development web server": [[13, "running-the-development-web-server"]], "Running a production web server": [[13, "running-a-production-web-server"]], "Environment Variables": [[13, "environment-variables"]], "Mail Services": [[13, "mail-services"]], "AWS SES Service": [[13, "aws-ses-service"]], "SMTP service": [[13, "smtp-service"]], "local_untracked.py": [[13, "local-untracked-py"]], "Mapping": [[14, "mapping"], [14, "id1"]], "Import": [[14, "import"]], "Matching": [[14, "matching"], [15, "matching"]], "Pairing": [[14, "pairing"]], "What is it?": [[15, "what-is-it"]], "Why does it exist?": [[15, "why-does-it-exist"]], "How and when is it used?": [[15, "how-and-when-is-it-used"]], "In-Cycle Merging": [[15, "in-cycle-merging"]], "Linking (Across Cycles)": [[15, "linking-across-cycles"]], "Putting them Together, Match-Merge-Linking": [[15, "putting-them-together-match-merge-linking"]], "Note on In-Cycle Not-merged Matches": [[15, "note-on-in-cycle-not-merged-matches"]], "Match Searching in Depth": [[15, "match-searching-in-depth"]], "Version Develop": [[16, "version-develop"]], "Version 3.1.0": [[16, "version-3-1-0"]], "Version 3.0.0": [[16, "version-3-0-0"]], "Version 3.0.0-beta.0": [[16, "version-3-0-0-beta-0"]], "Version 2.22.0": [[16, "version-2-22-0"]], "Version 2.21.0": [[16, "version-2-21-0"]], "Version 2.20.1": [[16, "version-2-20-1"]], "Version 2.20.0": [[16, "version-2-20-0"]], "Version 2.19.0": [[16, "version-2-19-0"]], "Version 2.18.1": [[16, "version-2-18-1"]], "Version 2.18.0": [[16, "version-2-18-0"]], "Version 2.17.4": [[16, "version-2-17-4"]], "Version 2.17.3": [[16, "version-2-17-3"]], "Version 2.17.2": [[16, "version-2-17-2"]], "Version 2.17.1": [[16, "version-2-17-1"]], "Version 2.17.0": [[16, "version-2-17-0"]], "Version 2.16.0": [[16, "version-2-16-0"]], "Version 2.15.2": [[16, "version-2-15-2"]], "Version 2.15.1": [[16, "version-2-15-1"]], "Version 2.15.0": [[16, "version-2-15-0"]], "Version 2.14.0": [[16, "version-2-14-0"]], "Version 2.13.0": [[16, "version-2-13-0"]], "Version 2.12.0 - 2.12.4": [[16, "version-2-12-0-2-12-4"]], "Version 2.11.0": [[16, "version-2-11-0"]], "Version 2.10.0": [[16, "version-2-10-0"]], "Version 2.7.3 to 2.9.0": [[16, "version-2-7-3-to-2-9-0"]], "Version 2.7.2": [[16, "version-2-7-2"]], "Version 2.7.1": [[16, "version-2-7-1"]], "Version 2.7.0": [[16, "version-2-7-0"]], "Version 2.6.1": [[16, "version-2-6-1"]], "Version 2.6.0": [[16, "version-2-6-0"]], "Docker-based Deployment": [[16, "docker-based-deployment"], [16, "id1"]], "Ubuntu": [[16, "ubuntu"]], "Max OSX": [[16, "max-osx"]], "Version 2.5.2": [[16, "version-2-5-2"]], "Version 2.5.1": [[16, "version-2-5-1"]], "Version 2.5.0": [[16, "version-2-5-0"]], "Development": [[16, "development"]], "Modules": [[17, "modules"]], "Configuration": [[18, "configuration"]], "Submodules": [[18, "submodules"], [19, "submodules"], [20, "submodules"], [21, "submodules"], [22, "submodules"], [23, "submodules"], [24, "submodules"], [26, "submodules"], [27, "submodules"], [28, "submodules"], [29, "submodules"], [31, "submodules"], [32, "submodules"], [33, "submodules"], [34, "submodules"], [35, "submodules"], [36, "submodules"], [37, "submodules"], [39, "submodules"], [40, "submodules"], [41, "submodules"], [42, "submodules"], [43, "submodules"], [44, "submodules"], [45, "submodules"]], "Template Context": [[18, "module-config.template_context"]], "Tests": [[18, "module-config.tests"], [20, "tests"], [24, "module-seed.landing.tests"], [41, "tests"]], "Utils": [[18, "module-config.utils"], [19, "module-seed.utils"], [22, "module-seed.data_importer.utils"], [41, "module-seed.tests.util"]], "Views": [[18, "module-config.views"], [19, "module-seed.views"], [20, "views"], [22, "views"], [24, "module-seed.landing.views"], [41, "module-seed.tests.test_views"]], "WSGI": [[18, "module-config.wsgi"]], "SEED Package": [[19, "seed-package"]], "Subpackages": [[19, "subpackages"], [24, "subpackages"], [25, "subpackages"], [30, "subpackages"], [31, "subpackages"], [38, "subpackages"], [39, "subpackages"]], "Inheritance": [[19, "inheritance"], [20, "inheritance"]], "Decorators": [[19, "module-seed.decorators"], [41, "module-seed.tests.test_decorators"]], "Factory": [[19, "factory"]], "Models": [[19, "module-seed.models"], [20, "module-seed.models.data_quality"], [22, "models"], [24, "module-seed.landing.models"], [34, "models"], [35, "models"], [41, "models"]], "Search": [[19, "module-seed.search"]], "Tasks": [[19, "module-seed.tasks"], [41, "module-seed.tests.test_tasks"]], "Token Generator": [[19, "module-seed.token_generators"]], "Module contents": [[19, "module-seed"], [21, "module-contents"], [22, "module-seed.data_importer"], [23, "module-contents"], [24, "module-seed.landing"], [25, "module-seed.landing.management"], [26, "module-seed.landing.management.commands"], [27, "module-seed.lib"], [28, "module-seed.lib.mappings"], [29, "module-seed.lib.merging"], [30, "module-seed.management"], [31, "module-contents"], [32, "module-contents"], [33, "module-contents"], [34, "module-seed.models"], [35, "module-seed.public"], [36, "module-seed.serializers"], [38, "module-seed.test_helpers"], [45, "module-seed.views"]], "Data Quality Package": [[20, "data-quality-package"]], "Data Package": [[21, "data-package"]], "BEDES": [[21, "bedes"]], "Data Importer Package": [[22, "data-importer-package"]], "Managers": [[22, "module-seed.data_importer.managers"]], "URLs": [[22, "urls"], [24, "module-seed.landing.urls"]], "Features Package": [[23, "features-package"]], "Landing Package": [[24, "landing-package"]], "Forms": [[24, "module-seed.landing.forms"]], "seed.landing.management package": [[25, "seed-landing-management-package"]], "Landing Management Package": [[26, "landing-management-package"]], "Update EULA": [[26, "update-eula"]], "Library Packages": [[27, "library-packages"]], "seed.lib.mappings package": [[28, "seed-lib-mappings-package"]], "seed.lib.mappings.mapper module": [[28, "module-seed.lib.mappings.mapper"]], "seed.lib.mappings.mapping_columns module": [[28, "module-seed.lib.mappings.mapping_columns"]], "seed.lib.mappings.mapping_data module": [[28, "seed-lib-mappings-mapping-data-module"]], "seed.lib.mappings.test_mapper module": [[28, "seed-lib-mappings-test-mapper-module"]], "seed.lib.mappings.test_mapping_columns module": [[28, "seed-lib-mappings-test-mapping-columns-module"]], "seed.lib.mappings.test_mapping_data module": [[28, "seed-lib-mappings-test-mapping-data-module"]], "seed.lib.merging package": [[29, "seed-lib-merging-package"]], "seed.lib.merging.merging module": [[29, "module-seed.lib.merging.merging"]], "Management Package": [[30, "management-package"]], "Managers Package": [[31, "managers-package"]], "JSON": [[31, "json"]], "Manager Tests Package": [[32, "manager-tests-package"]], "Test JSON Manager": [[32, "test-json-manager"]], "Mapping Package": [[33, "mapping-package"]], "seed.mappings.mapper module": [[33, "seed-mappings-mapper-module"]], "seed.mappings.seed_mappings module": [[33, "seed-mappings-seed-mappings-module"]], "AuditLog": [[34, "module-seed.models.auditlog"]], "Columns": [[34, "module-seed.models.columns"]], "Cycles": [[34, "module-seed.models.cycles"]], "Joins": [[34, "joins"]], "Generic Models": [[34, "module-seed.models.models"]], "Properties": [[34, "module-seed.models.properties"]], "TaxLots": [[34, "module-seed.models.tax_lots"]], "Public Package": [[35, "public-package"]], "Serializers Package": [[36, "serializers-package"]], "Serializers": [[36, "module-seed.serializers.celery"]], "Labels": [[36, "module-seed.serializers.labels"]], "Templatetags Package": [[37, "templatetags-package"]], "Breadcrumbs": [[37, "module-seed.templatetags.breadcrumbs"]], "Test Helpers Package": [[38, "test-helpers-package"]], "Test Helper Factor Package": [[39, "test-helper-factor-package"]], "Helpers": [[39, "module-seed.test_helpers.factory.helpers"]], "Test Helper Factory Lib Package": [[40, "test-helper-factory-lib-package"]], "Chomsky": [[40, "chomsky"]], "Tests Package": [[41, "tests-package"]], "Admin Views": [[41, "module-seed.tests.test_admin_views"]], "Exporters": [[41, "exporters"]], "Tests (Functional) Package": [[42, "tests-functional-package"]], "Base": [[42, "base"]], "Page": [[42, "page"]], "Pages": [[42, "pages"]], "URLs Package": [[43, "urls-package"]], "Accounts": [[43, "accounts"], [45, "accounts"]], "APIs": [[43, "apis"], [44, "module-seed.utils.api"], [45, "apis"]], "Main": [[43, "main"], [45, "main"]], "Utilities Package": [[44, "utilities-package"]], "Buildings": [[44, "module-seed.utils.buildings"]], "Organizations": [[44, "module-seed.utils.organizations"]], "Time": [[44, "module-seed.utils.time"]], "Views Package": [[45, "views-package"]], "Meters": [[45, "meters"]], "Upgrade a SEED database from Postgres 12 to Postgres 16": [[46, "upgrade-a-seed-database-from-postgres-12-to-postgres-16"]], "Assumptions": [[46, "assumptions"]], "Installation using Docker": [[47, "installation-using-docker"]], "Docker Native (Ubuntu)": [[47, "docker-native-ubuntu"]], "Docker Native (Windows/OSX)": [[47, "docker-native-windows-osx"]], "Building and Running Containers for Non-Development": [[47, "building-and-running-containers-for-non-development"]], "Using Docker for Development": [[47, "using-docker-for-development"]], "Build": [[47, "build"]], "Running the Server": [[47, "running-the-server"]], "Running Tests": [[47, "running-tests"]], "Debugging": [[47, "debugging"]], "Installation on OSX": [[48, "installation-on-osx"]], "Quick Installation Instructions": [[48, "quick-installation-instructions"]], "PostgreSQL 11.1": [[48, "postgresql-11-1"]], "PostGIS 2.5": [[48, "postgis-2-5"]], "TimescaleDB 1.5.0": [[48, "timescaledb-1-5-0"]], "Python Packages": [[48, "python-packages"]], "NodeJS/npm": [[48, "nodejs-npm"]], "Configure Django and Databases": [[48, "configure-django-and-databases"]], "MapQuest API Key": [[48, "mapquest-api-key"]], "Run Django Migrations": [[48, "run-django-migrations"]], "Django Admin User": [[48, "django-admin-user"]], "Install Redis": [[48, "install-redis"]], "Install JavaScript Dependencies": [[48, "install-javascript-dependencies"]], "Start the Server": [[48, "start-the-server"]], "Login": [[48, "login"]], "Translating SEED": [[49, "translating-seed"]], "General philosophies / style": [[49, "general-philosophies-style"]], "Don\u2019t go crazy with indirection and interpolation": [[49, "don-t-go-crazy-with-indirection-and-interpolation"]]}, "indexentries": {"config.template_context": [[18, "module-config.template_context"]], "config.tests": [[18, "module-config.tests"]], "config.utils": [[18, "module-config.utils"]], "config.views": [[18, "module-config.views"]], "config.wsgi": [[18, "module-config.wsgi"]], "de_camel_case() (in module config.utils)": [[18, "config.utils.de_camel_case"]], "module": [[18, "module-config.template_context"], [18, "module-config.tests"], [18, "module-config.utils"], [18, "module-config.views"], [18, "module-config.wsgi"], [19, "module-seed"], [19, "module-seed.decorators"], [19, "module-seed.models"], [19, "module-seed.search"], [19, "module-seed.tasks"], [19, "module-seed.token_generators"], [19, "module-seed.utils"], [19, "module-seed.views"], [20, "module-seed.models.data_quality"], [22, "module-seed.data_importer"], [22, "module-seed.data_importer.managers"], [22, "module-seed.data_importer.utils"], [24, "module-seed.landing"], [24, "module-seed.landing.forms"], [24, "module-seed.landing.models"], [24, "module-seed.landing.tests"], [24, "module-seed.landing.urls"], [24, "module-seed.landing.views"], [25, "module-seed.landing.management"], [26, "module-seed.landing.management.commands"], [27, "module-seed.lib"], [27, "module-seed.lib.mappings"], [27, "module-seed.lib.merging"], [28, "module-seed.lib.mappings"], [28, "module-seed.lib.mappings.mapper"], [28, "module-seed.lib.mappings.mapping_columns"], [29, "module-seed.lib.merging"], [29, "module-seed.lib.merging.merging"], [30, "module-seed.management"], [34, "module-seed.models"], [34, "module-seed.models.auditlog"], [34, "module-seed.models.columns"], [34, "module-seed.models.cycles"], [34, "module-seed.models.models"], [34, "module-seed.models.properties"], [34, "module-seed.models.tax_lots"], [35, "module-seed.public"], [36, "module-seed.serializers"], [36, "module-seed.serializers.celery"], [36, "module-seed.serializers.labels"], [37, "module-seed.templatetags.breadcrumbs"], [38, "module-seed.test_helpers"], [39, "module-seed.test_helpers.factory.helpers"], [41, "module-seed.tests.test_admin_views"], [41, "module-seed.tests.test_decorators"], [41, "module-seed.tests.test_tasks"], [41, "module-seed.tests.test_views"], [41, "module-seed.tests.util"], [44, "module-seed.utils.api"], [44, "module-seed.utils.buildings"], [44, "module-seed.utils.organizations"], [44, "module-seed.utils.time"], [45, "module-seed.views"]], "robots_txt() (in module config.views)": [[18, "config.views.robots_txt"]], "sentry_js() (in module config.template_context)": [[18, "config.template_context.sentry_js"]], "session_key() (in module config.template_context)": [[18, "config.template_context.session_key"]], "drfendpointmixin (in module seed.decorators)": [[19, "seed.decorators.DRFEndpointMixin"]], "signuptokengenerator (class in seed.token_generators)": [[19, "seed.token_generators.SignupTokenGenerator"]], "ajax_request() (in module seed.decorators)": [[19, "seed.decorators.ajax_request"]], "ajax_request_class() (in module seed.decorators)": [[19, "seed.decorators.ajax_request_class"]], "build_shared_buildings_orgs() (in module seed.search)": [[19, "seed.search.build_shared_buildings_orgs"]], "check_token() (seed.token_generators.signuptokengenerator method)": [[19, "seed.token_generators.SignupTokenGenerator.check_token"]], "create_inventory_queryset() (in module seed.search)": [[19, "seed.search.create_inventory_queryset"]], "decorator_to_mixin() (in module seed.decorators)": [[19, "seed.decorators.decorator_to_mixin"]], "delete_organization() (in module seed.tasks)": [[19, "seed.tasks.delete_organization"]], "get_inventory_fieldnames() (in module seed.search)": [[19, "seed.search.get_inventory_fieldnames"]], "get_orgs_w_public_fields() (in module seed.search)": [[19, "seed.search.get_orgs_w_public_fields"]], "get_prog_key() (in module seed.decorators)": [[19, "seed.decorators.get_prog_key"]], "inventory_search_filter_sort() (in module seed.search)": [[19, "seed.search.inventory_search_filter_sort"]], "invite_new_user_to_seed() (in module seed.tasks)": [[19, "seed.tasks.invite_new_user_to_seed"]], "lock_and_track() (in module seed.decorators)": [[19, "seed.decorators.lock_and_track"]], "make_token() (seed.token_generators.signuptokengenerator method)": [[19, "seed.token_generators.SignupTokenGenerator.make_token"]], "parse_body() (in module seed.search)": [[19, "seed.search.parse_body"]], "process_search_params() (in module seed.search)": [[19, "seed.search.process_search_params"]], "require_organization_id() (in module seed.decorators)": [[19, "seed.decorators.require_organization_id"]], "require_organization_id_class() (in module seed.decorators)": [[19, "seed.decorators.require_organization_id_class"]], "require_organization_membership() (in module seed.decorators)": [[19, "seed.decorators.require_organization_membership"]], "search_inventory() (in module seed.search)": [[19, "seed.search.search_inventory"]], "search_properties() (in module seed.search)": [[19, "seed.search.search_properties"]], "search_taxlots() (in module seed.search)": [[19, "seed.search.search_taxlots"]], "seed": [[19, "module-seed"]], "seed.decorators": [[19, "module-seed.decorators"]], "seed.models": [[19, "module-seed.models"], [34, "module-seed.models"]], "seed.search": [[19, "module-seed.search"]], "seed.tasks": [[19, "module-seed.tasks"]], "seed.token_generators": [[19, "module-seed.token_generators"]], "seed.utils": [[19, "module-seed.utils"]], "seed.views": [[19, "module-seed.views"], [45, "module-seed.views"]], "send_salesforce_error_log() (in module seed.tasks)": [[19, "seed.tasks.send_salesforce_error_log"]], "comparisonerror": [[20, "seed.models.data_quality.ComparisonError"]], "data_types (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.DATA_TYPES"]], "default_rules (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.DEFAULT_RULES"]], "dataqualitycheck (class in seed.models.data_quality)": [[20, "seed.models.data_quality.DataQualityCheck"]], "dataqualitycheck.doesnotexist": [[20, "seed.models.data_quality.DataQualityCheck.DoesNotExist"]], "dataqualitycheck.multipleobjectsreturned": [[20, "seed.models.data_quality.DataQualityCheck.MultipleObjectsReturned"]], "dataqualitytypecasterror": [[20, "seed.models.data_quality.DataQualityTypeCastError"]], "required_fields (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.REQUIRED_FIELDS"]], "rule_exclude (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_EXCLUDE"]], "rule_include (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_INCLUDE"]], "rule_not_null (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_NOT_NULL"]], "rule_range (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_RANGE"]], "rule_required (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_REQUIRED"]], "rule_type (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_TYPE"], [20, "seed.models.data_quality.Rule.rule_type"]], "rule_type_custom (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_TYPE_CUSTOM"]], "rule_type_default (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_TYPE_DEFAULT"]], "rule (class in seed.models.data_quality)": [[20, "seed.models.data_quality.Rule"]], "rule.doesnotexist": [[20, "seed.models.data_quality.Rule.DoesNotExist"]], "rule.multipleobjectsreturned": [[20, "seed.models.data_quality.Rule.MultipleObjectsReturned"]], "severity (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY"], [20, "seed.models.data_quality.Rule.severity"]], "severity_error (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY_ERROR"]], "severity_valid (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY_VALID"]], "severity_warning (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY_WARNING"]], "type_area (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_AREA"]], "type_date (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_DATE"]], "type_eui (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_EUI"]], "type_number (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_NUMBER"]], "type_string (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_STRING"]], "type_year (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_YEAR"]], "unitmismatcherror": [[20, "seed.models.data_quality.UnitMismatchError"]], "add_goal_rule_labels() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_goal_rule_labels"]], "add_invalid_geometry_entry_provided() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_invalid_geometry_entry_provided"]], "add_result_comparison_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_comparison_error"]], "add_result_dimension_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_dimension_error"]], "add_result_is_null() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_is_null"]], "add_result_max_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_max_error"]], "add_result_min_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_min_error"]], "add_result_missing_and_none() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_missing_and_none"]], "add_result_missing_req() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_missing_req"]], "add_result_range_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_range_error"]], "add_result_string_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_string_error"]], "add_result_type_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_type_error"]], "add_rule() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_rule"]], "add_rule_if_new() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_rule_if_new"]], "cache_key() (seed.models.data_quality.dataqualitycheck static method)": [[20, "seed.models.data_quality.DataQualityCheck.cache_key"]], "check_data() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.check_data"]], "check_data_cross_cycle() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.check_data_cross_cycle"]], "condition (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.condition"]], "cross_cycle (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.cross_cycle"]], "data_quality_check (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.data_quality_check"]], "data_quality_check_id (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.data_quality_check_id"]], "data_type (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.data_type"]], "description (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.description"]], "enabled (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.enabled"]], "field (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.field"]], "for_derived_column (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.for_derived_column"]], "format_pint_violation() (in module seed.models.data_quality)": [[20, "seed.models.data_quality.format_pint_violation"]], "format_strings() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.format_strings"]], "get_data_type_display() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.get_data_type_display"]], "get_fieldnames() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.get_fieldnames"]], "get_rule_type_display() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.get_rule_type_display"]], "get_severity_display() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.get_severity_display"]], "get_value() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.get_value"]], "id (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.id"]], "id (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.id"]], "init_result() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.init_result"]], "initialize_cache() (seed.models.data_quality.dataqualitycheck static method)": [[20, "seed.models.data_quality.DataQualityCheck.initialize_cache"]], "initialize_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.initialize_rules"]], "max (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.max"]], "maximum_valid() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.maximum_valid"]], "min (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.min"]], "minimum_valid() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.minimum_valid"]], "name (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.name"]], "name (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.name"]], "not_null (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.not_null"]], "objects (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.objects"]], "objects (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.objects"]], "organization (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.organization"]], "organization_id (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.organization_id"]], "prune_results() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.prune_results"]], "remove_all_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.remove_all_rules"]], "remove_status_label() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.remove_status_label"]], "required (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.required"]], "reset_all_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.reset_all_rules"]], "reset_default_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.reset_default_rules"]], "reset_results() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.reset_results"]], "retrieve() (seed.models.data_quality.dataqualitycheck class method)": [[20, "seed.models.data_quality.DataQualityCheck.retrieve"]], "retrieve_result_by_address() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.retrieve_result_by_address"]], "retrieve_result_by_tax_lot_id() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.retrieve_result_by_tax_lot_id"]], "rules (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.rules"]], "save_to_cache() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.save_to_cache"]], "seed.models.data_quality": [[20, "module-seed.models.data_quality"]], "status_label (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.status_label"]], "status_label_id (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.status_label_id"]], "str_to_data_type() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.str_to_data_type"]], "table_name (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.table_name"]], "text_match (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.text_match"]], "units (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.units"]], "update_status_label() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.update_status_label"]], "valid_text() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.valid_text"]], "notdeletedmanager (class in seed.data_importer.managers)": [[22, "seed.data_importer.managers.NotDeletedManager"]], "get_all() (seed.data_importer.managers.notdeletedmanager method)": [[22, "seed.data_importer.managers.NotDeletedManager.get_all"]], "get_queryset() (seed.data_importer.managers.notdeletedmanager method)": [[22, "seed.data_importer.managers.NotDeletedManager.get_queryset"]], "kbtu_thermal_conversion_factors() (in module seed.data_importer.utils)": [[22, "seed.data_importer.utils.kbtu_thermal_conversion_factors"]], "kgal_water_conversion_factors() (in module seed.data_importer.utils)": [[22, "seed.data_importer.utils.kgal_water_conversion_factors"]], "seed.data_importer": [[22, "module-seed.data_importer"]], "seed.data_importer.managers": [[22, "module-seed.data_importer.managers"]], "seed.data_importer.utils": [[22, "module-seed.data_importer.utils"]], "usage_point_id() (in module seed.data_importer.utils)": [[22, "seed.data_importer.utils.usage_point_id"]], "use_for_related_fields (seed.data_importer.managers.notdeletedmanager attribute)": [[22, "seed.data_importer.managers.NotDeletedManager.use_for_related_fields"]], "customcreateuserform (class in seed.landing.forms)": [[24, "seed.landing.forms.CustomCreateUserForm"]], "customcreateuserform.meta (class in seed.landing.forms)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta"]], "customloginview (class in seed.landing.views)": [[24, "seed.landing.views.CustomLoginView"]], "loginform (class in seed.landing.forms)": [[24, "seed.landing.forms.LoginForm"]], "required_fields (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.REQUIRED_FIELDS"]], "seeduser (class in seed.landing.models)": [[24, "seed.landing.models.SEEDUser"]], "seeduser.doesnotexist": [[24, "seed.landing.models.SEEDUser.DoesNotExist"]], "seeduser.multipleobjectsreturned": [[24, "seed.landing.models.SEEDUser.MultipleObjectsReturned"]], "username_field (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.USERNAME_FIELD"]], "userlogintest (class in seed.landing.tests)": [[24, "seed.landing.tests.UserLoginTest"]], "account_activation_sent() (in module seed.landing.views)": [[24, "seed.landing.views.account_activation_sent"]], "activate() (in module seed.landing.views)": [[24, "seed.landing.views.activate"]], "analysis_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.analysis_set"]], "api_key (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.api_key"]], "base_fields (seed.landing.forms.customcreateuserform attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.base_fields"]], "base_fields (seed.landing.forms.loginform attribute)": [[24, "seed.landing.forms.LoginForm.base_fields"]], "columnmapping_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.columnmapping_set"]], "create_account() (in module seed.landing.views)": [[24, "seed.landing.views.create_account"]], "cycle_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.cycle_set"]], "date_joined (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.date_joined"]], "deactivate_user() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.deactivate_user"]], "declared_fields (seed.landing.forms.customcreateuserform attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.declared_fields"]], "declared_fields (seed.landing.forms.loginform attribute)": [[24, "seed.landing.forms.LoginForm.declared_fields"]], "default_building_detail_custom_columns (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_building_detail_custom_columns"]], "default_custom_columns (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_custom_columns"]], "default_organization (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_organization"]], "default_organization_id (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_organization_id"]], "dispatch() (seed.landing.views.customloginview method)": [[24, "seed.landing.views.CustomLoginView.dispatch"]], "email (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.email"]], "email_user() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.email_user"]], "emaildevice_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.emaildevice_set"]], "fields (seed.landing.forms.customcreateuserform.meta attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta.fields"]], "first_name (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.first_name"]], "generate_key() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.generate_key"]], "get() (seed.landing.views.customloginview method)": [[24, "seed.landing.views.CustomLoginView.get"]], "get_absolute_url() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_absolute_url"]], "get_full_name() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_full_name"]], "get_next_by_date_joined() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_next_by_date_joined"]], "get_previous_by_date_joined() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_previous_by_date_joined"]], "get_short_name() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_short_name"]], "greenassessmentpropertyauditlog_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.greenassessmentpropertyauditlog_set"]], "groups (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.groups"]], "handle_2fa_prompt() (seed.landing.views.customloginview method)": [[24, "seed.landing.views.CustomLoginView.handle_2fa_prompt"]], "handle_auth() (seed.landing.views.customloginview method)": [[24, "seed.landing.views.CustomLoginView.handle_auth"]], "handle_token() (seed.landing.views.customloginview method)": [[24, "seed.landing.views.CustomLoginView.handle_token"]], "id (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.id"]], "importrecord_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.importrecord_set"]], "is_staff (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.is_staff"]], "landing_page() (in module seed.landing.views)": [[24, "seed.landing.views.landing_page"]], "last_name (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.last_name"]], "logentry_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.logentry_set"]], "media (seed.landing.forms.customcreateuserform property)": [[24, "seed.landing.forms.CustomCreateUserForm.media"]], "media (seed.landing.forms.loginform property)": [[24, "seed.landing.forms.LoginForm.media"]], "model (seed.landing.forms.customcreateuserform.meta attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta.model"]], "modified_import_records (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.modified_import_records"]], "notes (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.notes"]], "oauth2_provider_accesstoken (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.oauth2_provider_accesstoken"]], "oauth2_provider_application (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.oauth2_provider_application"]], "oauth2_provider_grant (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.oauth2_provider_grant"]], "oauth2_provider_refreshtoken (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.oauth2_provider_refreshtoken"]], "objects (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.objects"]], "organizationuser_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.organizationuser_set"]], "orgs (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.orgs"]], "password_reset() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset"]], "password_reset_complete() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset_complete"]], "password_reset_confirm() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset_confirm"]], "password_reset_done() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset_done"]], "password_set() (in module seed.landing.views)": [[24, "seed.landing.views.password_set"]], "phonedevice_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.phonedevice_set"]], "post() (seed.landing.views.customloginview method)": [[24, "seed.landing.views.CustomLoginView.post"]], "postofficeemail_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.postofficeemail_set"]], "postofficeemailtemplate_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.postofficeemailtemplate_set"]], "process_header_request() (seed.landing.models.seeduser class method)": [[24, "seed.landing.models.SEEDUser.process_header_request"]], "prompt_2fa (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.prompt_2fa"]], "save() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.save"]], "seed.landing": [[24, "module-seed.landing"]], "seed.landing.forms": [[24, "module-seed.landing.forms"]], "seed.landing.models": [[24, "module-seed.landing.models"]], "seed.landing.tests": [[24, "module-seed.landing.tests"]], "seed.landing.urls": [[24, "module-seed.landing.urls"]], "seed.landing.views": [[24, "module-seed.landing.views"]], "setup() (seed.landing.tests.userlogintest method)": [[24, "seed.landing.tests.UserLoginTest.setUp"]], "show_shared_buildings (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.show_shared_buildings"]], "signup() (in module seed.landing.views)": [[24, "seed.landing.views.signup"]], "staticdevice_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.staticdevice_set"]], "test_simple_login() (seed.landing.tests.userlogintest method)": [[24, "seed.landing.tests.UserLoginTest.test_simple_login"]], "totpdevice_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.totpdevice_set"]], "user_permissions (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.user_permissions"]], "username (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.username"]], "widgets (seed.landing.forms.customcreateuserform.meta attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta.widgets"]], "seed.landing.management": [[25, "module-seed.landing.management"]], "seed.landing.management.commands": [[26, "module-seed.landing.management.commands"]], "seed.lib": [[27, "module-seed.lib"]], "seed.lib.mappings": [[27, "module-seed.lib.mappings"], [28, "module-seed.lib.mappings"]], "seed.lib.merging": [[27, "module-seed.lib.merging"], [29, "module-seed.lib.merging"]], "mappingcolumns (class in seed.lib.mappings.mapping_columns)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns"]], "add_mappings() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.add_mappings"]], "apply_threshold() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.apply_threshold"]], "create_column_regexes() (in module seed.lib.mappings.mapper)": [[28, "seed.lib.mappings.mapper.create_column_regexes"]], "duplicates (seed.lib.mappings.mapping_columns.mappingcolumns property)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.duplicates"]], "final_mappings (seed.lib.mappings.mapping_columns.mappingcolumns property)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.final_mappings"]], "first_suggested_mapping() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.first_suggested_mapping"]], "get_pm_mapping() (in module seed.lib.mappings.mapper)": [[28, "seed.lib.mappings.mapper.get_pm_mapping"]], "resolve_duplicate() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.resolve_duplicate"]], "seed.lib.mappings.mapper": [[28, "module-seed.lib.mappings.mapper"]], "seed.lib.mappings.mapping_columns": [[28, "module-seed.lib.mappings.mapping_columns"]], "set_initial_mapping_cmp() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.set_initial_mapping_cmp"]], "sort_duplicates() (in module seed.lib.mappings.mapping_columns)": [[28, "seed.lib.mappings.mapping_columns.sort_duplicates"]], "get_attrs_with_mapping() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_attrs_with_mapping"]], "get_propertystate_attrs() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_propertystate_attrs"]], "get_state_attrs() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_state_attrs"]], "get_state_to_state_tuple() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_state_to_state_tuple"]], "get_taxlotstate_attrs() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_taxlotstate_attrs"]], "merge_state() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.merge_state"]], "seed.lib.merging.merging": [[29, "module-seed.lib.merging.merging"]], "seed.management": [[30, "module-seed.management"]], "blue_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.BLUE_CHOICE"]], "color_choices (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.COLOR_CHOICES"]], "column_exclude_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_EXCLUDE_FIELDS"]], "column_merge_favor_existing (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_MERGE_FAVOR_EXISTING"]], "column_merge_favor_new (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_MERGE_FAVOR_NEW"]], "column_merge_protection (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_MERGE_PROTECTION"]], "column (class in seed.models.columns)": [[34, "seed.models.columns.Column"]], "column.doesnotexist": [[34, "seed.models.columns.Column.DoesNotExist"]], "column.multipleobjectsreturned": [[34, "seed.models.columns.Column.MultipleObjectsReturned"]], "columncasterror": [[34, "seed.models.columns.ColumnCastError"]], "cycle (class in seed.models.cycles)": [[34, "seed.models.cycles.Cycle"]], "cycle.doesnotexist": [[34, "seed.models.cycles.Cycle.DoesNotExist"]], "cycle.multipleobjectsreturned": [[34, "seed.models.cycles.Cycle.MultipleObjectsReturned"]], "database_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.DATABASE_COLUMNS"]], "data_type_parsers (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.DATA_TYPE_PARSERS"]], "date (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.DATE"]], "datetime (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.DATETIME"]], "decimal (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.DECIMAL"]], "default_labels (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.DEFAULT_LABELS"]], "excluded_column_return_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_COLUMN_RETURN_FIELDS"]], "excluded_mapping_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_MAPPING_FIELDS"]], "excluded_rename_from_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_RENAME_FROM_FIELDS"]], "excluded_rename_to_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_RENAME_TO_FIELDS"]], "float (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.FLOAT"]], "gray_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.GRAY_CHOICE"]], "green_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.GREEN_CHOICE"]], "integer (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.INTEGER"]], "internal_type_to_data_type (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.INTERNAL_TYPE_TO_DATA_TYPE"]], "light_blue_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.LIGHT_BLUE_CHOICE"]], "orange_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.ORANGE_CHOICE"]], "pinned_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.PINNED_COLUMNS"]], "property (class in seed.models.properties)": [[34, "seed.models.properties.Property"]], "property.doesnotexist": [[34, "seed.models.properties.Property.DoesNotExist"]], "property.multipleobjectsreturned": [[34, "seed.models.properties.Property.MultipleObjectsReturned"]], "propertyauditlog (class in seed.models.properties)": [[34, "seed.models.properties.PropertyAuditLog"]], "propertyauditlog.doesnotexist": [[34, "seed.models.properties.PropertyAuditLog.DoesNotExist"]], "propertyauditlog.multipleobjectsreturned": [[34, "seed.models.properties.PropertyAuditLog.MultipleObjectsReturned"]], "propertystate (class in seed.models.properties)": [[34, "seed.models.properties.PropertyState"]], "propertystate.doesnotexist": [[34, "seed.models.properties.PropertyState.DoesNotExist"]], "propertystate.multipleobjectsreturned": [[34, "seed.models.properties.PropertyState.MultipleObjectsReturned"]], "propertyview (class in seed.models.properties)": [[34, "seed.models.properties.PropertyView"]], "propertyview.doesnotexist": [[34, "seed.models.properties.PropertyView.DoesNotExist"]], "propertyview.multipleobjectsreturned": [[34, "seed.models.properties.PropertyView.MultipleObjectsReturned"]], "propertyviewlabel (class in seed.models.properties)": [[34, "seed.models.properties.PropertyViewLabel"]], "propertyviewlabel.doesnotexist": [[34, "seed.models.properties.PropertyViewLabel.DoesNotExist"]], "propertyviewlabel.multipleobjectsreturned": [[34, "seed.models.properties.PropertyViewLabel.MultipleObjectsReturned"]], "quantity_unit_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.QUANTITY_UNIT_COLUMNS"]], "red_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.RED_CHOICE"]], "shared_field_types (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.SHARED_FIELD_TYPES"]], "shared_none (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.SHARED_NONE"]], "shared_public (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.SHARED_PUBLIC"]], "string (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.STRING"]], "statuslabel (class in seed.models.models)": [[34, "seed.models.models.StatusLabel"]], "statuslabel.doesnotexist": [[34, "seed.models.models.StatusLabel.DoesNotExist"]], "statuslabel.multipleobjectsreturned": [[34, "seed.models.models.StatusLabel.MultipleObjectsReturned"]], "taxlot (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLot"]], "taxlot.doesnotexist": [[34, "seed.models.tax_lots.TaxLot.DoesNotExist"]], "taxlot.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLot.MultipleObjectsReturned"]], "taxlotauditlog (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLotAuditLog"]], "taxlotauditlog.doesnotexist": [[34, "seed.models.tax_lots.TaxLotAuditLog.DoesNotExist"]], "taxlotauditlog.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLotAuditLog.MultipleObjectsReturned"]], "taxlotstate (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLotState"]], "taxlotstate.doesnotexist": [[34, "seed.models.tax_lots.TaxLotState.DoesNotExist"]], "taxlotstate.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLotState.MultipleObjectsReturned"]], "taxlotview (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLotView"]], "taxlotview.doesnotexist": [[34, "seed.models.tax_lots.TaxLotView.DoesNotExist"]], "taxlotview.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLotView.MultipleObjectsReturned"]], "unit_types (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.UNIT_TYPES"]], "unmappable_property_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.UNMAPPABLE_PROPERTY_FIELDS"]], "unmappable_taxlot_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.UNMAPPABLE_TAXLOT_FIELDS"]], "unit (class in seed.models.models)": [[34, "seed.models.models.Unit"]], "unit.doesnotexist": [[34, "seed.models.models.Unit.DoesNotExist"]], "unit.multipleobjectsreturned": [[34, "seed.models.models.Unit.MultipleObjectsReturned"]], "white_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.WHITE_CHOICE"]], "access_level_instance (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.access_level_instance"]], "access_level_instance (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.access_level_instance"]], "access_level_instance_id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.access_level_instance_id"]], "access_level_instance_id (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.access_level_instance_id"]], "account_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.account_name_column"]], "actual_emission_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.actual_emission_column"]], "actual_energy_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.actual_energy_column"]], "address_line_1 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.address_line_1"]], "address_line_1 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.address_line_1"]], "address_line_2 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.address_line_2"]], "address_line_2 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.address_line_2"]], "analysispropertyview (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.analysispropertyview"]], "analysispropertyview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.analysispropertyview_set"]], "analysispropertyview_set (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.analysispropertyview_set"]], "and_filter_groups (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.and_filter_groups"]], "audit_template_building_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.audit_template_building_id"]], "benchmark_id_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.benchmark_id_column"]], "block_number (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.block_number"]], "bounding_box (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.bounding_box"]], "bounding_box (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.bounding_box"]], "building_certification (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.building_certification"]], "building_count (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.building_count"]], "building_files (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.building_files"]], "cast() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.cast"]], "cast_column_value() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.cast_column_value"]], "centroid (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.centroid"]], "centroid (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.centroid"]], "city (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.city"]], "city (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.city"]], "clean() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.clean"]], "clean() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.clean"]], "color (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.color"]], "column_description (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.column_description"]], "column_list_profiles (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.column_list_profiles"]], "column_name (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.column_name"]], "column_set (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.column_set"]], "columnlistprofilecolumn_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.columnlistprofilecolumn_set"]], "compliance_label (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.compliance_label"]], "comstock_mapping (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.comstock_mapping"]], "conditioned_floor_area (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.conditioned_floor_area"]], "conditioned_floor_area_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.conditioned_floor_area_orig"]], "contact_email_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.contact_email_column"]], "contact_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.contact_name_column"]], "coparent() (seed.models.properties.propertystate class method)": [[34, "seed.models.properties.PropertyState.coparent"]], "coparent() (seed.models.tax_lots.taxlotstate class method)": [[34, "seed.models.tax_lots.TaxLotState.coparent"]], "copy_meters() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.copy_meters"]], "create_mappings() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.create_mappings"]], "create_mappings_from_file() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.create_mappings_from_file"]], "created (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.created"]], "created (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.created"]], "created (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.created"]], "created (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.created"]], "created (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.created"]], "created (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.created"]], "created (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.created"]], "created (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.created"]], "custom_id_1 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.custom_id_1"]], "custom_id_1 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.custom_id_1"]], "cycle (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.cycle"]], "cycle (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.cycle"]], "cycle_id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.cycle_id"]], "cycle_id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.cycle_id"]], "cycles (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.cycles"]], "data_admin_account_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_admin_account_name_column"]], "data_admin_email_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_admin_email_column"]], "data_admin_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_admin_name_column"]], "data_loggers (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.data_loggers"]], "data_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.data_state"]], "data_state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.data_state"]], "data_type (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_type"]], "dataview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.dataview_set"]], "dataviewparameter_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.dataviewparameter_set"]], "delete_all() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.delete_all"]], "derived_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derived_column"]], "derived_column_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derived_column_id"]], "derivedcolumn_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derivedcolumn_set"]], "derivedcolumnparameter_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derivedcolumnparameter_set"]], "description (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.description"]], "description (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.description"]], "display_name (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.display_name"]], "district (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.district"]], "egrid_subregion_code (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.egrid_subregion_code"]], "elements (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.elements"]], "end (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.end"]], "energy_alerts (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.energy_alerts"]], "energy_score (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.energy_score"]], "event_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.event_set"]], "events (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.events"]], "exclude_filter_groups (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.exclude_filter_groups"]], "extra_data (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.extra_data"]], "extra_data (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.extra_data"]], "gapauditlog_view (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.gapauditlog_view"]], "generation_date (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.generation_date"]], "geocoding_confidence (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.geocoding_confidence"]], "geocoding_confidence (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.geocoding_confidence"]], "geocoding_order (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.geocoding_order"]], "get_color_display() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_color_display"]], "get_data_state_display() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_data_state_display"]], "get_data_state_display() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_data_state_display"]], "get_merge_protection_display() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_merge_protection_display"]], "get_merge_state_display() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_merge_state_display"]], "get_merge_state_display() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_merge_state_display"]], "get_next_by_created() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_next_by_created"]], "get_next_by_created() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_next_by_created"]], "get_next_by_created() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_next_by_created"]], "get_next_by_created() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_next_by_created"]], "get_next_by_created() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_next_by_created"]], "get_next_by_created() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_next_by_created"]], "get_next_by_created() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_next_by_created"]], "get_next_by_end() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_next_by_end"]], "get_next_by_modified() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_next_by_modified"]], "get_next_by_modified() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_next_by_modified"]], "get_next_by_start() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_next_by_start"]], "get_next_by_updated() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_next_by_updated"]], "get_next_by_updated() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_next_by_updated"]], "get_next_by_updated() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_next_by_updated"]], "get_next_by_updated() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_next_by_updated"]], "get_or_create_default() (seed.models.cycles.cycle class method)": [[34, "seed.models.cycles.Cycle.get_or_create_default"]], "get_previous_by_created() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_previous_by_created"]], "get_previous_by_created() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_previous_by_created"]], "get_previous_by_created() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_previous_by_created"]], "get_previous_by_created() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_previous_by_created"]], "get_previous_by_created() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_previous_by_created"]], "get_previous_by_created() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_previous_by_created"]], "get_previous_by_created() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_previous_by_created"]], "get_previous_by_end() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_previous_by_end"]], "get_previous_by_modified() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_previous_by_modified"]], "get_previous_by_modified() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_previous_by_modified"]], "get_previous_by_start() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_previous_by_start"]], "get_previous_by_updated() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_previous_by_updated"]], "get_previous_by_updated() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_previous_by_updated"]], "get_previous_by_updated() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_previous_by_updated"]], "get_previous_by_updated() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_previous_by_updated"]], "get_record_type_display() (seed.models.properties.propertyauditlog method)": [[34, "seed.models.properties.PropertyAuditLog.get_record_type_display"]], "get_record_type_display() (seed.models.tax_lots.taxlotauditlog method)": [[34, "seed.models.tax_lots.TaxLotAuditLog.get_record_type_display"]], "get_shared_field_type_display() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_shared_field_type_display"]], "get_source_type_display() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_source_type_display"]], "get_unit_type_display() (seed.models.models.unit method)": [[34, "seed.models.models.Unit.get_unit_type_display"]], "goal (seed.models.properties.propertyviewlabel attribute)": [[34, "seed.models.properties.PropertyViewLabel.goal"]], "goal_area_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.goal_area_columns"]], "goal_baseline_cycles (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.goal_baseline_cycles"]], "goal_current_cycles (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.goal_current_cycles"]], "goal_eui_column1s (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.goal_eui_column1s"]], "goal_eui_column2s (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.goal_eui_column2s"]], "goal_eui_column3s (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.goal_eui_column3s"]], "goal_id (seed.models.properties.propertyviewlabel attribute)": [[34, "seed.models.properties.PropertyViewLabel.goal_id"]], "goalnote_set (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.goalnote_set"]], "greenassessmentproperty_set (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.greenassessmentproperty_set"]], "gross_floor_area (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.gross_floor_area"]], "gross_floor_area_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.gross_floor_area_orig"]], "hash_object (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.hash_object"]], "hash_object (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.hash_object"]], "historical_note (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.historical_note"]], "history() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.history"]], "history() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.history"]], "home_energy_score_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.home_energy_score_id"]], "id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.id"]], "id (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.id"]], "id (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.id"]], "id (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.id"]], "id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.id"]], "id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.id"]], "id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.id"]], "id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.id"]], "id (seed.models.properties.propertyviewlabel attribute)": [[34, "seed.models.properties.PropertyViewLabel.id"]], "id (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.id"]], "id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.id"]], "id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.id"]], "id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.id"]], "import_file (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.import_file"]], "import_file (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.import_file"]], "import_file (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.import_file"]], "import_file_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.import_file_id"]], "import_file_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.import_file_id"]], "import_file_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.import_file_id"]], "import_filename (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.import_filename"]], "import_filename (seed.models.properties.propertyview property)": [[34, "seed.models.properties.PropertyView.import_filename"]], "import_filename (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.import_filename"]], "import_filename (seed.models.tax_lots.taxlotview property)": [[34, "seed.models.tax_lots.TaxLotView.import_filename"]], "importfile_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.importfile_set"]], "indication_label (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.indication_label"]], "indoor_water_use (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.indoor_water_use"]], "indoor_wui (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.indoor_wui"]], "initialize_audit_logs() (seed.models.properties.propertyview method)": [[34, "seed.models.properties.PropertyView.initialize_audit_logs"]], "initialize_audit_logs() (seed.models.tax_lots.taxlotview method)": [[34, "seed.models.tax_lots.TaxLotView.initialize_audit_logs"]], "inventory_documents (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.inventory_documents"]], "is_extra_data (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.is_extra_data"]], "is_matching_criteria (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.is_matching_criteria"]], "is_option_for_reports_x_axis (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.is_option_for_reports_x_axis"]], "is_option_for_reports_y_axis (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.is_option_for_reports_y_axis"]], "jurisdiction_property_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.jurisdiction_property_id"]], "jurisdiction_tax_lot_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.jurisdiction_tax_lot_id"]], "labels (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.labels"]], "labels (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.labels"]], "latitude (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.latitude"]], "latitude (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.latitude"]], "long_lat (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.long_lat"]], "long_lat (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.long_lat"]], "longitude (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.longitude"]], "longitude (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.longitude"]], "lot_number (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.lot_number"]], "mapped_mappings (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.mapped_mappings"]], "measure_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.measure_set"]], "measures (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.measures"]], "merge_protection (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.merge_protection"]], "merge_relationships() (seed.models.properties.propertystate class method)": [[34, "seed.models.properties.PropertyState.merge_relationships"]], "merge_relationships() (seed.models.tax_lots.taxlotstate class method)": [[34, "seed.models.tax_lots.TaxLotState.merge_relationships"]], "merge_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.merge_state"]], "merge_state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.merge_state"]], "meters (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.meters"]], "modified (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.modified"]], "name (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.name"]], "name (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.name"]], "name (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.name"]], "name (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.name"]], "normalized_address (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.normalized_address"]], "normalized_address (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.normalized_address"]], "notes (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.notes"]], "notes (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.notes"]], "number_properties (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.number_properties"]], "objects (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.objects"]], "objects (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.objects"]], "objects (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.objects"]], "objects (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.objects"]], "objects (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.objects"]], "objects (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.objects"]], "objects (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.objects"]], "objects (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.objects"]], "objects (seed.models.properties.propertyviewlabel attribute)": [[34, "seed.models.properties.PropertyViewLabel.objects"]], "objects (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.objects"]], "objects (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.objects"]], "objects (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.objects"]], "objects (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.objects"]], "occupied_floor_area (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.occupied_floor_area"]], "occupied_floor_area_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.occupied_floor_area_orig"]], "or_filter_groups (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.or_filter_groups"]], "organization (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.organization"]], "organization (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.organization"]], "organization (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.organization"]], "organization (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.organization"]], "organization (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.organization"]], "organization (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.organization"]], "organization (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.organization"]], "organization (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.organization"]], "organization_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.organization_id"]], "organization_id (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.organization_id"]], "organization_id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.organization_id"]], "organization_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.organization_id"]], "organization_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.organization_id"]], "organization_id (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.organization_id"]], "organization_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.organization_id"]], "organization_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.organization_id"]], "outdoor_water_use (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.outdoor_water_use"]], "owner (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner"]], "owner_address (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_address"]], "owner_city_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_city_state"]], "owner_email (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_email"]], "owner_postal_code (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_postal_code"]], "owner_telephone (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_telephone"]], "parent1 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent1"]], "parent1 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent1"]], "parent1_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent1_id"]], "parent1_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent1_id"]], "parent2 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent2"]], "parent2 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent2"]], "parent2_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent2_id"]], "parent2_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent2_id"]], "parent_property (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.parent_property"]], "parent_property_id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.parent_property_id"]], "parent_state1 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state1"]], "parent_state1 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.parent_state1"]], "parent_state1 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state1"]], "parent_state1_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state1_id"]], "parent_state1_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state1_id"]], "parent_state2 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state2"]], "parent_state2 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.parent_state2"]], "parent_state2 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state2"]], "parent_state2_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state2_id"]], "parent_state2_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state2_id"]], "pm_parent_property_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.pm_parent_property_id"]], "pm_property_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.pm_property_id"]], "post_save_property() (in module seed.models.properties)": [[34, "seed.models.properties.post_save_property"]], "post_save_property_state() (in module seed.models.properties)": [[34, "seed.models.properties.post_save_property_state"]], "post_save_property_view() (in module seed.models.properties)": [[34, "seed.models.properties.post_save_property_view"]], "post_save_taxlot_state() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.post_save_taxlot_state"]], "post_save_taxlot_view() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.post_save_taxlot_view"]], "postal_code (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.postal_code"]], "postal_code (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.postal_code"]], "pre_delete_state() (in module seed.models.properties)": [[34, "seed.models.properties.pre_delete_state"]], "promote() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.promote"]], "promote() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.promote"]], "property (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.property"]], "property_footprint (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_footprint"]], "property_id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.property_id"]], "property_name (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_name"]], "property_notes (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_notes"]], "property_set (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.property_set"]], "property_states() (seed.models.tax_lots.taxlotview method)": [[34, "seed.models.tax_lots.TaxLotView.property_states"]], "property_timezone (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_timezone"]], "property_type (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_type"]], "property_views() (seed.models.tax_lots.taxlotview method)": [[34, "seed.models.tax_lots.TaxLotView.property_views"]], "propertyauditlog_parent1 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.propertyauditlog_parent1"]], "propertyauditlog_parent2 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.propertyauditlog_parent2"]], "propertyauditlog_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.propertyauditlog_state"]], "propertyauditlog_view (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.propertyauditlog_view"]], "propertymeasure_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.propertymeasure_set"]], "propertyview (seed.models.properties.propertyviewlabel attribute)": [[34, "seed.models.properties.PropertyViewLabel.propertyview"]], "propertyview_id (seed.models.properties.propertyviewlabel attribute)": [[34, "seed.models.properties.PropertyViewLabel.propertyview_id"]], "propertyview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.propertyview_set"]], "propertyview_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.propertyview_set"]], "propertyview_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.propertyview_set"]], "propertyviewlabel_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.propertyviewlabel_set"]], "propertyviewlabel_set (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.propertyviewlabel_set"]], "raw_access_level_instance (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.raw_access_level_instance"]], "raw_access_level_instance (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.raw_access_level_instance"]], "raw_access_level_instance_error (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.raw_access_level_instance_error"]], "raw_access_level_instance_error (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.raw_access_level_instance_error"]], "raw_access_level_instance_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.raw_access_level_instance_id"]], "raw_access_level_instance_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.raw_access_level_instance_id"]], "raw_mappings (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.raw_mappings"]], "recent_sale_date (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.recent_sale_date"]], "recognize_empty (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.recognize_empty"]], "record_type (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.record_type"]], "record_type (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.record_type"]], "release_date (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.release_date"]], "rename_column() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.rename_column"]], "retrieve_all() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_all"]], "retrieve_all_by_tuple() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_all_by_tuple"]], "retrieve_db_field_name_for_hash_comparison() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_field_name_for_hash_comparison"]], "retrieve_db_field_table_and_names_from_db_tables() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_field_table_and_names_from_db_tables"]], "retrieve_db_fields() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_fields"]], "retrieve_db_fields_from_db_tables() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_fields_from_db_tables"]], "retrieve_db_types() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_types"]], "retrieve_mapping_columns() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_mapping_columns"]], "retrieve_priorities() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_priorities"]], "rule_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.rule_set"]], "salesforce_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.salesforce_column"]], "save() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.save"]], "save() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.save"]], "save() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.save"]], "save_column_names() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.save_column_names"]], "scenarios (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.scenarios"]], "seed.models.auditlog": [[34, "module-seed.models.auditlog"]], "seed.models.columns": [[34, "module-seed.models.columns"]], "seed.models.cycles": [[34, "module-seed.models.cycles"]], "seed.models.models": [[34, "module-seed.models.models"]], "seed.models.properties": [[34, "module-seed.models.properties"]], "seed.models.tax_lots": [[34, "module-seed.models.tax_lots"]], "set_default_access_level_instance() (in module seed.models.properties)": [[34, "seed.models.properties.set_default_access_level_instance"]], "set_default_access_level_instance() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.set_default_access_level_instance"]], "shared_field_type (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.shared_field_type"]], "show_in_list (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.show_in_list"]], "simulation (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.simulation"]], "site_eui (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui"]], "site_eui_modeled (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_modeled"]], "site_eui_modeled_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_modeled_orig"]], "site_eui_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_orig"]], "site_eui_weather_normalized (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_weather_normalized"]], "site_eui_weather_normalized_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_weather_normalized_orig"]], "source_eui (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui"]], "source_eui_modeled (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_modeled"]], "source_eui_modeled_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_modeled_orig"]], "source_eui_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_orig"]], "source_eui_weather_normalized (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_weather_normalized"]], "source_eui_weather_normalized_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_weather_normalized_orig"]], "source_type (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_type"]], "space_alerts (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.space_alerts"]], "start (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.start"]], "state (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.state"]], "state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.state"]], "state (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.state"]], "state (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.state"]], "state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.state"]], "state (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.state"]], "state_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.state_id"]], "state_id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.state_id"]], "state_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.state_id"]], "state_id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.state_id"]], "statuslabel (seed.models.properties.propertyviewlabel attribute)": [[34, "seed.models.properties.PropertyViewLabel.statuslabel"]], "statuslabel_id (seed.models.properties.propertyviewlabel attribute)": [[34, "seed.models.properties.PropertyViewLabel.statuslabel_id"]], "super_organization (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.super_organization"]], "super_organization_id (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.super_organization_id"]], "sync_latitude_longitude_and_long_lat() (in module seed.models.properties)": [[34, "seed.models.properties.sync_latitude_longitude_and_long_lat"]], "sync_latitude_longitude_and_long_lat() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.sync_latitude_longitude_and_long_lat"]], "table_name (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.table_name"]], "target_emission_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.target_emission_column"]], "target_energy_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.target_energy_column"]], "tax_lot_states() (seed.models.properties.propertyview method)": [[34, "seed.models.properties.PropertyView.tax_lot_states"]], "tax_lot_views() (seed.models.properties.propertyview method)": [[34, "seed.models.properties.PropertyView.tax_lot_views"]], "taxlot (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlot"]], "taxlot_footprint (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlot_footprint"]], "taxlot_id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlot_id"]], "taxlotauditlog_parent1 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.taxlotauditlog_parent1"]], "taxlotauditlog_parent2 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.taxlotauditlog_parent2"]], "taxlotauditlog_parent_state1 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotauditlog_parent_state1"]], "taxlotauditlog_parent_state2 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotauditlog_parent_state2"]], "taxlotauditlog_state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotauditlog_state"]], "taxlotauditlog_view (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlotauditlog_view"]], "taxlotproperty_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.taxlotproperty_set"]], "taxlotproperty_set (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.taxlotproperty_set"]], "taxlotproperty_set (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlotproperty_set"]], "taxlotview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.taxlotview_set"]], "taxlotview_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.taxlotview_set"]], "taxlotview_set (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotview_set"]], "to_dict() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.to_dict"]], "to_dict() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.to_dict"]], "to_dict() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.to_dict"]], "total_ghg_emissions (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_ghg_emissions"]], "total_ghg_emissions_intensity (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_ghg_emissions_intensity"]], "total_marginal_ghg_emissions (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_marginal_ghg_emissions"]], "total_marginal_ghg_emissions_intensity (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_marginal_ghg_emissions_intensity"]], "ubid (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.ubid"]], "ubid (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.ubid"]], "ubidmodel_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.ubidmodel_set"]], "ubidmodel_set (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.ubidmodel_set"]], "unit (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.unit"]], "unit_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.unit_id"]], "unit_name (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.unit_name"]], "unit_type (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.unit_type"]], "units_pint (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.units_pint"]], "updated (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.updated"]], "updated (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.updated"]], "updated (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.updated"]], "updated (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.updated"]], "use_description (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.use_description"]], "user (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.user"]], "user_id (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.user_id"]], "validate_model() (in module seed.models.columns)": [[34, "seed.models.columns.validate_model"]], "view (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.view"]], "view (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.view"]], "view_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.view_id"]], "view_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.view_id"]], "views (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.views"]], "views (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.views"]], "violation_label (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.violation_label"]], "water_use (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.water_use"]], "wui (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.wui"]], "x_axis_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.x_axis_columns"]], "year_built (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.year_built"]], "year_ending (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.year_ending"]], "seed.public": [[35, "module-seed.public"]], "celerydatetimeserializer (class in seed.serializers.celery)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer"]], "labelserializer (class in seed.serializers.labels)": [[36, "seed.serializers.labels.LabelSerializer"]], "labelserializer.meta (class in seed.serializers.labels)": [[36, "seed.serializers.labels.LabelSerializer.Meta"]], "default() (seed.serializers.celery.celerydatetimeserializer method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.default"]], "extra_kwargs (seed.serializers.labels.labelserializer.meta attribute)": [[36, "seed.serializers.labels.LabelSerializer.Meta.extra_kwargs"]], "fields (seed.serializers.labels.labelserializer.meta attribute)": [[36, "seed.serializers.labels.LabelSerializer.Meta.fields"]], "get_is_applied() (seed.serializers.labels.labelserializer method)": [[36, "seed.serializers.labels.LabelSerializer.get_is_applied"]], "model (seed.serializers.labels.labelserializer.meta attribute)": [[36, "seed.serializers.labels.LabelSerializer.Meta.model"]], "seed.serializers": [[36, "module-seed.serializers"]], "seed.serializers.celery": [[36, "module-seed.serializers.celery"]], "seed.serializers.labels": [[36, "module-seed.serializers.labels"]], "seed_decoder() (seed.serializers.celery.celerydatetimeserializer static method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.seed_decoder"]], "seed_dumps() (seed.serializers.celery.celerydatetimeserializer static method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.seed_dumps"]], "seed_loads() (seed.serializers.celery.celerydatetimeserializer static method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.seed_loads"]], "to_representation() (seed.serializers.labels.labelserializer method)": [[36, "seed.serializers.labels.LabelSerializer.to_representation"]], "breadcrumbnode (class in seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.BreadcrumbNode"]], "urlbreadcrumbnode (class in seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.UrlBreadcrumbNode"]], "breadcrumb() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb"]], "breadcrumb_root() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb_root"]], "breadcrumb_url() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb_url"]], "breadcrumb_url_root() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb_url_root"]], "create_crumb() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.create_crumb"]], "create_crumb_first() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.create_crumb_first"]], "render() (seed.templatetags.breadcrumbs.breadcrumbnode method)": [[37, "seed.templatetags.breadcrumbs.BreadcrumbNode.render"]], "render() (seed.templatetags.breadcrumbs.urlbreadcrumbnode method)": [[37, "seed.templatetags.breadcrumbs.UrlBreadcrumbNode.render"]], "seed.templatetags.breadcrumbs": [[37, "module-seed.templatetags.breadcrumbs"]], "seed.test_helpers": [[38, "module-seed.test_helpers"]], "djangofunctionalfactory (class in seed.test_helpers.factory.helpers)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory"]], "invalid_test_cc_number() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.invalid_test_cc_number"]], "rand_bool() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_bool"]], "rand_city() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_city"]], "rand_city_suffix() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_city_suffix"]], "rand_currency() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_currency"]], "rand_date() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_date"]], "rand_domain() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_domain"]], "rand_email() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_email"]], "rand_float() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_float"]], "rand_int() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_int"]], "rand_name() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_name"]], "rand_phone() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_phone"]], "rand_plant_name() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_plant_name"]], "rand_str() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_str"]], "rand_street_address() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_street_address"]], "rand_street_suffix() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_street_suffix"]], "seed.test_helpers.factory.helpers": [[39, "module-seed.test_helpers.factory.helpers"]], "test_cc_number() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.test_cc_number"]], "valid_test_cc_number() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.valid_test_cc_number"]], "accesslevelbasetestcase (class in seed.tests.util)": [[41, "seed.tests.util.AccessLevelBaseTestCase"]], "adminviewstest (class in seed.tests.test_admin_views)": [[41, "seed.tests.test_admin_views.AdminViewsTest"]], "assertdictsubsetmixin (class in seed.tests.util)": [[41, "seed.tests.util.AssertDictSubsetMixin"]], "classdecoratortests (class in seed.tests.test_decorators)": [[41, "seed.tests.test_decorators.ClassDecoratorTests"]], "datamappingbasetestcase (class in seed.tests.util)": [[41, "seed.tests.util.DataMappingBaseTestCase"]], "datasetpermissionstests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.DatasetPermissionsTests"]], "deletemodelstestcase (class in seed.tests.util)": [[41, "seed.tests.util.DeleteModelsTestCase"]], "fakeclient (class in seed.tests.util)": [[41, "seed.tests.util.FakeClient"]], "fakerequest (class in seed.tests.util)": [[41, "seed.tests.util.FakeRequest"]], "get (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.GET"]], "getdatasetsviewstests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.GetDatasetsViewsTests"]], "importfileviewstests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.ImportFileViewsTests"]], "inventoryviewtests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.InventoryViewTests"]], "meta (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.META"]], "mainviewtests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.MainViewTests"]], "post (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.POST"]], "requireorganizationidtests (class in seed.tests.test_decorators)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests"]], "testdecorators (class in seed.tests.test_decorators)": [[41, "seed.tests.test_decorators.TestDecorators"]], "testerror": [[41, "seed.tests.test_decorators.TestError"]], "testmcmviews (class in seed.tests.test_views)": [[41, "seed.tests.test_views.TestMCMViews"]], "testtasks (class in seed.tests.test_tasks)": [[41, "seed.tests.test_tasks.TestTasks"]], "assertdictcontainssubset() (seed.tests.util.assertdictsubsetmixin method)": [[41, "seed.tests.util.AssertDictSubsetMixin.assertDictContainsSubset"]], "assert_expected_mappings() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.assert_expected_mappings"]], "body (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.body"]], "create_import_file() (seed.tests.util.datamappingbasetestcase method)": [[41, "seed.tests.util.DataMappingBaseTestCase.create_import_file"]], "expected_mappings (seed.tests.test_views.testmcmviews attribute)": [[41, "seed.tests.test_views.TestMCMViews.expected_mappings"]], "get() (seed.tests.util.fakeclient method)": [[41, "seed.tests.util.FakeClient.get"]], "locked (seed.tests.test_decorators.testdecorators attribute)": [[41, "seed.tests.test_decorators.TestDecorators.locked"]], "login_as_child_member() (seed.tests.util.accesslevelbasetestcase method)": [[41, "seed.tests.util.AccessLevelBaseTestCase.login_as_child_member"]], "login_as_root_member() (seed.tests.util.accesslevelbasetestcase method)": [[41, "seed.tests.util.AccessLevelBaseTestCase.login_as_root_member"]], "login_as_root_owner() (seed.tests.util.accesslevelbasetestcase method)": [[41, "seed.tests.util.AccessLevelBaseTestCase.login_as_root_owner"]], "path (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.path"]], "pk (seed.tests.test_decorators.testdecorators attribute)": [[41, "seed.tests.test_decorators.TestDecorators.pk"]], "post() (seed.tests.util.fakeclient method)": [[41, "seed.tests.util.FakeClient.post"]], "raw_columns_expected (seed.tests.test_views.testmcmviews attribute)": [[41, "seed.tests.test_views.TestMCMViews.raw_columns_expected"]], "seed.tests.test_admin_views": [[41, "module-seed.tests.test_admin_views"]], "seed.tests.test_decorators": [[41, "module-seed.tests.test_decorators"]], "seed.tests.test_tasks": [[41, "module-seed.tests.test_tasks"]], "seed.tests.test_views": [[41, "module-seed.tests.test_views"]], "seed.tests.util": [[41, "module-seed.tests.util"]], "setup() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.setUp"]], "setup() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.setUp"]], "setup() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.setUp"]], "setup() (seed.tests.test_tasks.testtasks method)": [[41, "seed.tests.test_tasks.TestTasks.setUp"]], "setup() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.setUp"]], "setup() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.setUp"]], "setup() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.setUp"]], "setup() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.setUp"]], "setup() (seed.tests.test_views.mainviewtests method)": [[41, "seed.tests.test_views.MainViewTests.setUp"]], "setup() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.setUp"]], "setup() (seed.tests.util.accesslevelbasetestcase method)": [[41, "seed.tests.util.AccessLevelBaseTestCase.setUp"]], "setup() (seed.tests.util.deletemodelstestcase method)": [[41, "seed.tests.util.DeleteModelsTestCase.setUp"]], "set_up() (seed.tests.util.datamappingbasetestcase method)": [[41, "seed.tests.util.DataMappingBaseTestCase.set_up"]], "teardown() (seed.tests.util.deletemodelstestcase method)": [[41, "seed.tests.util.DeleteModelsTestCase.tearDown"]], "test_add_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_org"]], "test_add_org_dupe() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_org_dupe"]], "test_add_owner_existing_org_to_non_root() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_owner_existing_org_to_non_root"]], "test_add_user_existing_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_user_existing_org"]], "test_add_user_new_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_user_new_org"]], "test_add_user_no_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_user_no_org"]], "test_ajax_request_class_dict() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_dict"]], "test_ajax_request_class_dict_status_error() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_dict_status_error"]], "test_ajax_request_class_dict_status_false() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_dict_status_false"]], "test_ajax_request_class_format_type() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_format_type"]], "test_create_dataset() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_create_dataset"]], "test_dataset_count() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_count"]], "test_dataset_create() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_create"]], "test_dataset_destroy() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_destroy"]], "test_dataset_list() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_list"]], "test_dataset_retrieve() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_retrieve"]], "test_dataset_update() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_update"]], "test_delete_dataset() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_delete_dataset"]], "test_delete_file() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.test_delete_file"]], "test_delete_organization() (seed.tests.test_tasks.testtasks method)": [[41, "seed.tests.test_tasks.TestTasks.test_delete_organization"]], "test_get_column_mapping_suggestions() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_column_mapping_suggestions"]], "test_get_column_mapping_suggestions_pm_file() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_column_mapping_suggestions_pm_file"]], "test_get_column_mapping_suggestions_with_columns() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_column_mapping_suggestions_with_columns"]], "test_get_cycles() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_cycles"]], "test_get_dataset() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_dataset"]], "test_get_datasets() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_datasets"]], "test_get_datasets_count() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_datasets_count"]], "test_get_datasets_count_invalid() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_datasets_count_invalid"]], "test_get_import_file() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.test_get_import_file"]], "test_get_matching_and_geocoding_results() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.test_get_matching_and_geocoding_results"]], "test_get_prog_key() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_get_prog_key"]], "test_get_properties() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties"]], "test_get_properties_cycle_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_cycle_id"]], "test_get_properties_empty_page() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_empty_page"]], "test_get_properties_page_not_an_integer() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_page_not_an_integer"]], "test_get_properties_pint_fields() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_pint_fields"]], "test_get_properties_profile_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_profile_id"]], "test_get_properties_property_extra_data() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_property_extra_data"]], "test_get_properties_select_all() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_select_all"]], "test_get_properties_taxlot_extra_data() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_taxlot_extra_data"]], "test_get_properties_with_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_with_taxlots"]], "test_get_properties_with_taxlots_with_footprints() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_with_taxlots_with_footprints"]], "test_get_properties_wrong_query_params() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_wrong_query_params"]], "test_get_property() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_property"]], "test_get_property_columns() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_property_columns"]], "test_get_property_multiple_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_property_multiple_taxlots"]], "test_get_raw_column_names() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_raw_column_names"]], "test_get_taxlot() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlot"]], "test_get_taxlot_columns() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlot_columns"]], "test_get_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots"]], "test_get_taxlots_empty_page() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_empty_page"]], "test_get_taxlots_extra_data() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_extra_data"]], "test_get_taxlots_multiple_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_multiple_taxlots"]], "test_get_taxlots_no_cycle_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_no_cycle_id"]], "test_get_taxlots_page_not_an_integer() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_page_not_an_integer"]], "test_get_taxlots_profile_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_profile_id"]], "test_home() (seed.tests.test_views.mainviewtests method)": [[41, "seed.tests.test_views.MainViewTests.test_home"]], "test_increment_cache() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_increment_cache"]], "test_locking() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_locking"]], "test_locking_w_exception() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_locking_w_exception"]], "test_postoffice() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_postoffice"]], "test_progress() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_progress"]], "test_progress() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_progress"]], "test_require_organization_id_class_no_org_id() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_require_organization_id_class_no_org_id"]], "test_require_organization_id_class_org_id() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_require_organization_id_class_org_id"]], "test_require_organization_id_class_org_id_not_int() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_require_organization_id_class_org_id_not_int"]], "test_require_organization_id_fail_no_key() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_fail_no_key"]], "test_require_organization_id_fail_not_numeric() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_fail_not_numeric"]], "test_require_organization_id_success_integer() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_success_integer"]], "test_require_organization_id_success_string() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_success_string"]], "test_save_column_mappings() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_save_column_mappings"]], "test_save_column_mappings_idempotent() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_save_column_mappings_idempotent"]], "test_signup_process() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_signup_process"]], "test_signup_process_force_lowercase_email() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_signup_process_force_lowercase_email"]], "test_update_dataset() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_update_dataset"]], "test_update_pint_fields_with_modified_display_settings() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_update_pint_fields_with_modified_display_settings"]], "unlocked (seed.tests.test_decorators.testdecorators attribute)": [[41, "seed.tests.test_decorators.TestDecorators.unlocked"]], "apibypasscsrfmiddleware (class in seed.utils.api)": [[44, "seed.utils.api.APIBypassCSRFMiddleware"]], "orgcreatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgCreateMixin"]], "orgcreateupdatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgCreateUpdateMixin"]], "orgmixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgMixin"]], "orgquerysetmixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgQuerySetMixin"]], "orgupdatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgUpdateMixin"]], "orgvalidatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgValidateMixin"]], "orgvalidator (class in seed.utils.api)": [[44, "seed.utils.api.OrgValidator"]], "profileidmixin (class in seed.utils.api)": [[44, "seed.utils.api.ProfileIdMixin"]], "api_endpoint() (in module seed.utils.api)": [[44, "seed.utils.api.api_endpoint"]], "api_endpoint_class() (in module seed.utils.api)": [[44, "seed.utils.api.api_endpoint_class"]], "clean_api_regex() (in module seed.utils.api)": [[44, "seed.utils.api.clean_api_regex"]], "convert_datestr() (in module seed.utils.time)": [[44, "seed.utils.time.convert_datestr"]], "convert_to_js_timestamp() (in module seed.utils.time)": [[44, "seed.utils.time.convert_to_js_timestamp"]], "create_organization() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.create_organization"]], "create_suborganization() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.create_suborganization"]], "default_pm_mappings() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.default_pm_mappings"]], "drf_api_endpoint() (in module seed.utils.api)": [[44, "seed.utils.api.drf_api_endpoint"]], "field (seed.utils.api.orgvalidator attribute)": [[44, "seed.utils.api.OrgValidator.field"]], "format_api_docstring() (in module seed.utils.api)": [[44, "seed.utils.api.format_api_docstring"]], "get_all_urls() (in module seed.utils.api)": [[44, "seed.utils.api.get_all_urls"]], "get_api_endpoints() (in module seed.utils.api)": [[44, "seed.utils.api.get_api_endpoints"]], "get_api_request_user() (in module seed.utils.api)": [[44, "seed.utils.api.get_api_request_user"]], "get_org_id_from_validator() (in module seed.utils.api)": [[44, "seed.utils.api.get_org_id_from_validator"]], "get_organization() (seed.utils.api.orgmixin method)": [[44, "seed.utils.api.OrgMixin.get_organization"]], "get_parent_org() (seed.utils.api.orgmixin method)": [[44, "seed.utils.api.OrgMixin.get_parent_org"]], "get_queryset() (seed.utils.api.orgquerysetmixin method)": [[44, "seed.utils.api.OrgQuerySetMixin.get_queryset"]], "get_show_columns() (seed.utils.api.profileidmixin method)": [[44, "seed.utils.api.ProfileIdMixin.get_show_columns"]], "get_source_type() (in module seed.utils.buildings)": [[44, "seed.utils.buildings.get_source_type"]], "key (seed.utils.api.orgvalidator attribute)": [[44, "seed.utils.api.OrgValidator.key"]], "parse_datetime() (in module seed.utils.time)": [[44, "seed.utils.time.parse_datetime"]], "perform_create() (seed.utils.api.orgcreatemixin method)": [[44, "seed.utils.api.OrgCreateMixin.perform_create"]], "perform_update() (seed.utils.api.orgupdatemixin method)": [[44, "seed.utils.api.OrgUpdateMixin.perform_update"]], "rgetattr() (in module seed.utils.api)": [[44, "seed.utils.api.rgetattr"]], "seed.utils.api": [[44, "module-seed.utils.api"]], "seed.utils.buildings": [[44, "module-seed.utils.buildings"]], "seed.utils.organizations": [[44, "module-seed.utils.organizations"]], "seed.utils.time": [[44, "module-seed.utils.time"]], "set_default_2fa_method() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.set_default_2fa_method"]], "validate() (seed.utils.api.orgvalidatemixin method)": [[44, "seed.utils.api.OrgValidateMixin.validate"]], "validate_org() (seed.utils.api.orgvalidatemixin method)": [[44, "seed.utils.api.OrgValidateMixin.validate_org"]]}}) \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/setup_docker.html b/docs/code_documentation/3.1.0/setup_docker.html new file mode 100644 index 00000000..0739bf7f --- /dev/null +++ b/docs/code_documentation/3.1.0/setup_docker.html @@ -0,0 +1,254 @@ + + + + + + + Installation using Docker — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Installation using Docker

+

Docker works natively on Linux, Mac OSX, and Windows 10. If you are using an older version of +Windows (and some older versions of Mac OSX), you will need to install Docker Toolbox.

+

Choose either Docker Native (Windows/OSX) or Docker Native (Ubuntu) to +install Docker.

+
+

Docker Native (Ubuntu)

+

Follow instructions here.

+ +
+
+

Docker Native (Windows/OSX)

+

Following instructions for Mac or +for Windows. Note that for OSX you must have docker desktop version 3.0 or later <https://github.com/concourse/concourse/issues/6038>.

+ +
+
+

Building and Running Containers for Non-Development

+
    +
  • Run Docker Compose

    +
    +
    docker compose build
    +
    +
    +

    Be Patient … If the containers build successfully, then start the containers

    +
    docker volume create --name=seed_pgdata
    +docker volume create --name=seed_media
    +docker compose up
    +
    +
    +

    Note that you may need to build the containers a couple times for everything to converge

    +
    +
  • +
  • Login to container

    +
    +

    The docker-compose file creates a default user and password. Below are the defaults but can +be overridden by setting environment variables.

    +
    username: user@seed-platform.org
    +password: super-secret-password
    +
    +
    +
    +
  • +
+
+

Note

+

Don’t forget that you need to reset your default username and password if you are going +to use these Docker images in production mode!

+
+
+
+

Using Docker for Development

+

The development environment is configured for live reloading (i.e., restart webserver when files change) +and debugging. It builds off the base docker-compose.yml, so it’s necessary +to specify the files being used in docker-compose commands as seen below.

+
+

Build

+
# create volumes for the database and media directory
+docker volume create --name=seed_pgdata
+docker volume create --name=seed_media
+
+# build the images
+docker compose -f docker-compose.yml -f docker-compose.dev.yml build
+
+
+
+
+

Running the Server

+

NOTE: the server config is sourced from config.settings.docker_dev, which will include +your local_untracked.py if it exists. If you have a local_untracked.py, make sure it doesn’t +overwrite the database or celery configuration!

+
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
+
+
+

If the server doesn’t start successfully, and docker compose logs doesn’t help, +the django development server probably failed to start due to an error in your config or code. +Unfortunately docker/django logging doesn’t appear to work when the container is first started. +Just try running the server yourself with docker exec, and see what the output is.

+

The development docker-compose file has some configurable parameters for specifying volumes to use:

+
    +
  • SEED_DB_VOLUME: the name of the docker volume to mount for postgres

  • +
  • SEED_MEDIA_VOLUME: the name of the docker volume to mount for the seed media folder

  • +
+

Docker will use environment variables from the shell or from a .env file to set these values.

+

This is useful if you want to switch between different databases for testing. +For example, if you want to create a separate volume for storing a production backup, you could do the following

+
docker volume create --name=seed_pgdata_prod
+SEED_DB_VOLUME=seed_pgdata_prod docker compose -f docker-compose.yml -f docker-compose.dev.yml up
+
+
+

NOTE: you’ll need to run docker compose down to remove the containers before you +can restart the containers connecting to different volumes.

+
+
+

Running Tests

+

While the containers are running (i.e., after running the docker compose up command), use docker exec to run tests in the web container:

+
docker exec -it seed_web ./manage.py test --settings config.settings.docker_dev
+
+
+

Add the setting --nocapture in order to see stdout while running tests. You will need to do this in order to make use of debugging as described below or the output to your debug commands will not display until after the break point has passed and the tests are finished.

+

Also worth noting: output from logging (_log.debug, etc) will not display in any situation unless a test fails.

+
+
+

Debugging

+

To use pdb on the server, the web container has remote-pdb installed. +In your code, insert the following

+
import remote_pdb; remote_pdb.set_trace()
+
+
+

Once the breakpoint is triggered, you should see the web container log something like “RemotePdb session open at 127.0.0.1:41653, waiting for connection …”. +To connect to the remote session, run netcat from inside the container (using the appropriate port).

+
docker exec -it seed_web nc 127.0.0.1:41653
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/setup_osx.html b/docs/code_documentation/3.1.0/setup_osx.html new file mode 100644 index 00000000..0d4e4569 --- /dev/null +++ b/docs/code_documentation/3.1.0/setup_osx.html @@ -0,0 +1,467 @@ + + + + + + + Installation on OSX — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Installation on OSX

+

These instructions are for installing and running SEED on Mac OSX in +development mode.

+
+

Quick Installation Instructions

+

This section is intended for developers who may already have their machine +ready for general development. If this is not the case, skip to Prerequisites. Note that SEED uses python 3.

+
    +
  • install Postgres 11.1 and redis for cache and message broker

  • +
  • install PostGIS 2.5 and enable it on the database using CREATE EXTENSION postgis;

  • +
  • install TimescaleDB 1.5.0

  • +
  • use a virtualenv (if desired)

  • +
  • git clone git@github.com:seed-platform/seed.git

  • +
  • create a local_untracked.py in the config/settings folder and add CACHE and DB config (example local_untracked.py.dist)

  • +
  • to enable geocoding, get MapQuest API key and attach it to your organization

  • +
  • export DJANGO_SETTINGS_MODULE=config.settings.dev in all terminals used by SEED (celery terminal and runserver terminal)

  • +
  • +
    pip install -r requirements/local.txt
      +
    • for condas python, you way need to run this command to get pip install to succeed: conda install -c conda-forge python-crfsuite

    • +
    +
    +
    +
  • +
  • npm install

  • +
  • ./manage.py migrate

  • +
  • ./manage.py create_default_user

  • +
  • ./manage.py runserver

  • +
  • DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 4 –max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler

  • +
  • navigate to http://127.0.0.1:8000/app/#/profile/admin in your browser to add users to organizations

  • +
  • main app runs at 127.0.0.1:8000/app

  • +
+

The python manage.py create_default_user will setup a default superuser +which must be used to access the system the first time. The management command +can also create other superusers.

+
./manage.py create_default_user --username=demo@seed-platform.org --organization=lbl --password=demo123
+
+
+
+
+

Prerequisites

+

These instructions assume you have MacPorts or Homebrew. Your system +should have the following dependencies already installed:

+
    +
  • git (port install git or brew install git)

  • +
  • graphviz (brew install graphviz)

  • +
  • pyenv (Recommended)

    +
    +
    +

    Note

    +

    Although you could install Python packages globally, this is the +easiest way to install Python packages. Setting these up first will +help avoid polluting your base Python installation and make it much +easier to switch between different versions of the code.

    +
    +
    brew install pyenv
    +brew install pyenv-virtualenv
    +pyenv install <python3 version you want>
    +pyenv virtualenv <python3 version you want> seed
    +pyenv local seed
    +
    +
    +
    +
  • +
+
+
+

PostgreSQL 11.1

+

MacPorts:

+
sudo su - root
+port install postgresql94-server postgresql94 postgresql94-doc
+# init db
+mkdir -p /opt/local/var/db/postgresql94/defaultdb
+chown postgres:postgres /opt/local/var/db/postgresql94/defaultdb
+su postgres -c '/opt/local/lib/postgresql94/bin/initdb -D /opt/local/var/db/postgresql94/defaultdb'
+
+# At this point, you may want to add start/stop scripts or aliases to
+# ~/.bashrc or your virtualenv ``postactivate`` script
+# (in ``~/.virtualenvs/{env-name}/bin/postactivate``).
+
+alias pg_start='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \
+    -D /opt/local/var/db/postgresql94/defaultdb \
+    -l /opt/local/var/db/postgresql94/defaultdb/postgresql.log start"'
+alias pg_stop='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \
+    -D /opt/local/var/db/postgresql94/defaultdb stop"'
+
+pg_start
+
+sudo su - postgres
+PATH=$PATH:/opt/local/lib/postgresql94/bin/
+
+
+

Homebrew:

+
brew install postgres
+# follow the post install instructions to add to launchagents or call
+# manually with `postgres -D /usr/local/var/postgres`
+# Skip the remaining Postgres instructions!
+
+
+

Configure PostgreSQL. Replace ‘seeddb’, ‘seeduser’ with desired db/user. By +default use password seedpass when prompted. Use the code block below in development only since +the seeduser is a SUPERUSER.

+
createuser -P seeduser
+createdb `whoami`
+psql -c 'CREATE DATABASE "seeddb" WITH OWNER = "seeduser";'
+psql -c 'GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO seeduser;'
+psql -c 'ALTER ROLE seeduser SUPERUSER;'
+
+
+
+
+

PostGIS 2.5

+

MacPorts:

+
# Assuming you're still root from installing PostgreSQL,
+port install postgis2
+
+
+

Homebrew:

+
brew install postgis
+
+
+

Configure PostGIS:

+
psql -d seeddb -c "CREATE EXTENSION postgis;"
+
+# For testing, give seed user superuser access:
+# psql -c 'ALTER USER seeduser CREATEDB;'
+
+
+

If upgrading from an existing database or existing local_untracked.py file, make sure to add the +MapQuest API Key and set the database engine to ‘ENGINE’: ‘django.contrib.gis.db.backends.postgis’.

+

Now exit any root environments, becoming just yourself (even though it’s not +that easy being green), for the remainder of these instructions.

+
+
+

TimescaleDB 1.5.0

+

Note, as of version 1.5.0, dumping and restoring databases requires that both the source and target +database have the same version of TimescaleDB.

+

Downloading From Source:

+
# Note: Installing from source should only be done
+# if you have a Postgres installation not maintained by Homebrew.
+# This installation requires C compiler (e.g., gcc or clang) and CMake version 3.4 or greater.
+
+git clone https://github.com/timescale/timescaledb.git
+cd timescaledb
+git checkout 1.5.0
+
+# Bootstrap the build system
+./bootstrap
+
+# If OpenSSL can't be found by cmake - run the following instead
+# ./bootstrap -DOPENSSL_ROOT_DIR=<location of OpenSSL> # e.g., -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl
+
+# To build the extension
+cd build && make
+
+# To install
+make install
+
+# Find postgresql.conf
+# Then uncomment the shared_preload_libraries line changing it to the following
+# shared_preload_libraries = 'timescaledb'
+psql -d postgres -c "SHOW config_file;"
+
+# Restart PostgreSQL instance
+
+
+
+
+

Python Packages

+

Run these commands as your normal user id.

+

Change to a virtualenv (using virtualenvwrapper) or do the following as a +superuser. A virtualenv is usually better for development. Set the virtualenv +to seed.

+
workon seed
+
+
+

Make sure PostgreSQL command line scripts are in your PATH (if using MacPorts)

+
export PATH=$PATH:/opt/local/lib/postgresql94/bin
+
+
+

Some packages (uWSGI) may need to find your C compiler. Make sure you have +‘gcc’ on your system, and then also export this to the CC environment +variable:

+
export CC=gcc
+
+
+

Install requirements with pip

+
pip install -r requirements/local.txt
+
+
+
+
+

NodeJS/npm

+

Install npm. You can do this by installing from nodejs.org, MacPorts, or +Homebrew:

+

MacPorts:

+
sudo port install npm
+
+
+

Homebrew:

+
brew install npm
+
+
+
+
+

Configure Django and Databases

+

In the config/settings directory, there must be a file called +local_untracked.py that sets up databases and a number of other things. +To create and edit this file, start by copying over the template

+
cd config/settings
+cp local_untracked.py.dist local_untracked.py
+
+
+

Edit local_untracked.py. Open the file you created in your favorite editor. The PostgreSQL config section will look something like this:

+
# postgres DB config
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.contrib.gis.db.backends.postgis',
+        'NAME': 'seeddb',
+        'USER': 'seeduser',
+        'PASSWORD': 'seedpass',
+        'HOST': 'localhost',
+        'PORT': '5432',
+    }
+}
+
+
+

You may want to comment out the AWS settings.

+

For Redis, edit the CACHES and CELERY_BROKER_URL values to look like this:

+
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+
+
+
+

MapQuest API Key

+

Register for a MapQuest API key: +https://developer.mapquest.com/plan_purchase/steps/business_edition/business_edition_free/register

+

Visit the Manage Keys page: +https://developer.mapquest.com/user/me/apps +Either create a new key or use the key initially provided. +Copy the “Consumer Key” into the target organizations MapQuest API Key field under the organization’s settings page or directly within the DB.

+
+
+

Run Django Migrations

+

Change back to the root of the repository. Now run the migration script to set +up the database tables

+
export DJANGO_SETTINGS_MODULE=config.settings.dev
+./manage.py migrate
+
+
+
+
+

Django Admin User

+

You need a Django admin (super) user.

+
./manage.py create_default_user --username=admin@my.org --organization=seedorg --password=badpass
+
+
+

Of course, you need to save this user/password somewhere, since this is what +you will use to login to the SEED website.

+

If you want to do any API testing (and of course you do!), you will need to +add an API KEY for this user. You can do this in postgresql directly:

+
psql seeddb seeduser
+seeddb=> update landing_seeduser set api_key='DEADBEEF' where id=1;
+
+
+

The ‘secret’ key DEADBEEF is hard-coded into the test scripts.

+
+
+

Install Redis

+

You need to manually install Redis for Celery to work.

+

MacPorts:

+
sudo port install redis
+
+
+

Homebrew:

+
brew install redis
+# follow the post install instructions to add to launchagents or
+# call manually with `redis-server`
+
+
+
+
+

Install JavaScript Dependencies

+

The JS dependencies are installed using node.js package management (npm).

+
npm install
+
+
+
+
+

Start the Server

+

You should put the following statement in ~/.bashrc or add it to the +virtualenv post-activation script (e.g., in +~/.virtualenvs/seed/bin/postactivate).

+
export DJANGO_SETTINGS_MODULE=config.settings.dev
+
+
+

The combination of Redis, Celery, and Django have been encapsulated in a +single shell script, which examines existing processes and does not start +duplicate instances:

+
./bin/start-seed.sh
+
+
+

When this script is done, the Django stand-alone server will be running in +the foreground.

+
+
+

Login

+

Open your browser and navigate to http://127.0.0.1:8000

+

Login with the user/password you created before, e.g., admin@my.org and +badpass.

+
+

Note

+

these steps have been combined into a script called start-seed.sh. +The script will also not start Celery or Redis if they already seem +to be running.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.1.0/translation.html b/docs/code_documentation/3.1.0/translation.html new file mode 100644 index 00000000..80a0be0d --- /dev/null +++ b/docs/code_documentation/3.1.0/translation.html @@ -0,0 +1,218 @@ + + + + + + + Translating SEED — SEED Platform 3.1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Translating SEED

+
    +
  1. Update translations on lokalise.

  2. +
  3. Copy lokalise.yml.example to lokalise.yml. Update API token.

  4. +
  5. Install lokalise locally

    +
    brew tap lokalise/cli-2
    +brew install lokalise2
    +
    +
    +
  6. +
+
    +
  1. Run scripts if you have Lokalise CLI installed. If not, see scripts for manual steps.

    +
    script/get_python_translations.sh
    +script/get_angular_translations.sh
    +
    +
    +
  2. +
  3. Uncomment the useMissingTranslationHandlerLog line seed.js to log untranslated strings to the console for review

  4. +
  5. Verify and commit changes

  6. +
+

Note: The lokalize website is the canonical source of data. If you +change the locale files locally, then you need to push them to +lokalize.

+

TL;DR

+

SEED is localized for more than just English, so a little more care is +needed as we add new UI. All translatable strings are held in either +per-language .json files (for Angular-controlled strings, which are +the majority), or .mo files (for strings supplied by Django).

+

At render time, SEED will sniff out the browser’s Accept: header. +Based on that, we choose the right file. The language files themselves +are key->value mappings from a translation “key” to a translated value. +Either Angular or Django will then swap that value into the DOM wherever +it sees the key. If no translation is available, the key remains in the +DOM. (There are some wrinkles with HTML styling and pluralization that +we’ll review below).

+

So, the basic flow on top of any new UI features is now:

+
    +
  1. Tag any user-visible strings in the UI as “translatable.” There are +currently 12 (!) ways in which to do this; see below.

  2. +
  3. Create the translation key at lokalise. We’re using lokalise +because it can smooth over differences in the file formats that +Angular and Django require, and is a nice tool for managing the +process of getting translations done by a native speaker: we can put +up screenshots to clarify how the translated phrase is used, track +translation progress, etc.

  4. +
  5. Get a translation done. As a placeholder, lokalise can provide an +auto-filled translation from Google Translate or a few other +services, but it’s fairly straightforward to order a professional +translation through lokalise.

  6. +
  7. Pull new translation files into the right places in the source tree +and commit them. There are scripts under /scripts to make this +mostly automatic.

  8. +
  9. Visually check that the containing UI looks OK with the translated +string(s). Some languages (e.g., French, German) can be wordy relative +to English and cause UI elements like buttons to expand oddly. Adjust +the layout or adjust the translation as needed.

  10. +
+
+

General philosophies / style

+
+

Don’t go crazy with indirection and interpolation

+

It’s probably better to err on the side of too many keys than to get +clever with interpolation or Angular expressions to avoid +near-duplicates of keys. The aim should be that there is at least one +place where a competent translator can see the whole string at once.

+

Compare:

+
<h2>{$:: inventory_type == 'taxlots' ?
+      translations['INCLUDE_SHARED_TAXLOTS'] :
+      translations['INCLUDE_SHARED']
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/.buildinfo b/docs/code_documentation/3.2.0/.buildinfo new file mode 100644 index 00000000..335398ea --- /dev/null +++ b/docs/code_documentation/3.2.0/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 97ffa8cd3d547df50854d2e9c7b7c44f +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/code_documentation/3.2.0/.doctrees/api.doctree b/docs/code_documentation/3.2.0/.doctrees/api.doctree new file mode 100644 index 00000000..572883d8 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/api.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/aws.doctree b/docs/code_documentation/3.2.0/.doctrees/aws.doctree new file mode 100644 index 00000000..df526559 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/aws.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/data_model.doctree b/docs/code_documentation/3.2.0/.doctrees/data_model.doctree new file mode 100644 index 00000000..130d53ca Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/data_model.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/data_quality.doctree b/docs/code_documentation/3.2.0/.doctrees/data_quality.doctree new file mode 100644 index 00000000..19e84b77 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/data_quality.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/deployment.doctree b/docs/code_documentation/3.2.0/.doctrees/deployment.doctree new file mode 100644 index 00000000..1022e318 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/deployment.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/developer_resources.doctree b/docs/code_documentation/3.2.0/.doctrees/developer_resources.doctree new file mode 100644 index 00000000..0bba63e2 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/developer_resources.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/docker.doctree b/docs/code_documentation/3.2.0/.doctrees/docker.doctree new file mode 100644 index 00000000..ba400a47 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/docker.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/environment.pickle b/docs/code_documentation/3.2.0/.doctrees/environment.pickle new file mode 100644 index 00000000..806a059d Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/environment.pickle differ diff --git a/docs/code_documentation/3.2.0/.doctrees/faq.doctree b/docs/code_documentation/3.2.0/.doctrees/faq.doctree new file mode 100644 index 00000000..7f064dd8 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/faq.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/getting_started.doctree b/docs/code_documentation/3.2.0/.doctrees/getting_started.doctree new file mode 100644 index 00000000..1da9e919 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/getting_started.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/help.doctree b/docs/code_documentation/3.2.0/.doctrees/help.doctree new file mode 100644 index 00000000..ad88a505 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/help.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/index.doctree b/docs/code_documentation/3.2.0/.doctrees/index.doctree new file mode 100644 index 00000000..f2608346 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/index.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/kubernetes_deployment.doctree b/docs/code_documentation/3.2.0/.doctrees/kubernetes_deployment.doctree new file mode 100644 index 00000000..d258302b Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/kubernetes_deployment.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/license.doctree b/docs/code_documentation/3.2.0/.doctrees/license.doctree new file mode 100644 index 00000000..4d3a65b9 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/license.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/linux.doctree b/docs/code_documentation/3.2.0/.doctrees/linux.doctree new file mode 100644 index 00000000..b7ae5c4f Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/linux.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/mapping.doctree b/docs/code_documentation/3.2.0/.doctrees/mapping.doctree new file mode 100644 index 00000000..b224d875 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/mapping.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/matching.doctree b/docs/code_documentation/3.2.0/.doctrees/matching.doctree new file mode 100644 index 00000000..7d078ee3 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/matching.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/migrations.doctree b/docs/code_documentation/3.2.0/.doctrees/migrations.doctree new file mode 100644 index 00000000..f7faabf5 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/migrations.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules.doctree b/docs/code_documentation/3.2.0/.doctrees/modules.doctree new file mode 100644 index 00000000..d41b263e Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/config.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/config.doctree new file mode 100644 index 00000000..83d9b457 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/config.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.cleansing.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.cleansing.doctree new file mode 100644 index 00000000..878d87e7 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.cleansing.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.data.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.data.doctree new file mode 100644 index 00000000..a39e4aab Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.data.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.data_importer.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.data_importer.doctree new file mode 100644 index 00000000..ae55f03b Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.data_importer.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.doctree new file mode 100644 index 00000000..6fd2ce84 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.features.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.features.doctree new file mode 100644 index 00000000..48e0fb6c Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.features.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.landing.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.landing.doctree new file mode 100644 index 00000000..a55e6d20 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.landing.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.landing.management.commands.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.landing.management.commands.doctree new file mode 100644 index 00000000..fceaf89c Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.landing.management.commands.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.landing.management.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.landing.management.doctree new file mode 100644 index 00000000..9036aa6a Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.landing.management.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.lib.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.lib.doctree new file mode 100644 index 00000000..813df5a9 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.lib.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.lib.mappings.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.lib.mappings.doctree new file mode 100644 index 00000000..23770ef3 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.lib.mappings.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.lib.merging.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.lib.merging.doctree new file mode 100644 index 00000000..382008aa Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.lib.merging.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.management.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.management.doctree new file mode 100644 index 00000000..b0cd06a6 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.management.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.managers.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.managers.doctree new file mode 100644 index 00000000..02c82493 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.managers.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.managers.tests.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.managers.tests.doctree new file mode 100644 index 00000000..387f3d6d Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.managers.tests.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.mappings.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.mappings.doctree new file mode 100644 index 00000000..fc03c342 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.mappings.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.models.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.models.doctree new file mode 100644 index 00000000..5c43477e Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.models.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.public.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.public.doctree new file mode 100644 index 00000000..4b72a5dc Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.public.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.serializers.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.serializers.doctree new file mode 100644 index 00000000..820cb828 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.serializers.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.templatetags.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.templatetags.doctree new file mode 100644 index 00000000..b131b844 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.templatetags.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.test_helpers.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.test_helpers.doctree new file mode 100644 index 00000000..dbf7d6ad Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.test_helpers.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.test_helpers.factory.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.test_helpers.factory.doctree new file mode 100644 index 00000000..be581475 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.test_helpers.factory.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.test_helpers.factory.lib.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.test_helpers.factory.lib.doctree new file mode 100644 index 00000000..53e13ff9 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.test_helpers.factory.lib.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.tests.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.tests.doctree new file mode 100644 index 00000000..8fb78e10 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.tests.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.tests.functional.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.tests.functional.doctree new file mode 100644 index 00000000..8728c0e9 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.tests.functional.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.urls.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.urls.doctree new file mode 100644 index 00000000..d75717df Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.urls.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.utils.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.utils.doctree new file mode 100644 index 00000000..1b6b1483 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.utils.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/modules/seed.views.doctree b/docs/code_documentation/3.2.0/.doctrees/modules/seed.views.doctree new file mode 100644 index 00000000..a565b63d Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/modules/seed.views.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/postgres_upgrade.doctree b/docs/code_documentation/3.2.0/.doctrees/postgres_upgrade.doctree new file mode 100644 index 00000000..5f3f4dbc Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/postgres_upgrade.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/setup_docker.doctree b/docs/code_documentation/3.2.0/.doctrees/setup_docker.doctree new file mode 100644 index 00000000..4935b5d9 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/setup_docker.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/setup_osx.doctree b/docs/code_documentation/3.2.0/.doctrees/setup_osx.doctree new file mode 100644 index 00000000..54f00403 Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/setup_osx.doctree differ diff --git a/docs/code_documentation/3.2.0/.doctrees/translation.doctree b/docs/code_documentation/3.2.0/.doctrees/translation.doctree new file mode 100644 index 00000000..8b7c03ad Binary files /dev/null and b/docs/code_documentation/3.2.0/.doctrees/translation.doctree differ diff --git a/docs/code_documentation/3.2.0/_images/case-a.webp b/docs/code_documentation/3.2.0/_images/case-a.webp new file mode 100644 index 00000000..aa4e81d6 Binary files /dev/null and b/docs/code_documentation/3.2.0/_images/case-a.webp differ diff --git a/docs/code_documentation/3.2.0/_images/case-b.webp b/docs/code_documentation/3.2.0/_images/case-b.webp new file mode 100644 index 00000000..93b6ee0b Binary files /dev/null and b/docs/code_documentation/3.2.0/_images/case-b.webp differ diff --git a/docs/code_documentation/3.2.0/_images/case-c.webp b/docs/code_documentation/3.2.0/_images/case-c.webp new file mode 100644 index 00000000..180a613c Binary files /dev/null and b/docs/code_documentation/3.2.0/_images/case-c.webp differ diff --git a/docs/code_documentation/3.2.0/_images/case-d.webp b/docs/code_documentation/3.2.0/_images/case-d.webp new file mode 100644 index 00000000..72213abd Binary files /dev/null and b/docs/code_documentation/3.2.0/_images/case-d.webp differ diff --git a/docs/code_documentation/3.2.0/_images/data-model.webp b/docs/code_documentation/3.2.0/_images/data-model.webp new file mode 100644 index 00000000..3471d8cf Binary files /dev/null and b/docs/code_documentation/3.2.0/_images/data-model.webp differ diff --git a/docs/code_documentation/3.2.0/_sources/api.rst.txt b/docs/code_documentation/3.2.0/_sources/api.rst.txt new file mode 100644 index 00000000..5cfde4e2 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/api.rst.txt @@ -0,0 +1,68 @@ +API +=== + +Authentication +-------------- +Authentication is handled via an encoded authorization token set in a HTTP header. +To request an API token, go to ``/app/#/profile/developer`` and click 'Get a New API Key'. + +Authenticate every API request with your username (email, all lowercase) and the API key via `Basic Auth`_. +The header is sent in the form of ``Authorization: Basic ``, where credentials is the base64 encoding of the email and key joined by a single colon ``:``. + +.. _Basic Auth: https://en.wikipedia.org/wiki/Basic_access_authentication + +Using Python, use the requests library:: + + import requests + + result = requests.get('https://seed-platform.org/api/version/', auth=(user_email, api_key)) + print result.json() + +Using curl, pass the username and API key as follows:: + + curl -u user_email:api_key http://seed-platform.org/api/version/ + +If authentication fails, the response's status code will be 302, redirecting the user to ``/app/login``. + +Payloads +-------- + +Many requests require a JSON-encoded payload and parameters in the query string of the url. A frequent +requirement is including the organization_id of the org you belong to. For example:: + + curl -u user_email:api_key https://seed-platform.org/api/v2/organizations/12/ + +Or in a JSON payload:: + + curl -u user_email:api_key \ + -d '{"organization_id":6, "role": "viewer"}' \ + https://seed-platform.org/api/v2/users/12/update_role/ + +Using Python:: + + params = {'organization_id': 6, 'role': 'viewer'} + result = requests.post('https://seed-platform.org/api/v2/users/12/update_role/', + data=json.dumps(params), + auth=(user_email, api_key)) + print result.json() + +Responses +--------- + +Responses from all requests will be JSON-encoded objects, as specified in each endpoint's documentation. +In the case of an error, most endpoints will return this instead of the expected payload (or an HTTP status code):: + + { + "status": "error", + "message": "explanation of the error here" + } + +API Endpoints +------------- + +A list of interactive endpoints are available by accessing the API menu item on the left navigation +pane within you account on your SEED instance. + +To view a list of non-interactive endpoints without an account, view swagger_ on the development server. + +.. _swagger: https://seed-platform.org/api/swagger/ diff --git a/docs/code_documentation/3.2.0/_sources/aws.rst.txt b/docs/code_documentation/3.2.0/_sources/aws.rst.txt new file mode 100644 index 00000000..eccace1f --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/aws.rst.txt @@ -0,0 +1,183 @@ +========= +AWS Setup +========= + +Amazon Web Services (`AWS`_) provides the preferred hosting for the SEED Platform. + +**seed** is a `Django Project`_ and Django's documentation is an excellent place for general +understanding of this project's layout. + +.. _Django Project: https://www.djangoproject.com/ + +.. _AWS: http://aws.amazon.com/ + +Prerequisites +^^^^^^^^^^^^^ + +Ubuntu server 18.04 LTS + +.. note:: These instructions have not been updated for Ubuntu 18.04. It is recommended to use Docker-based deployments. + +.. code-block:: console + + sudo apt-get update + sudo apt-get upgrade + sudo apt-get install -y libpq-dev python-dev python-pip libatlas-base-dev \ + gfortran build-essential g++ npm libxml2-dev libxslt1-dev git mercurial \ + libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python + + +PostgreSQL and Redis are not included in the above commands. For a quick installation on AWS it +is okay to install PostgreSQL and Redis locally on the AWS instance. If a more permanent and +scalable solution, it is recommended to use AWS's hosted Redis (ElastiCache) and PostgreSQL service. + +.. note:: postgresql ``>=9.4`` is required to support `JSON Type`_ + +.. code-block:: console + + # To install PostgreSQL and Redis locally + sudo apt-get install redis-server + sudo apt-get install postgresql postgresql-contrib + +.. _`JSON Type`: https://www.postgresql.org/docs/9.4/datatype-json.html + +Amazon Web Services (AWS) Dependencies +++++++++++++++++++++++++++++++++++++++ + +The following AWS services can be used for **SEED** but are not required: + +* RDS (PostgreSQL >=9.4) +* ElastiCache (redis) +* SES + + +Python Dependencies +^^^^^^^^^^^^^^^^^^^ + +Clone the **SEED** repository from **github** + +.. code-block:: console + + $ git clone git@github.com:SEED-platform/seed.git + +enter the repo and install the python dependencies from `requirements`_ + +.. _requirements: https://github.com/SEED-platform/seed/blob/main/requirements/aws.txt + +.. code-block:: console + + $ cd seed + $ sudo pip install -r requirements/aws.txt + + +JavaScript Dependencies +^^^^^^^^^^^^^^^^^^^^^^^ + +``npm`` is required to install the JS dependencies. + +.. code-block:: console + + $ sudo apt-get install build-essential + $ sudo apt-get install curl + + +.. code-block:: console + + $ npm install + + +Database Configuration +^^^^^^^^^^^^^^^^^^^^^^ + +Copy the ``local_untracked.py.dist`` file in the ``config/settings`` directory to +``config/settings/local_untracked.py``, and add a ``DATABASES`` configuration with your database username, +password, host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database +instance you have manually installed within your infrastructure. + +.. code-block:: python + + # Database + DATABASES = { + 'default': { + 'ENGINE':'django.db.backends.postgresql_psycopg2', + 'NAME': 'seed', + 'USER': '', + 'PASSWORD': '', + 'HOST': '', + 'PORT': '', + } + } + + +.. note:: + + In the above database configuration, ``seed`` is the database name, this + is arbitrary and any valid name can be used as long as the database exists. + +create the database within the postgres ``psql`` shell: + +.. code-block:: psql + + CREATE DATABASE seed; + +or from the command line: + +.. code-block:: console + + createdb seed + + +create the database tables and migrations: + +.. code-block:: console + + python manage.py syncdb + python manage.py migrate + + +create a superuser to access the system + +.. code-block:: console + + $ python manage.py create_default_user --username=demo@example.com --organization=example --password=demo123 + + +.. note:: + + Every user must be tied to an organization, visit ``/app/#/profile/admin`` + as the superuser to create parent organizations and add users to them. + +Cache and Message Broker +^^^^^^^^^^^^^^^^^^^^^^^^ + +The SEED project relies on `redis`_ for both cache and message brokering, and +is available as an AWS `ElastiCache`_ service. +``local_untracked.py`` should be updated with the ``CACHES`` and ``CELERY_BROKER_URL`` +settings. + +.. _ElastiCache: https://aws.amazon.com/elasticache/ + +.. _redis: http://redis.io/ + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://seed-core-cache.ntmprk.0001.usw2.cache.amazonaws.com:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + +Running Celery the Background Task Worker +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +`Celery`_ is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, ``celery`` +can be started: + +.. code-block:: console + + celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler + +.. _Celery: http://www.celeryproject.org/ diff --git a/docs/code_documentation/3.2.0/_sources/data_model.rst.txt b/docs/code_documentation/3.2.0/_sources/data_model.rst.txt new file mode 100644 index 00000000..15650406 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/data_model.rst.txt @@ -0,0 +1,415 @@ +Data Model +========== + +.. image:: images/case-a.webp + +.. image:: images/case-b.webp + +.. image:: images/case-c.webp + +.. image:: images/case-d.webp + +.. image:: images/data-model.webp + + +.. todo:: Documentation below is out of state and needs updated. + +Our primary data model is based on a tree structure with BuildingSnapshot +instances as nodes of the tree and the tip of the tree referenced by a +CanonicalBuilding. + +Take the following example: a user has loaded a CSV file containing information +about one building and created the first BuildingSnapshot (BS0). At this point +in time, BS0 is linked to the first CanonicalBuilding (CB0), and CB0 is also +linked to BS0. + +.. code-block:: shell + + BS0 <-- CB0 + BS0 --> CB0 + +These relations are represented in the database as foreign keys from the +BuildingSnapshot table to the CanonicalBuilding table, and from the +CanonicalBuilding table to the BuildingSnapshot table. + +The tree structure comes to fruition when a building, BS0 in our case, is +matched with a new building, say BS1, enters the system and is auto-matched. + +Here BS1 entered the system and was matched with BS0. When a match occurs, +a new BuildingSnapshot is created, BS2, with the fields from the existing +BuildingSnapshot, BS0, and the new BuildingSnapshot, BS1, merged +together. If both the existing and new BuildingSnapshot have data for a +given field, the new record's fields are preferred and merged into the child, B3. + +The fields from new snapshot are preferred because that is the newer of the +two records from the perspective of the system. By preferring the most recent fields +this allows for evolving building snapshots over time. For example, if an existing +canonical record has a Site EUI value of 75 and some changes happen to a building +that cause this to change to 80 the user can submit a new record with that change. + +All BuildingSnapshot instances point to a CanonicalBuilding. + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 <-- CB0 + + BS0 --> CB0 + BS1 --> CB0 + BS2 --> CB0 + + +parents and children +^^^^^^^^^^^^^^^^^^^^ + +BuildingSnapshots also have linkage to other BuildingSnapshots in order to +keep track of their *parents* and *children*. This is represented in the +Django model as a many-to-many relation from BuildingSnapshot to BuildingSnapshot. +It is represented in the PostgreSQL database as an additional seed_buildingsnapshot_children +table. + + +In our case here, BS0 and BS1 would both have *children* BS2, and BS2 would +have *parents* BS0 and BS1. + +.. note:: + + throughout most of the application, the ``search_buildings`` endpoint + is used to search or list active building. This is to say, buildings that + are pointed to by an active CanonicalBuilding. + The ``search_mapping_results`` endpoint allows the search of buildings + regardless of whether the BuildingSnapshot is pointed to by an active + CanonicalBuilding or not and this search is needed during the mapping + preview and matching sections of the application. + + + +For illustration purposes let's suppose BS2 and a new building BS3 match to form a child BS4. + ++--------+-------+ +| parent | child | ++========+=======+ +| BS0 | BS2 | ++--------+-------+ +| BS1 | BS2 | ++--------+-------+ +| BS2 | BS4 | ++--------+-------+ +| BS3 | BS4 | ++--------+-------+ + + +And the corresponding tree would look like: + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 BS3 + \ / + BS4 <-- CB0 + + BS0 --> CB0 + BS1 --> CB0 + BS2 --> CB0 + BS3 --> CB0 + BS4 --> CB0 + +matching +-------- + +During the auto-matching process, if a *raw* BuildingSnapshot matches an +existing BuildingSnapshot instance, then it will point to the existing +BuildingSnapshot instance's CanonicalBuilding. In the case where there is no +existing BuildingSnapshot to match, a new CanonicalBuilding will be created, as +happened to B0 and C0 above. + ++-------+--------+--------+-------------+ +| field | BS0 | BS1 | BS2 (child) | ++=======+========+========+=============+ +| id1 | **11** | 11 | 11 | ++-------+--------+--------+-------------+ +| id2 | | **12** | 12 | ++-------+--------+--------+-------------+ +| id3 | **13** | | 13 | ++-------+--------+--------+-------------+ +| id4 | 14 | **15** | 15 | ++-------+--------+--------+-------------+ + + +manual-matching vs auto-matching +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Since BuildingSnapshots can be manually matched, there is the possibility for +two BuildingSnapshots each with an active CanonicalBuilding to match and the +system has to choose to move only one CanonicalBuilding to the tip of the tree +for the primary BuildingSnapshot and *deactivate* the secondary +BuildingSnapshot's CanonicalBuilding. + +Take for example: + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 BS3 + \ / + BS4 <-- CB0 (active: True) BS5 <-- CB1 (active: True) + +If a user decides to manually match BS4 and BS5, the system will take the +primary BuildingSnapshot's CanonicalBuilding and have it point to their +child and deactivate CB1. The deactivation is handled by setting a field +on the CanonicalBuilding instance, *active*, from ``True`` to ``False``. + +Here is what the tree would look like after the manual match of **BS4** and +**BS5**: + +.. code-block:: shell + + BS0 BS1 + \ / + BS2 BS3 + \ / + BS4 BS5 <-- CB1 (active: False) + \ / + BS6 <-- CB0 (active: True) + +Even though BS5 is pointed to by a CanonicalBuilding, CB1, BS5 will not be +returned by the normal ``search_buildings`` endpoint because the +CanonicalBuilding pointing to it has its field ``active`` set to ``False``. + +.. note:: + anytime a match is **unmatched** the system will create a new + CanonicalBuilding or set an existing CanonicalBuilding's active field to + ``True`` for any leaf BuildingSnapshot trees. + +what really happens to the BuildingSnapshot table on import (and when) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The above is conceptually what happens but sometimes the devil is in the details. +Here is what happens to the BuildingSnapshot table in the database when records +are imported. + +Every time a record is added at least two BuildingSnapshot records are created. + +Consider the following simple record: + ++-------------+-------------+---------------------+-----------+--------------+ +| Property Id | Year Ending | Property Floor Area | Address 1 | Release Date | ++=============+=============+=====================+===========+==============+ +| 499045 | 2000 | 1234 | 1 fake st | 12/12/2000 | ++-------------+-------------+---------------------+-----------+--------------+ + +The first thing the user is upload the file. When the user sees the +"Successful Upload!" dialog one record has been added to the +BuildingSnapshot table. + +This new record has an id (73700 in this case) and a created and +modified timestamp. Then there are a lot of empty fields and a +source_type of 0. Then there is the extra_data column which contains +the contents of the record in key-value form: + +:Address 1: "1 fake st" +:Property Id: "499045" +:Year Ending: "2000" +:Release Date: "12/12/2000" +:Property Floor Area: "1234" + +And a corresponding extra_data_sources that looks like + +:Address 1: 73700 +:Property Id: 73700 +:Year Ending: 73700 +:Release Date: 73700 +:Property Floor Area: 73700 + + +All of the fields that look like _source_id are also populated +with 73700 E.G. owner_postal_code_source_id. + +The other fields of interest are the organization field which +is populated with the user's default organization and the import_file_id +field which is populated with a reference to a data_importer_importfile record. + +At this point the record has been created before the user hits the +"Continue to data mapping" button. + +The second record (id = 73701) is created by the time the user gets to the screen +with the "Save Mappings" button. This second record has the following fields populated: + +- id +- created +- modified +- pm_property_id +- year_ending +- gross_floor_area +- address_line_1 +- release_date +- source_type (this is 2 instead of 0 as with the other record) +- import_file_id +- organization_id. + +That is all. All other fields are empty. In this case that is all that happens. + +Now consider the same user uploading a new file from the next year that looks like + ++-------------+-------------+---------------------+-----------+--------------+ +| Property Id | Year Ending | Property Floor Area | Address 1 | Release Date | ++=============+=============+=====================+===========+==============+ +| 499045 | 2000 | 1234 | 1 fake st | 12/12/2001 | ++-------------+-------------+---------------------+-----------+--------------+ + +As before one new record is created on upload. This has id 73702 and follows the same +pattern as 73700. And similarly 73703 is created like 73701 before the "Save Mappings" +button appears. + +However this time the system was able to make a match with an existing record. +After the user clicks the "Confirm mappings & start matching" button a new record +is created with ID 73704. + +73704 is identical to 73703 (in terms of contents of the BuildingSnapshot table only) +with the following exceptions: + +- created and modified timestamps are different +- match type is populated and has a value of 1 +- confidence is populated and has a value of .9 +- source_type is 4 instead of 2 +- canonical_building_id is populated with a value +- import_file_id is NULL +- last_modified_by_id is populated with value 2 (This is a key into the landing_seeduser table) +- address_line_1_source_id is 73701 +- gross_floor_area_source_id is populated with value 73701 +- pm_property_id_source_id is populated with 73701 +- release_date_source_id is populated with 73701 +- year_ending_source_id is populated with 73701 + +what really happens to the CanonicalBuilding table on import (and when) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In addition to the BuildingSnapshot table the CanonicalBuilding table is also updated +during the import process. To summarize the above 5 records were created in the +BuildingSnapshot table: + +1. 73700 is created from the raw 2000 data +2. 73701 is the mapped 2000 data, +3. 73702 is created from the raw 2001 data +4. 73703 is the mapped 2001 data +5. 73704 is the result of merging the 2000 and 2001 data. + +In this process CanonicalBuilding is updated twice. First when the 2000 record is imported the +CanonicalBuilding gets populated with one new row at the end of the matching step. +I.E. when the user sees the "Load More Data" screen. At this point there is a new row that looks like + ++--------+--------+-----------------------+ +| id | active | canonical_building_id | ++========+========+=======================+ +| 20505 | TRUE | 73701 | ++--------+--------+-----------------------+ + +At this point there is one new canonical building and that is the BuildingSnapshot with +id 73701. Next the user uploads the 2001 data. When the "Matching Results" screen +appears the CanonicalBuilding table has been updated. Now it looks like + ++--------+--------+-----------------------+ +| id | active | canonical_building_id | ++========+========+=======================+ +| 20505 | TRUE | 73704 | ++--------+--------+-----------------------+ + +There is still only one canonical building but now it is the BuildingSnapshot record +that is the result of merging the 2000 and 2001 data: id = 73704. + +organization +^^^^^^^^^^^^ + +BuildingSnapshots belong to an Organization field that is a foreign key into the organization +model (orgs_organization in Postgres). + +Many endpoints filter the buildings based on the organizations the requesting user +belongs to. E.G. get_buildings changes which fields are returned based on the +requesting user's membership in the BuildingSnapshot's organization. + +\*_source_id fields +^^^^^^^^^^^^^^^^^^^ + +Any field in the BuildingSnapshot table that is populated with data from a +submitted record will have a corresponding _source_id field. E.G +pm_property_id has pm_property_id_source_id, +address_line_1 has address_line_1_source_id, +etc... + +These are foreign keys into the BuildingSnapshot that is the source of that +value. To extend the above table + ++-------+--------+--------+-------------+------------------------+ +| field | BS0 | BS1 | BS2 (child) | BS2 (child) _source_id | ++=======+========+========+=============+========================+ +| id1 | **11** | | 11 | BS0 | ++-------+--------+--------+-------------+------------------------+ +| id2 | | **12** | 12 | BS1 | ++-------+--------+--------+-------------+------------------------+ + +**NOTE:** The BuildingSnapshot records made from the raw input file have all the +_source_id fields populated with that record's ID. The non-canonical BuildingSnapshot +records created from the mapped data have none set. The canonical BuildingSnapshot +records that are the result of merging two records have only the _source_id fields +set where the record itself has data. E.G. in the above address_line_1 is set to +"1 fake st." so there is a value in the canonical BuildingSnapshot's address_line_1_source_id +field. However there is no block number so block_number_source_id is empty. This +is unlike the two raw BuildingSnapshot records who also have no block_number but +nevertheless have a block_number_source_id populated. + +extra_data +^^^^^^^^^^ + +The BuildingSnapshot model has many "named" fields. Fields like "address_line_1", +"year_built", and "pm_property_id". However the users are allowed to submit files +with arbitrary fields. Some of those arbitrary fields can be mapped to "named" +fields. E.G. "Street Address" can usually be mapped to "Address Line 1". +For all the fields that cannot be mapped like that there is the extra_data field. + +extra_data is Django json field that serves as key-value storage for other +user-submitted fields. As with the other "named" fields there is a corresponding +extra_data_sources field that serves the same role as the other _source_id fields. +E.G. If a BuildingSnapshot has an extra_data field that looks like + +:an_unknown_field: 1 +:something_else: 2 + +It should have an extra_data_sources field that looks like + +:an_unknown_field: some_BuildingSnapshot_id +:something_else: another_BuildingSnapshot_id + +saving and possible data loss +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +When saving a Property file some fields that are truncated if too long. +The following are truncated to 255 characters + +- jurisdiction_tax_lot_id +- pm_property_id +- custom_id_1 +- ubid +- lot_number +- block_number +- district +- owner +- owner_email +- owner_telephone +- owner_address +- owner_city_state +- owner_postal_code + +And the following are truncated to 255: + +- property_name +- address_line_1 +- address_line_2 +- city +- postal_code +- state_province +- building_certification + +No truncation happens to any of the fields stored in extra_data. diff --git a/docs/code_documentation/3.2.0/_sources/data_quality.rst.txt b/docs/code_documentation/3.2.0/_sources/data_quality.rst.txt new file mode 100644 index 00000000..49e06799 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/data_quality.rst.txt @@ -0,0 +1,9 @@ +Data Quality +============ + +Data quality checks are run after the data are paired, during import of Properties/TaxLots, or on-demand by selecting rows in the inventory +page and clicking the action button. This checks whether any default or user-defined Rules are broken or satisfied by Property/TaxLot records. + +Notably, in most cases when data quality checks are run, Labels can be applied for any broken Rules that have a Label. +To elaborate, Rules can have an attached Label. When a data quality check is run, records that break one of these "Labeled Rules" +are then given that Label. The case where this Label attachment does not happen is during import due to performance reasons. diff --git a/docs/code_documentation/3.2.0/_sources/deployment.rst.txt b/docs/code_documentation/3.2.0/_sources/deployment.rst.txt new file mode 100644 index 00000000..e2e3d347 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/deployment.rst.txt @@ -0,0 +1,57 @@ +Deployment Guide +================ + +SEED is intended to be installed on Linux instances in the cloud (e.g., AWS), and on local hardware. SEED Platform does not officially support Windows for production deployment. If this is desired, see the Django `notes`_. + +.. _notes: https://docs.djangoproject.com/en/1.7/howto/windows/ + +.. toctree:: + :maxdepth: 2 + + aws + linux + docker + kubernetes_deployment + +Migrations +---------- + +Migrations are handles through Django; however, various versions have customs actions for the migrations. See the :doc:`migrations page ` for more information. + + +Monitoring +---------- + +Sentry +^^^^^^ + +Sentry can monitor your webservers for any issues. To enable sentry add the following to +your local_untracked.py files after setting up your Sentry account on sentry.io. + +The RAVEN_CONFIG is used for the backend and the SENTRY_JS_DSN is used for the frontend. At the moment, +it is recommended to setup two sentry projects, one for backend and one for frontend. + +.. code-block:: python + + import sentry_sdk + from sentry_sdk.integrations.django import DjangoIntegration + from sentry_sdk.integrations.celery import CeleryIntegration + + sentry_sdk.init( + dsn="https://@.ingest.sentry.io/", + integrations=[ + DjangoIntegration(), + CeleryIntegration(), + ], + + # Set traces_sample_rate to 1.0 to capture 100% + # of transactions for performance monitoring. + # We recommend adjusting this value in production. + traces_sample_rate=1.0, + + # If you wish to associate users to errors (assuming you are using + # django.contrib.auth) you may enable sending PII data. + send_default_pii=True + ) + + SENTRY_JS_DSN = 'https://@sentry.io/' diff --git a/docs/code_documentation/3.2.0/_sources/developer_resources.rst.txt b/docs/code_documentation/3.2.0/_sources/developer_resources.rst.txt new file mode 100644 index 00000000..e92c7bce --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/developer_resources.rst.txt @@ -0,0 +1,450 @@ +Developer Resources +=================== + +.. toctree:: + migrations + translation + +General Notes +------------- + +Pre-commit +^^^^^^^^^^ +We use precommit commits for formatting. Set it up locally with + +.. code-block:: bash + + pre-commit install + +Ruff Settings +^^^^^^^^^^^^^^ + +Ruff is used to statically verify code syntax. To run ruff locally call: + +.. code-block:: bash + + tox -e precommit -- ruff + tox -e precommit -- ruff-format + +Python Type Hints +^^^^^^^^^^^^^^^^^ + +Python type hints are beginning to be added to the SEED codebase. The benefits are +eliminating some accidental typing mistakes to prevent bugs as well as a better IDE +experience. + +Usage +***** + +SEED does not require exhaustive type annotations, but it is recommended you add them if you +create any new functions or refactor any existing code where it might be beneficial (e.g. types +that appear ambiguous or that the IDE can't determine) and not require a ton of additional effort. + +When applicable, we recommend you use `built-in collection types `_ +such as :code:`list`, :code:`dict` or :code:`tuple` instead of the capitalized types +from the :code:`typing` module. You can also use ``TypedDict`` and ``NotRequired`` from the ``typing_extensions`` +package to specify the types of required/optional keys of dictionaries. + +Common gotchas: + +- If trying to annotate a class method with the class itself, import :code:`from __future__ import annotations` +- If you're getting warnings about runtime errors due to a type name, make sure your IDE is set up to point to an environment with python 3.9 +- If you're wasting time trying to please the type checker, feel free to throw :code:`# type: ignore` on the problematic line (or at the top of the file to ignore all issues for that file) + +Type Checking +************* + +CI currently runs static type checking on the codebase using `mypy `_. For +your own IDE, we recommend the following extensions: + +- VSCode: `Pylance `_ (uses Microsoft's Pyright type checking) + +To run the same typechecking applied in CI (i.e., using mypy) you can run the following + +.. code-block:: bash + + tox -e mypy + + +Django Notes +------------ + +Adding New Fields to Database +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Adding new fields to SEED can be complicated since SEED has a mix of typed fields (database fields) and extra data +fields. Follow the steps below to add new fields to the SEED database: + +#. Add the field to the PropertyState or the TaxLotState model. Adding fields to the Property or TaxLot models is more complicated and not documented yet. +#. Add field to list in the following locations: + +- models/columns.py: Column.DATABASE_COLUMNS +- TaxLotState.coparent or PropertyState.coparent: SQL query and keep_fields + +#. Run `./manage.py makemigrations` +#. Add in a Python script in the new migration to add in the new column into every organizations list of columns. Note that the new_db_fields will be the same as the data in the Column.DATABASE_COLUMNS that were added. + + .. code-block:: python + + def forwards(apps, schema_editor): + Column = apps.get_model("seed", "Column") + Organization = apps.get_model("orgs", "Organization") + + new_db_fields = [ + { + 'column_name': 'geocoding_confidence', + 'table_name': 'PropertyState', + 'display_name': 'Geocoding Confidence', + 'column_description': 'Geocoding Confidence', + 'data_type': 'number', + }, { + 'column_name': 'geocoding_confidence', + 'table_name': 'TaxLotState', + 'display_name': 'Geocoding Confidence', + 'column_description': 'Geocoding Confidence', + 'data_type': 'number', + } + ] + + # Go through all the organizations + for org in Organization.objects.all(): + for new_db_field in new_db_fields: + columns = Column.objects.filter( + organization_id=org.id, + table_name=new_db_field['table_name'], + column_name=new_db_field['column_name'], + is_extra_data=False, + ) + + if not columns.count(): + new_db_field['organization_id'] = org.id + Column.objects.create(**new_db_field) + elif columns.count() == 1: + # If the column exists, then update the display_name and data_type if empty + c = columns.first() + if c.display_name is None or c.display_name == '': + c.display_name = new_db_field['display_name'] + if c.data_type is None or c.data_type == '' or c.data_type == 'None': + c.data_type = new_db_field['data_type'] + for col in columns: + # If the column exists, then update the column_description if empty + if c.column_description is None or c.column_description == '': + c.column_description = new_db_field['column_description'] + c.save() + else: + print(" More than one column returned") + + + class Migration(migrations.Migration): + dependencies = [ + ('seed', '0090_auto_20180425_1154'), + ] + + operations = [ + ... existing db migrations ..., + migrations.RunPython(forwards), + ] + + +#. Run migrations `./manage.py migrate` +#. Run unit tests, fix failures. Below is a list of files that need to be fixed (this is not an exhaustive list) + +- test_mapping_data.py:test_keys +- test_columns.py:test_column_retrieve_schema +- test_columns.py:test_column_retrieve_db_fields + +#. (Optional) Update example files to include new fields +#. Test import workflow with mapping to new fields + + +NGINX Notes +----------- + +Toggle *maintenance mode* to display a maintenance page and prevent access to all site resources including API endpoints: + +.. code-block:: bash + + docker exec seed_web ./docker/maintenance.sh on + docker exec seed_web ./docker/maintenance.sh off + + +AngularJS Integration Notes +--------------------------- + +Template Tags +^^^^^^^^^^^^^ + +Angular and Django both use `{{` and `}}` as variable delimiters, and thus the AngularJS variable delimiters are +renamed `{$` and `$}`. + +.. code-block:: JavaScript + + window.SEED.apps.seed = angular.module('SEED', ['$interpolateProvider', ($interpolateProvider) => { + $interpolateProvider.startSymbol('{$'); + $interpolateProvider.endSymbol('$}'); + }]); + +Django CSRF Token and AJAX Requests +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +For ease of making angular `$http` requests, we automatically add the CSRF token to all `$http` requests as +recommended by http://django-angular.readthedocs.io/en/latest/integration.html#xmlhttprequest + +.. code-block:: JavaScript + + window.SEED.apps.seed.run(($http, $cookies) => { + $http.defaults.headers.common['X-CSRFToken'] = $cookies['csrftoken']; + }); + + +Routes and Partials or Views +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Routes in `static/seed/js/seed.js` (the normal angularjs `app.js`) + + +.. code-block:: JavaScript + + SEED_app.config(['stateHelperProvider', '$urlRouterProvider', '$locationProvider', (stateHelperProvider, $urlRouterProvider, $locationProvider) => { + stateHelperProvider + .state({ + name: 'home', + url: '/', + templateUrl: static_url + 'seed/partials/home.html' + }) + .state({ + name: 'profile', + url: '/profile', + templateUrl: static_url + 'seed/partials/profile.html', + controller: 'profile_controller', + resolve: { + auth_payload: ['auth_service', '$q', 'user_service', function (auth_service, $q, user_service) { + var organization_id = user_service.get_organization().id; + return auth_service.is_authorized(organization_id, ['requires_superuser']); + }], + user_profile_payload: ['user_service', function (user_service) { + return user_service.get_user_profile(); + }] + } + }); + }]); + +HTML partials in `static/seed/partials/` + +Logging +------- + +Information about error logging can be found here - https://docs.djangoproject.com/en/1.7/topics/logging/ + +Below is a standard set of error messages from Django. + +A logger is configured to have a log level. This log level describes the severity of +the messages that the logger will handle. Python defines the following log levels: + +.. code-block:: bash + + DEBUG: Low level system information for debugging purposes + INFO: General system information + WARNING: Information describing a minor problem that has occurred. + ERROR: Information describing a major problem that has occurred. + CRITICAL: Information describing a critical problem that has occurred. + +Each message that is written to the logger is a Log Record. The log record is stored +in the web server & Celery + + +BEDES Compliance and Managing Columns +------------------------------------- + +Columns that do not represent hardcoded fields in the application are represented using +a Django database model defined in the seed.models module. The goal of adding new columns +to the database is to create seed.models.Column records in the database for each column to +import. Currently, the list of Columns is dynamically populated by importing data. + +There are default mappings for ESPM are located here: + + https://github.com/SEED-platform/seed/blob/develop/seed/lib/mappings/data/pm-mapping.json + + +Resetting the Database +---------------------- + +This is a brief description of how to drop and re-create the database +for the seed application. + +The first two commands below are commands distributed with the +Postgres database, and are not part of the SEED application. The third +command below will create the required database tables for SEED and +setup initial data that the application expects (e.g. initial columns for +BEDES). The last command below (spanning multiple lines) will create a +new superuser and organization that you can use to login to the +application, and from there create any other users or organizations +that you require. + +Below are the commands for resetting the database and creating a new +user: + +.. code-block:: bash + + createuser -U seed seeduser + + psql -d postgres -U seeduser -c 'DROP DATABASE seed;' + psql -d postgres -U seeduser -c 'CREATE DATABASE seed;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;' + + ./manage.py migrate + ./manage.py create_default_user \ + --username=demo@seed-platform.org \ + --password=password \ + --organization=testorg + +Restoring a Database Dump +------------------------- + +.. code-block:: bash + + psql -d postgres -U seeduser -c 'DROP DATABASE seed;' + psql -d postgres -U seeduser -c 'CREATE DATABASE seed;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;' + psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;' + psql -d seed -U seeduser -c 'SELECT timescaledb_pre_restore();' + + # restore a previous database dump (must be pg_restore 12+) + pg_restore -d seed -U seeduser /backups/prod-backups/prod_20191203_000002.dump + # if any errors appear during the pg_restore process check that the `installed_version` of the timescaledb extension where the database was dumped matches the extension version where it's being restored + # `SELECT default_version, installed_version FROM pg_available_extensions WHERE name = 'timescaledb';` + + psql -d seed -U seeduser -c 'SELECT timescaledb_post_restore();' + + ./manage.py migrate + + # if needed add a user to the database + ./manage.py create_default_user \ + --username=demo@seed-platform.org \ + --password=password \ + --organization=testorg + +If restoring a production backup to a different deployment update the site settings for password reset emails, and disable celerybeat Salesforce updates/emails: + +.. code-block:: bash + + ./manage.py shell + + from django.contrib.sites.models import Site + site = Site.objects.first() + site.domain = 'dev1.seed-platform.org' + site.name = 'SEED Dev1' + site.save() + + from seed.models import Organization + Organization.objects.filter(salesforce_enabled=True).update(salesforce_enabled=False) + + from django_celery_beat.models import PeriodicTask, PeriodicTasks + PeriodicTask.objects.filter(enabled=True, name__startswith='salesforce_sync_org-').update(enabled=False) + PeriodicTasks.update_changed() + + +Migrating the Database +---------------------- + +Migrations are handles through Django; however, various versions have customs actions for the migrations. See the :doc:`migrations page ` for more information based on the version of SEED. + + +Testing +------- + +JS tests can be run with Jasmine at the url `/angular_js_tests/`. + +Python unit tests are run with + +.. code-block:: bash + + python manage.py test --settings=config.settings.test + +Note on geocode-related testing: + Most of these tests use VCR.py and cassettes to capture and reuse recordings of HTTP requests and responses. Given that, unless you want to make changes and/or refresh the cassettes/recordings, there isn't anything needed to run the geocode tests. + + In the case that the geocoding logic/code is changed or you'd like to the verify the MapQuest API is still working as expected, you'll need to run the tests with a small change. Namely, you'll want to provide the tests with an API key via an environment variable called "TESTING_MAPQUEST_API_KEY" or within your local_untracked.py file with that same variable name. + + In order to refresh the actual cassettes, you'll just need to delete or move the old ones which can be found at ".seed/tests/data/vcr_cassettes". The API key should be hidden within the cassettes, so these new cassettes can and should be pushed to GitHub. + +Run coverage using + +.. code-block:: bash + + coverage run manage.py test --settings=config.settings.test + coverage report --fail-under=83 + +Python compliance uses Ruff + +.. code-block:: bash + + tox -e precommit -- ruff + tox -e precommit -- ruff-format + +JavaScript compliance uses ESLint, SCSS compliance uses StyleLint, and HTML compliance uses Prettier + +.. code-block:: bash + + npm run lint + npm run lint:fix + +Building Documentation +---------------------- + +Older versions of the source code documentation are (still) on readthedocs; however, newer versions are built and pushed to the seed-website repository manually. To build the documentation follow the script below: + +.. code-block:: bash + + cd docs + rm -rf htmlout + sphinx-build -b html source htmlout + +For releasing, copy the ``htmlout`` directory into the seed-platform's website repository under ``docs/code_documentation/``. Make sure to add the new documentation to the table in the ``docs/developer_resources.md``. + +Contribution Instructions / Best Practices +------------------------------------------ + +If this is the first time contributing and you are outside of the DOE National Lab system, then you will need to review and fill out the contribution agreement which is found in `SEED's Contribution Agreement in the GitHub repository`_ + +The desired workflow for development and submitting changes is the following: + +#. Fork the repository on GitHub if you do not have access to the repository, otherwise, work within the https://github.com/seed-platform/seed repository. +#. Ensure there is a ticket/issue created for the work you are doing. Verify that the ticket is assigned to you and that it is part of the latest project board on the GitHub site (https://github.com/orgs/SEED-platform/projects). +#. Move the ticket/issue to 'In Progress' in the GitHub project tracker when you begin work +#. Create a branch off of develop (unless it is a hotfix, then branch of the appropriate tag). The recommended naming convention is -short-descriptive-name. +#. Make changes and write a test for the code added. +#. Make sure tests pass locally. Most branches created and pushed to GitHub will be tested automatically. +#. Upon completion of the work, create a pull request (PR) against the develop branch (or hotfix branch if applicable). In the PR description fill out the requested information and include the issue number (e.g., #1234). +#. Assign one label to the PR (not the ticket/issue) in order to auto-populate change logs (e.g., Bug, Feature, Maintenance, Performance, DoNotPublish) This is required and CI will fail if not present. + * **Bug** (these will appear as "Bug Fixes" in the change log) + * **Feature** (features will appear as “New Features” item in the change log) + * **Enhancement** (these will appear as “Improvements" in the change log) + * **Maintenance** (these will appear under “Maintenance" in the change log) + * **Performance** (these will appear under “Maintenance" in the change log) + * **Documentation** (these will appear under “Maintenance" in the change log) + * **Do not publish** (these will no appear in the change log) +#. Ensure all tests pass. +#. Assign a reviewer to the PR. +#. If the reviewer requests changes, then addresses changes and re-assign the reviewer as needed. +#. Once approved, merge the PR! +#. Move the related ticket(s)/issue(s) to the 'Ready to Deploy' column in the GitHub project tracker. + +Release Instructions +-------------------- + +To make a release do the following: + +#. Create a branch from develop to prepare the updates (e.g., 2.21.0-release-prep). +#. Update the root ``package.json`` file with the release version number, and then run ``npm install``. Always use MAJOR.MINOR.RELEASE. +#. Update the ``docs/sources/migrations.rst`` file with any required actions. +#. Commit the changes and push the release prep branch to GitHub, then go to the Releases page to draft a new release which will generate the changelog. +#. Copy the GitHub changelog results into ``CHANGELOG.md``. Cleanup the formatting and items as needed (make sure the spelling is correct, starts with a capital letter, if any PRs were missing the ``Do not publish`` label, etc.) and push the changelog update. +#. Make sure that any new UI needing localization has been tagged for translation, and that any new translation keys exist in the lokalise.com project. (see :doc:`translation documentation `). +#. Create PR for release preparation and merge after tests/reviews pass. +#. Create a new Release using the develop branch and new release number as the tag (https://github.com/SEED-platform/seed/releases). Include list of changes since previous release (e.g., the additions to ``CHANGELOG.md``). +#. Locally, merge the ``develop`` branch into the ``main`` branch and push. +#. Verify that the Docker versions are built and pushed to Docker Hub (https://hub.docker.com/r/seedplatform/seed/tags/). +#. Publish the new documentation in the seed-platform website repository (see instructions above under Building Documentation). + +.. _`SEED's Contribution Agreement in the GitHub repository`: https://github.com/SEED-platform/seed/blob/develop/.github/CONTRIBUTING.md diff --git a/docs/code_documentation/3.2.0/_sources/docker.rst.txt b/docs/code_documentation/3.2.0/_sources/docker.rst.txt new file mode 100644 index 00000000..00b0a5e4 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/docker.rst.txt @@ -0,0 +1,131 @@ +======================== +Docker Deployment on AWS +======================== + +Amazon Web Services (`AWS`_) provides the preferred hosting for the SEED Platform. + +**seed** is a `Django Project`_ and Django's documentation is an excellent place for general +understanding of this project's layout. + +.. _Django Project: https://www.djangoproject.com/ + +.. _AWS: http://aws.amazon.com/ + +Installation +^^^^^^^^^^^^ + +Ubuntu server 18.04 or newer with a m5ad.xlarge (if using in Production instance) + +* After launching the instance, run the following commands to install docker. + +.. code-block:: console + + # Install any upgrades + sudo apt-get update + sudo apt-get upgrade -y + + # Remove any old docker engines + sudo apt-get remove docker docker-engine docker.io containerd runc + + # Install docker community edition + sudo apt-get update + sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - + sudo add-apt-repository \ + "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) \ + stable" + + sudo apt-get update + sudo apt-get install -y docker-ce docker-ce-cli containerd.io + # Add your user to the docker group + sudo groupadd docker + sudo usermod -aG docker $USER + newgrp docker + +.. note:: It is okay if the first command fails + +* Verify that the DNS is working correctly. Run the following and verify the response lists IPs (v6 most likely) + +.. code-block:: console + + # verify that the dns resolves + docker run --rm seedplatform/seed getent hosts seed-platform.org + # or + docker run --rm tutum/dnsutils nslookup email.us-west-2.amazonaws.com + +* Install Docker compose + +.. code-block:: console + + sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose + +* Checkout SEED (or install from the releases). + +.. code-block:: console + + git clone + +* Add in the Server setting into profile.d. For example add the content below (appropriately filled out) into /etc/profile.d/seed.sh + +.. code-block:: console + + export POSTGRES_USER=seed + export POSTGRES_DB=seed + export POSTGRES_PASSWORD=GDEus3fasd1askj89QkAldjfX + export POSTGRES_PORT=5432 + export SECRET_KEY="96=7jg%_&1-z9c9qwwu2@w$hb3r322yf3lz@*ekw-1@ly-%+^" + + # The admin user is only valid only until the database is restored + export SEED_ADMIN_USER=user@seed-platform.org + export SEED_ADMIN_PASSWORD="7FeBWal38*&k3jlfa92lakj8ih4" + export SEED_ADMIN_ORG=default + + # For SES + export AWS_ACCESS_KEY_ID= + export AWS_SECRET_ACCESS_KEY= + export AWS_SES_REGION_NAME=us-west-2 + export AWS_SES_REGION_ENDPOINT=email.us-west-2.amazonaws.com + export SERVER_EMAIL=user@seed-platform.org + + # For custom cookie validity duration + export COOKIE_EXPIRATION=1209600 + + +* Before launching the first time, make sure the persistent volumes and the backup directory exist. + +.. code-block:: console + + docker volume create --name=seed_pgdata + docker volume create --name=seed_media + + mkdir -p $HOME/seed-backups + +.. note:: Make sure to have the seed-backups in your path, otherwise the db-postgres container will not launch. + +* Launch the project + +.. code-block:: console + + cd + ./deploy.sh + + +Deploying with Docker +^^^^^^^^^^^^^^^^^^^^^ + +The preferred way to deploy with Docker is using docker swarm and docker stack. +Look at the `deploy.sh script`_ for implementation details. + +The short version is to simply run the command below. Note that the passing of the docker-compose.yml filename is not required if using docker-compose.local.yml. + +```bash +./deploy.sh docker-compose.local.yml +``` + +If deploying using a custom docker-compose yml file, then simple replace the name in the command above. + + +.. _`deploy.sh script`: https://github.com/SEED-platform/seed/blob/develop/deploy.sh +.. _`JSON Type`: https://www.postgresql.org/docs/9.4/datatype-json.html diff --git a/docs/code_documentation/3.2.0/_sources/faq.rst.txt b/docs/code_documentation/3.2.0/_sources/faq.rst.txt new file mode 100644 index 00000000..8c3231be --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/faq.rst.txt @@ -0,0 +1,68 @@ +Frequently Asked Questions +########################## + +Here are some frequently asked questions and/or issues. + +.. contents:: + :local: + :depth: 2 + + + +Questions +========= +.. _whatisseed: + +What is the SEED Platform? +-------------------------- + +The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity. + +The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL. + +The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions. + +Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy. + + +Issues +====== + +.. _domain: + +Why is the domain set to example.com? +------------------------------------- + +If you see example.com in the emails that are sent from your hosted version of SEED then you will +need to update your django sites object in the database. + +.. code-block:: bash + + $ ./manage.py shell + + from django.contrib.sites.models import Site + one = Site.objects.all()[0] + one.domain = 'newdomain.org' + one.name = 'SEED' + one.save() + + +.. _staticfiles: + +Why aren't the static assets being served correctly? +---------------------------------------------------- + +Make sure that your local_untracked.py file does not have STATICFILES_STORAGE set to anything. If so, +then comment out that section and redeploy/recollect/compress your static assets. diff --git a/docs/code_documentation/3.2.0/_sources/getting_started.rst.txt b/docs/code_documentation/3.2.0/_sources/getting_started.rst.txt new file mode 100644 index 00000000..d0ae9497 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/getting_started.rst.txt @@ -0,0 +1,11 @@ +Getting Started +=============== + +Development Setup +----------------- + +.. toctree:: + :maxdepth: 2 + + setup_osx + setup_docker diff --git a/docs/code_documentation/3.2.0/_sources/help.rst.txt b/docs/code_documentation/3.2.0/_sources/help.rst.txt new file mode 100644 index 00000000..add7485b --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/help.rst.txt @@ -0,0 +1,28 @@ +Help +==== + +For SEED Platform Users +^^^^^^^^^^^^^^^^^^^^^^^ + +Please visit our website for information, tutorials, and documentation to help you learn how to use SEED. + +https://seed-platform.org + +The SEED Users Forum is where you can review user announcements, workflow questions, and join to connect with other users. + +https://lists.buildingenergytools.org/g/SEEDusers/topics + +For general inquiries or help on a specific problem, please fill out a request on the building data tools website help desk and select SEED as the relevant tool: + +https://buildingdata.energy.gov/#/help-desk + +For SEED Platform Developers +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The open-source code is available on the GitHub organization SEED-Platform and contains various repositories for the different components of the platform such as the main SEED application, a Python SEED client to communicate to SEED's API and various example datasets. + +https://github.com/SEED-platform + +The SEED Developers Forum contains various topics and joining enables you to connect with other developers. It is recommended to join this forum to submit developer questions, features requests, and report issues as needed. Also, submitting issues on GitHub is encouraged. + +https://lists.buildingenergytools.org/g/SEEDdevelopers/topics diff --git a/docs/code_documentation/3.2.0/_sources/index.rst.txt b/docs/code_documentation/3.2.0/_sources/index.rst.txt new file mode 100644 index 00000000..68ea4f7e --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/index.rst.txt @@ -0,0 +1,51 @@ +.. SEED Platform documentation master file, created by + sphinx-quickstart on Tue Mar 1 14:43:22 2016. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Standard Energy Efficiency Data (SEED) Platform +=============================================== + +The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity. + +The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL. + +The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions. + +Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy. + + +.. toctree:: + :maxdepth: 2 + + getting_started + deployment + api + data_model + data_quality + mapping + matching + modules + developer_resources + license + help + faq + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/code_documentation/3.2.0/_sources/kubernetes_deployment.rst.txt b/docs/code_documentation/3.2.0/_sources/kubernetes_deployment.rst.txt new file mode 100644 index 00000000..e39bec96 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/kubernetes_deployment.rst.txt @@ -0,0 +1,253 @@ +Kubernetes Deployment Guide with Helm +===================================== + +Kubernetes is a robust container orchestration system for easy application deployment and management. Helm takes that a step further with by packaging up required helm "charts" into one deployment command. + +Setup +----- + +Cluster +^^^^^^^ +In order to deploy the SEED platform on a Kubernetes you will need "cluster" which will be configured by your cloud service of choice. Each installation will be slightly different depending on the service. +Below are links to quick-start guides for provisioning a cluster and connecting. These instructions are specifically for AWS, but after the Kubernetes cluster is launched, the helm commands can be used in +the same way. + +* Amazon Web Services (`AWS`_) +* Google Cloud Platform (`GCP`_) +* Azure (`AKS`_) + +AWS CLI Configuration +~~~~~~~~~~~~~~~~~~~~~ +Download and configure the AWS CLI with instructions: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html + +.. code-block:: console + + aws configure + AWS Access Key ID [None]: (from account) + AWS Secret Access Key [None]: (from account) + Default region name [None]: us-east-1 + Default output format [None]: json + +Kubectl +^^^^^^^ +Download and install Kubectl: + +- `Windows `_ +- Mac (with Homebrew) :code:`brew install kubectl` + ``` + brew install kubectl + ``` + +Kubectl is the main function in which you will be interfacing with your deployed application on your cluster. This CLI is what connects you to your cluster that you have just provisioned. +If your cloud service did not have you configure kubectl in your cluster setup, you can download it `here `_. Once kubectl is installed and configured to your cluster +you can run some simple commands to ensure its working properly: + +.. code-block:: console + + #View the cluster + kubectl cluster-info + + #View pods, services and replicasets (will be empty until deploying an app) + kubectl get all + +All of the common kubectl commands can be found in these `docs `_ + +.. note:: For those unfamiliar with CLIs, there are a number of GUI applications that are able to deploy on your stack with ease. One of which is Kubernetes native application called `Dashboard UI`_ or a third-party application called Octant :code:`brew install octant`. + +Helm +^^^^ +Helm organizes all of your Kubernetes deployment, service, and volume yml files into "charts" that can be deployed, managed, and published with simple commands. +To install Helm: + +* `Windows eksctl `_ +* Mac (with Homebrew) :code:`brew install helm` + +EKS Control (AWS Specific) +^^^^^^^^^^^^^^^^^^^^^^^^^^ +EKSCtl is a command line tool to manage Elastic Kubernetes clusters on AWS. If not using AWS, then disregard this section. + +* `Windows eksctl config `_ +* Mac (with Homebrew) :code:`brew install eksctl` + +To launch a cluster on using EKSCts, run the following command in the terminal (assuming adequate permissions for the user). Also make sure to replace items in the `<>` brackets. + +.. code-block:: yaml + + eksctl create cluster \ + --name \ + --version 1.21 \ + --region us-east-1 \ + --node-type m5.large \ + --nodes 1 \ + --nodes-min 1 \ + --nodes-max 1 \ + --managed \ + --tags environment= + +Charts +^^^^^^ +SEED stores its charts in the `charts directory`_ of the Github Repo. There are two main charts that are deployed when starting SEED on Kubernetes. + +* persistentvolumes - these are the volumes to store SEED media data and SEED Postgres data +* seed - this stores all of the other deployment and service files for the application + +Unlike persistentvolumes, the seed charts must be modified with user environment variables that will be forwarded to the docker container for deployment. +Before deployment, the user **MUST** set these variables to their desired values. + +web-deployment.yaml +******************* +This chart contains the deployment specification for the SEED web container. Replace all the values in <>. + +.. code-block:: yaml + + # Environment variables for the web container + - env: + # AWS Email service variables to send emails to new users - can be removed if not using this functionality. + - name: AWS_ACCESS_KEY_ID + value: + - name: AWS_SECRET_ACCESS_KEY + value: + - name: AWS_SES_REGION_NAME + value: us-west-2 + - name: AWS_SES_REGION_ENDPOINT + value: email.us-west-2.amazonaws.com + - name: SERVER_EMAIL + value: info@seed-platform.org + # Django Variables + - name: DJANGO_SETTINGS_MODULE + value: config.settings.docker + - name: SECRET_KEY + value: + - name: SEED_ADMIN_ORG + value: default + - name: SEED_ADMIN_PASSWORD + value: + - name: SEED_ADMIN_USER + value: + - name: COOKIE_EXPIRATION + value: 1209600 + # Postgres variables + - name: POSTGRES_DB + value: seed + - name: POSTGRES_PASSWORD + value: # must match db-postgres-deployment.yaml and web-celery-deployment.yaml + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_USER + value: seeduser + # Bsyncr analysis variables + - name: BSYNCR_SERVER_PORT + value: "5000" + - name: BSYNCR_SERVER_HOST + value: bsyncr + # Sentry monitoring - remove if not applicable + - name: SENTRY_JS_DSN + value: + - name: SENTRY_RAVEN_DSN + value: + # Google self registration security - remove if not applicable + - name: GOOGLE_RECAPTCHA_SITE_KEY + value: + - name: GOOGLE_RECAPTCHA_SECRET_KEY + value: + image: seedplatform/seed: + #versions can be found here https://github.com/SEED-platform/seed/releases/tag/v2.9.3 + +web-celery-deployment.yaml +************************** +This chart contains the deployment specification for the Celery container to connect to Postgres. Replace the Postgres password to match web-deployment. + +.. code-block:: yaml + + - name: POSTGRES_PASSWORD + value: # must match db-postgres-deployment.yaml and web-celery-deployment.yaml + +bsyncr-deployment.yaml +********************** +This chart contains the deployment specification for the bsyncr analysis server. Request a NOAA token from `this website `_. + +.. code-block:: yaml + + - name: NOAA_TOKEN + value: + +Deployment +---------- +Once you are connected to your cluster and have your settings configured with the environment variables of you choice in the charts, you are ready to deploy the app. +First, make sure that the correct context is selected which is needed if there is more than one cluster: + +.. code-block:: bash + + kubectl config get-contexts + kubectl config use-context + +Deploy the site using the helm commands in the root of the charts directory. + +* :code:`helm install --generate-name persistentvolumes` +* :code:`helm install --generate-name seed` + +You will be able to see SEED coming online with statuses like container creating, and running with: + +* :code:`kubectl get all` + +Once all of the pods are running you will be able to hit the external ingress through the URL listed in the web service information. It should look something like + +.. code-block:: bash + + service/web LoadBalancer 10.100.154.227 80:32291/TCP + +Managing Existing Clusters +-------------------------- + +Upgrade/Redeploy the Helm Stack +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +To upgrade or dedeploy a helm chart, first find the helm release that you want to upgrade, then run the upgrade with the selected chart. + +.. code-block:: bash + + helm list + helm upgrade ./seed + +Managing the Kubernetes Cluster (AWS Specific) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Enable kubectl to talk to one of the created clusters by running the following command in the terminal after configuring the AWS credentials and cli. + +.. code-block:: bash + + aws eks --region update-kubeconfig --name + +Logging In +^^^^^^^^^^ +After a successful deployment in order to login you will need to create yourself as a user in the web container. To do this, we will exec into the container and run some Django commands. +* View all deployments and services, :code:`kubectl get all` +* :code:`kubectl get pods` +* :code:`kubectl exec -it -- bash` + +Now that we are in the container, we can make a user. +.. code-block:: bash + + ./manage.py create_default_user --username=admin@my.org --organization=seedorg --password=badpass + +You can now use these credentials to log in to the SEED website. + +Update web and web-celery +^^^^^^^^^^^^^^^^^^^^^^^^^ +The command below will restart the pods and re-pull the docker images. + +.. code-block:: bash + + kubectl rollout restart deployment web && kubectl rollout restart deployment web-celery + + +Other Resources +--------------- +Common kubectl actions can be found `on the kubernetes website `_ + + +.. _AWS: https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html +.. _GCP: https://cloud.google.com/kubernetes-engine/docs/quickstart +.. _AKS: https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough#connect-to-the-cluster + +.. _Dashboard UI: https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/ + +.. _charts directory: https://github.com/SEED-platform/seed/tree/develop/charts diff --git a/docs/code_documentation/3.2.0/_sources/license.rst.txt b/docs/code_documentation/3.2.0/_sources/license.rst.txt new file mode 100644 index 00000000..f29b1ce4 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/license.rst.txt @@ -0,0 +1,5 @@ +============== +License +============== + +.. include:: ../../LICENSE.md diff --git a/docs/code_documentation/3.2.0/_sources/linux.rst.txt b/docs/code_documentation/3.2.0/_sources/linux.rst.txt new file mode 100644 index 00000000..d5b97dc1 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/linux.rst.txt @@ -0,0 +1,331 @@ +General Linux Setup +=================== + +While Amazon Web Services (`AWS`_) provides the preferred hosting for SEED, +running on a bare-bones Linux server follows a similar setup, replacing the +AWS services with their Linux package counterparts, namely: PostgreSQL and +Redis. + +**SEED** is a `Django project`_ and Django's documentation +is an excellent place to general understanding of this project's layout. + +.. _Django project: https://www.djangoproject.com/ + +.. _AWS: http://aws.amazon.com/ + +Prerequisites +^^^^^^^^^^^^^^ + +Ubuntu server/desktop 16.04 or newer (18.04 recommended) + +Install the following base packages to run SEED: + +.. code-block:: console + + sudo add-apt-repository ppa:timescale/timescaledb-ppa + sudo apt update + sudo apt upgrade + sudo apt install libpq-dev python3-dev python3-pip libatlas-base-dev \ + gfortran build-essential nodejs npm libxml2-dev libxslt1-dev git \ + libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python mercurial + sudo apt install gdal-bin postgis + sudo apt install redis-server + sudo apt install timescaledb-postgresql-10 postgresql-contrib + +.. note:: postgresql ``>=9.3`` is required to support `JSON Type`_ + +.. _JSON Type: http://www.postgresql.org/docs/9.3/static/datatype-json.html + +Configure PostgreSQL +^^^^^^^^^^^^^^^^^^^^ + +Replace 'seeddb', 'seeduser' with desired db/user. By +default use password `seedpass` when prompted + +.. code-block:: console + + $ sudo timescaledb-tune + $ sudo service postgresql restart + $ sudo su - postgres + $ createuser -P "seeduser" + $ createdb "seeddb" --owner="seeduser" + $ psql + postgres=# GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO "seeduser"; + postgres=# ALTER USER "seeduser" CREATEDB CREATEROLE SUPERUSER; + postgres=# \q + $ exit + + +Python Dependencies +^^^^^^^^^^^^^^^^^^^ + +clone the **seed** repository from **github** + +.. code-block:: console + + $ git clone git@github.com:SEED-platform/seed.git + +enter the repo and install the python dependencies from `requirements`_ + +.. _requirements: https://github.com/SEED-platform/seed/blob/main/requirements/local.txt + +.. code-block:: console + + $ cd seed + $ pip3 install -r requirements/local.txt + + +JavaScript Dependencies +^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: console + + $ npm install + + +Django Database Configuration +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Copy the ``local_untracked.py.dist`` file in the ``config/settings`` directory to +``config/settings/local_untracked.py``, and add a ``DATABASES`` configuration with your database username, password, +host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database instance +you have manually installed within your infrastructure. + +.. code-block:: python + + # Database + DATABASES = { + 'default': { + 'ENGINE': 'django.contrib.gis.db.backends.postgis', + 'NAME': 'seeddb', + 'USER': 'seeduser', + 'PASSWORD': '', + 'HOST': 'localhost', + 'PORT': '5432', + } + } + + +.. note:: + + Other databases could be used such as MySQL, but are not supported + due to the postgres-specific `JSON Type`_ + +In in the above database configuration, ``seed`` is the database name, this is arbitrary and any valid name can be +used as long as the database exists. Enter the database name, user, password you set above. + +The database settings can be tested using the Django management command, ``python3 manage.py dbshell`` to connect to the +configured database. + +create the database tables and migrations: + +.. code-block:: console + + $ python3 manage.py migrate + +Cache and Message Broker +^^^^^^^^^^^^^^^^^^^^^^^^ + +The SEED project relies on `redis`_ for both cache and message brokering, and +is available as an AWS `ElastiCache`_ service or with the ``redis-server`` +Linux package. (``sudo apt install redis-server``) + +``local_untracked.py`` should be updated with the ``CACHES`` and ``CELERY_BROKER_URL`` +settings. + +.. _ElastiCache: https://aws.amazon.com/elasticache/ + +.. _redis: http://redis.io/ + + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + + +Creating the initial user +^^^^^^^^^^^^^^^^^^^^^^^^^ + +create a superuser to access the system + +.. code-block:: console + + $ python3 manage.py create_default_user --username=admin@my.org --organization=lbnl --password=badpass + + +.. note:: + + Of course, you need to save this user/password somewhere, since this is what + you will use to login to the SEED website. + + Every user must be tied to an organization, visit ``/app/#/profile/admin`` + as the superuser to create parent organizations and add users to them. + + + +Running celery the background task worker +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +`Celery`_ is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, ``celery`` +can be started: + +.. code-block:: console + + DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler + +.. _Celery: http://www.celeryproject.org/ + + +Running the development web server +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The Django dev server (not for production use) can be a quick and easy way to +get an instance up and running. The dev server runs by default on port 8000 +and can be run on any port. See Django's `runserver documentation`_ for more +options. + +.. _runserver documentation: https://docs.djangoproject.com/en/1.6/ref/django-admin/#django-admin-runserver + +.. code-block:: console + + $ python3 manage.py runserver --settings=config.settings.dev + + +Running a production web server +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Our recommended web server is uwsgi sitting behind nginx. The python package ``uwsgi`` is needed for this, and +should install to ``/usr/local/bin/uwsgi`` We recommend using ``dj-static`` to load static files. + +.. note:: + + The use of the ``dev`` settings file is production ready, and should be + used for non-AWS installs with ``DEBUG`` set to ``False`` for production use. + + +.. code-block:: console + + $ pip3 install uwsgi dj-static + + +Generate static files: + +.. code-block:: console + + $ python3 manage.py collectstatic --settings=config.settings.prod -i package.json -i package-lock.json -i node_modules/openlayers-ext/index.html + +Update ``config/settings/local_untracked.py``: + +.. code-block:: python + + DEBUG = False + # static files + STATIC_ROOT = 'collected_static' + STATIC_URL = '/static/' + +Start the web server (this also starts celery): + +.. code-block:: console + + $ ./bin/start-seed + +.. warning:: + + Note that uwsgi has port set to ``80``. In a production setting, a dedicated web server such as nginx would be + receiving requests on port 80 and passing requests to uwsgi running on a different port, e.g 8000. + + + + +Environment Variables +^^^^^^^^^^^^^^^^^^^^^ + +The following environment variables can be set within the ``~/.bashrc`` file to +override default Django settings. + +.. code-block:: bash + + export SENTRY_DSN=https://xyz@app.getsentry.com/123 + export DEBUG=False + export ONLY_HTTPS=True + + +Mail Services +^^^^^^^^^^^^^ + +AWS SES Service +--------------- + +In the AWS setup, we can use SES to provide an email service for Django. The service is +configured in the config/settings/local_untracked.py: + +.. code-block:: python + + EMAIL_BACKEND = 'django_ses.SESBackend' + + +In general, the following steps are needed to configure SES: + +1. Access Amazon SES Console - `Quickstart `_ +2. Login to Amazon SES Console. Verify which region we are using (e.g., us-east-1) +3. Decide on email address that will be sending the emails and add them to the `SES Verified Emails `_. +4. Test that SES works as expected (while in the SES sandbox). Note that you will need to add the sender and recipient emails to the verified emails while in the sandbox. +5. Update the local_untracked.py file or set the environment variables for the docker file. +6. Once ready, move the SES instance out of the sandbox. Following instructions `here `_ +7. (Optional) Set up Amazon Simple Notification Service (Amazon SNS) to notify you of bounced emails and other issues. +8. (Optional) Use the AWS Management Console to set up Easy DKIM, which is a way to authenticate your emails. Amazon SES console will have the values for SPF and DKIM that you need to put into your DNS. + +SMTP service +------------ + +Many options for setting up your own `SMTP`_ service/server or using other SMTP +third party services are available and compatible including `gmail`_. SMTP is not configured for working within Docker at the moment. + +.. _SMTP: https://docs.djangoproject.com/en/2.0/ref/settings/#email-backend +.. _gmail: http://stackoverflow.com/questions/19264907/python-django-gmail-smtp-setup + +.. code-block:: python + + EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' + +local_untracked.py +^^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + # PostgreSQL DB config + DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'seed', + 'USER': 'your-username', + 'PASSWORD': 'your-password', + 'HOST': 'your-host', + 'PORT': 'your-port', + } + } + + # config for local storage backend + DOMAIN_URLCONFS = {'default': 'config.urls'} + + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + + # SMTP config + EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' + + # static files + STATIC_ROOT = 'collected_static' + STATIC_URL = '/static/' diff --git a/docs/code_documentation/3.2.0/_sources/mapping.rst.txt b/docs/code_documentation/3.2.0/_sources/mapping.rst.txt new file mode 100644 index 00000000..077593ec --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/mapping.rst.txt @@ -0,0 +1,42 @@ +========= +Mapping +========= + +This document describes the set of calls that occur from the web client or API +down to the back-end for the process of mapping data into SEED. + +An overview of the process is: + +1. Import - A file is uploaded to the server +2. Save - The file is batched saved into the database as JSON data +3. Mapping - Mapping occurs on that file +4. Matching / Merging +5. Pairing + +Import +------ + +From the web UI, the import process invokes `seed.views.main.save_raw_data` to save the data. When the data is +done uploading, we need to know whether it is a Portfolio Manager file, so we can add metadata to the record in the +database. The end of the upload happens in `seed.data_importer.views.DataImportBackend.upload_complete`. At this +point, the request object has additional attributes for Portfolio Manager files. These are saved in the model +`seed.data_importer.models.ImportFile`. + +Mapping +------- + +Once files are uploaded, file header columns need to be mapped to SEED columns. Mappings can be specified/decided manually for any particular file import, +or mapping profiles can be created and subsequently applied to any file imports. + +When a column mapping profile is applied to an import file, file header columns defined in the profile must match exactly (spaces, lowercase, uppercase, etc.) +in order for the corresponding SEED column information to be used/mapped. + +Matching +-------- + +.. todo:: document + +Pairing +------- + +.. todo:: document diff --git a/docs/code_documentation/3.2.0/_sources/matching.rst.txt b/docs/code_documentation/3.2.0/_sources/matching.rst.txt new file mode 100644 index 00000000..2d28d935 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/matching.rst.txt @@ -0,0 +1,123 @@ +Matching +======== + +What is it? +----------- +Within SEED, matching refers to a possible relationship between at least 2 properties or at least 2 tax lots. +Two properties **match** if they have the same values for some specified field(s). +These specified fields are referred to as **matching criteria**, and each SEED organization has its +own set of matching criteria which is customizable by users. + +Why does it exist? +------------------ +At a high level, matching is used to identify if two or more property records are actually different +representations of the same property (or tax lots representing one tax lot). For example, within the same cycle, +two matching records, so one persists while the other is used and subsequently discarded to update the persisting record +(say if the building owner's phone number changed). Or across different cycles, it's possible that the +two records capture the same property at different times/cycles - this relationship is referred to as a **link**. + +How and when is it used? +------------------------ + +In-Cycle Merging +"""""""""""""""" +(This is different from manual merging.) + +For records within the same cycle, there really shouldn't be more than one +representation of the same property (or tax lot). As much as possible, the program +is set up to prevent this from happening by automatically **merging** matched +records together whenever they might occur in the same cycle. + +Specifically, a merge of matches might need to occur after any of the following events: + +1. The record has been manually edited. +2. The record was just created as a result of a manual merge (via the 'Actions' on the Properties or Tax Lots page). +3. The record has just been imported. + +The actual execution of merges includes a few additional, unrelated steps but, +in the scope of merging, the following occurs. + +The record in the scenarios listed above is the "target" record. Any and all +matches found, excluding the "target", are merged together first. If there are +overlapping values, priority is given to more recently updated records. + +Once these matches (excluding the target) are merged together, the final step is +to merge the "target" record. In all but one case, choosing between overlapping +values gives priority to the "target". That one case is when a record has just been +imported. Here, overlapping values follow merge protection rules set by +the user for an organization in this final step. + +Linking (Across Cycles) +""""""""""""""""""""""" +For records in different cycles, matches between these are considered links. +Links are used to connect snapshots of the same record year-over-year (at different time periods). +This allows for the analysis of how the record has changed over time. + +In the case of properties, these links are used to associate meters to properties. +This means that adding meters to a property in one cycle will make those meters +accessible to that same property's instance in all other cycles. + +This association can be viewed in aggregate; all of the records within some selected cycles are +grouped and displayed with their links. Alternatively, this association can be viewed for particular linked +group; the linked records of this group are displayed by themselves. + +Putting them Together, Match-Merge-Linking +"""""""""""""""""""""""""""""""""""""""""" +As mentioned earlier, there is a rule or assumption that at most one representation of +the same record can exist in any given cycle. + +This avoids unresolvable situations that would prevent year-over-year analysis. +In the most simple case, a record in `Cycle A` matches two records in `Cycle B`. +SEED wouldn't know which of the two records in `Cycle B` should be +the "snapshot" for this time period. + +For this reason, in-cycle match merging always occurs before cross-cycle match linking. +So when searches for links do happen, ambiguous cases have already been resolved. + +For an individual record, these are the following cases in which a +match-merge-link is automatically run: +1. Explicit triggering (from the Property/TaxLot Detail page) +2. After editing (in the Property/TaxLot Detail page) +3. After manual merging (in the Properties/Tax Lots list page). Explicitly +specified merges happen as chosen by the user. Then, if the resulting record has +matches, merges and/or linking happens. +4. When importing a record. If the incoming record has matches, +merges and/or linking happens. + +For a whole organization, a match-merge-link round for all records in that +organization is run in the following cases: +1. During the original deployment of this feature - This happens in order to +initially normalize the existing data and establish all initial links. +2. Whenever a user changes matching criteria - This happens in order to +re-normalize existing data and reestablish links. As of this writing, before +committing matching criteria changes, a user can view a preview of how their +records will be affected as these are difficult to reverse. + +Note on In-Cycle Not-merged Matches +""""""""""""""""""""""""""""""""""" +Even though the application tries it's best to have only one representative record per property +(or tax lot) per Cycle, it's possible for there to exist matches that were not merged. +This can happen if a user manually unmerges a record after a (manual or automatic) merge occurs. +If this happens, and there exists two records that match each other but are not merged, +both records are **completely unlinked**. Without user intervention such as editing +one of the matching criteria values, these will be merged and linked as described +above next time the system finds them during a match search. + +Match Searching in Depth +------------------------ +Though they accomplish the same goal, the process for merging is very different between the last case, importing, +and the first 2 cases, manual edit or manual merge. + +In the case of manual merging or editing, this process accounts for the fact that these are records that already exist. +Specifically, they may have associations such as labels, notes, pairings, and for properties, meters. +So during a subsequent match search leading to a merge of two or more records, all of these "old" associations are +carried over to the final record once merges are complete. + +In the case of importing, considerations must be taken for the fact that, in most cases, multiple records +are being imported together. Also, since this is the entry point for records, it's possible that a user might +accidentally try to import the same record snapshot twice - where all the record values are the same as another +existing record (as opposed to just having the same values for matching criteria fields). So on import, the process is as follows: + +1. Amongst only the incoming records, duplicates (of other incoming or existing) are flagged and ignored. +2. Amongst only the incoming records, matching records are merged together. +3. Amongst all records in the same Cycle, incoming records that match an existing record gets merged with priority to that existing record. If the incoming record has multiple existing matches, the existing matches are merged together in latest updated order first while also combining any other associations (labels, notes, etc.) just as in the manual merge or edit cases. Since the incoming record is new, it doesn't have any of the other associations. diff --git a/docs/code_documentation/3.2.0/_sources/migrations.rst.txt b/docs/code_documentation/3.2.0/_sources/migrations.rst.txt new file mode 100644 index 00000000..af857674 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/migrations.rst.txt @@ -0,0 +1,303 @@ +Migrations +========== + +Django handles the migration of the database very well; however, there are various changes to SEED that may require some custom (manual) migrations. The migration documentation includes the required changes based on deployment and development for each release. + +Version Develop +--------------- + +In order to support Redis passwords, the configuration of the Redis/Celery settings changed a bit. +You will need to add the following to your local_untracked.py configuration file. If you are using +Docker then you will not need to do this. + +.. code-block:: python + + CELERY_RESULT_BACKEND = CELERY_BROKER_URL + +If you are using a password, then in your local_untracked.py configuration, add the password to +the CELERY_BROKER_URL. Your final configuration should look like the following in your +local_untracked.py file + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://:password@127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + + CELERY_RESULT_BACKEND = CELERY_BROKER_URL + CELERY_TASK_DEFAULT_QUEUE = 'seed-local' + CELERY_TASK_QUEUES = ( + Queue( + CELERY_TASK_DEFAULT_QUEUE, + Exchange(CELERY_TASK_DEFAULT_QUEUE), + routing_key=CELERY_TASK_DEFAULT_QUEUE + ), + ) + +Version 3.2.0 +------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 3.1.0 +------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 3.0.0 +------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 3.0.0-beta.0 +-------------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.22.0 +-------------- +- Run ``./manage.py migrate``. +- There is a Redis dependency update in this release that requires users and deployments to modify their settings' ``CACHES`` config. + #. Update your dependencies with pip install -r requirements/base.txt + #. Update the CACHES BACKEND property to ``django_redis.cache.RedisCache`` + #. Update the CACHES LOCATION property to match the redis-py native URL notation for connection strings, including the redis protocol and database number. e.g. ``redis://localhost:6379/1`` + + Since the CELERY_BROKER_URL setting must also be in the same format, it may be helpful to configure that setting first and then reference it in the caches LOCATION parameter. +- See the `PR for an example migration `_. + +Version 2.21.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.20.1 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.20.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. +- There is a single long running migration related to importing census tract disadvantaged community data. This migration should take around 7 minutes to complete. + +Version 2.19.0 +-------------- +- Run `./manage.py migrate`. +- There is a new migration in this release that requires column names to be unique across `organization`, `table_name`, and `is_extra_data`. This migration will fail if there are duplicate column names. If you have duplicate column names, you will need to manually fix them in your database before running the migration. The following steps will help you identify and fix the duplicate column names: + - Check the organization age to gauge the impact of the change. If it is a deprecated org, impact of the change will be low. Often this issue arose in older organizations when units were not part of the columns. The old mapping columns were not upserts with the units, so typically the columns impacted are the ones with units. + - Query the `seed_column` table for the organization and column name displayed on the screen (e.g., `organization_id = 300 and column_name = 'Source EUI (kBtu/ft2)'`). If there is no `table_name` set, it is likely an import file column name and can easily be cleaned up without causing issues. In such cases, there will be two rows, and you want to keep the one with the `units_pint` column set. + - More complex columns may require deleting or updating the `column_id` in the `seed_columnmapping_*` tables. If there is a foreign key constraint with `seed_columnmapping_*`, take note of the ID you want to remove and the ID you want it to be replaced with (preferably keep the one with units_pint). + - If the constraint is on `seed_columnmapping_column_raw`: + - The field should be an import file column (i.e., no `table_name` item). Query for the old column in `seed_columnmapping_column_raw` (e.g., `column_name = `). + - Replace the old ID with the new one. If it errors because it already exists, then the row can be deleted. + - Return to the `seed_column` table and remove the old ID. + - If the constraint is on `seed_columnmapping_column_mapped`: + - The mapped column should have a `table_name` in the field. If not, it is likely an older organization. + - If there is no `table_name`, remove the row from the `seed_columnmapping_column_mapped` table. + - Return to the `seed_column` table and remove the old ID. + +Version 2.18.1 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.18.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.17.4 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.17.3 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.17.2 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.17.1 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.17.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.16.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.15.2 +-------------- +- There are no migrations needed for this version. + +Version 2.15.1 +-------------- +- There are no migrations needed for this version. + +Version 2.15.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.14.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.13.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.12.0 - 2.12.4 +----------------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.11.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.10.0 +-------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.7.3 to 2.9.0 +---------------------- +- The migrations should work without additional support. Simply run ``./manage.py migrate``. + +Version 2.7.2 +------------- +- The migrations should work without additional support. Simply run ``./manage.py migrate``. There are no manual migrations needed. +- Note the **Important Note** in Version 2.7.1 migration below which may require the need to run a "fake" migration + +Version 2.7.1 +------------- + +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +**Important Note:** + +If upgrading from `< 2.7.0` to `>= 2.7.1` you may encounter a failed migration with ``0118_match_merge_link_all_orgs``. This is expected if the database is several versions behind, and it effectively reorders migration 118 to run after all other migrations have completed to prepare your database to recognize properties and taxlots across multiple cycles. Run the following code manually to fully migrate: + +#. ``./manage.py migrate --fake seed 0118_match_merge_link_all_orgs`` + +#. ``./manage.py migrate`` + +#. ``./manage.py shell`` + + .. code-block:: python + + from seed.lib.superperms.orgs.models import Organization + from seed.utils.match import whole_org_match_merge_link + + for org in Organization.objects.all(): + whole_org_match_merge_link(org.id, 'PropertyState') + whole_org_match_merge_link(org.id, 'TaxLotState') + +Version 2.7.0 +------------- + +- This migration will run a match/merge/pair/link method upon migration. Make sure to run the migration manually and not inside of the docker container using the ./deploy.sh script. +- Make sure to backup the database before performing the migration. +- Run ``./manage.py migrate``. + +Version 2.6.1 +------------- + +- The migrations should work without additional support. Simply run ``./manage.py migrate``. There are no manual migrations needed for the 2.6.1 release. + + +Version 2.6.0 +------------- + +Version 2.6.0 includes support for meters and time series data storage. In order to use this release +you must first install `TimescaleDB`_. + +Docker-based Deployment +^^^^^^^^^^^^^^^^^^^^^^^ +Docker-based deployments shouldn't require running any additional commands for installation. The +timescaledb installation will happen automatically when updating the postgres container. Also, +the installation of the extension occurs in a Django migration. + +Ubuntu +^^^^^^ + +.. code-block:: console + + sudo add-apt-repository ppa:timescale/timescaledb-ppa + sudo apt update + sudo apt install timescaledb-postgresql-10 + sudo timescaledb-tune + sudo service postgresql restart + +Max OSX +^^^^^^^ + +.. code-block:: console + + brew tap timescale/tap + brew install timescaledb + /usr/local/bin/timescaledb_move.sh + timescaledb-tune + brew services restart postgresql + +Version 2.5.2 +------------- + +- There are no manual migrations that are needed. The ``./manage.py migrate`` command may take awhile to run since the migration requires the recalculation of all the normalized addresses to parse bldg correct and to cast the result as a string and not a bytestring. + +Version 2.5.1 +------------- + +- The migrations should work by simply running ``./manage.py migrate``. There are no manual migrations needed for the 2.5.1 release. + +Version 2.5.0 +------------- + +Docker-based Deployment +^^^^^^^^^^^^^^^^^^^^^^^ + +- Add the MapQuest API key to your organization. +- On deployment, the error below is indicative that you need to install the extensions in the postgres database. Run `docker exec update-postgis.sh`. + + django.db.utils.OperationalError: could not open extension control file "/usr/share/postgresql/11/extension/postgis.control": No such file or directory + +- If you are using a copied version of the docker-compose.yml file, then you need to change `127.0.0.1:5000/postgres` to `127.0.0.1:5000/postgres-seed` + +Development +^^^^^^^^^^^ + +- **Delete** your bower directory `rm -rf seed/static/vendors`. +- **Delete** your css directory `rm -rf seed/static/seed/css`. +- **Remove** these lines from `local_untracked.py` if you have them. + +.. code-block:: python + + DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage' + STATICFILES_STORAGE = DEFAULT_FILE_STORAGE + +- Run `pip3 install -r requirements/local.txt`. +- Run `npm install` from root checkout of SEED. + +- If testing geocoding, then sign up for as a `MapQuest Developer`_ and create a new `MapQuest Key`_. +- Add the key to the organization that you are using in development. + +- **Update** your DATABASES engine to be `django.contrib.gis.db.backends.postgis` + +.. code-block:: python + + DATABASES = { + 'default': { + 'ENGINE': 'django.contrib.gis.db.backends.postgis', + 'NAME': 'seeddb', + 'USER': 'seeduser', + 'PASSWORD': 'seedpass', + 'HOST': 'localhost', + 'PORT': '5432', + } + } + +- Run ``./manage.py migrate`` + +.. _`MapQuest Developer`: https://developer.mapquest.com/plan_purchase/steps/business_edition/business_edition_free/register + +.. _`MapQuest Key`: https://developer.mapquest.com/user/me/apps + +.. _`TimescaleDB`: https://docs.timescale.com/v1.2/getting-started diff --git a/docs/code_documentation/3.2.0/_sources/modules.rst.txt b/docs/code_documentation/3.2.0/_sources/modules.rst.txt new file mode 100644 index 00000000..4c920b9e --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules.rst.txt @@ -0,0 +1,26 @@ +========= +Modules +========= + +.. toctree:: + :maxdepth: 3 + + modules/config + modules/seed.cleansing + modules/seed.data + modules/seed.data_importer + modules/seed.features + modules/seed.landing + modules/seed.lib + modules/seed.lib.mappings + modules/seed.lib.merging + modules/seed.mappings + modules/seed.managers + modules/seed.models + modules/seed.public + modules/seed + modules/seed.serializers + modules/seed.tests + modules/seed.urls + modules/seed.utils + modules/seed.views diff --git a/docs/code_documentation/3.2.0/_sources/modules/config.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/config.rst.txt new file mode 100644 index 00000000..09215b7d --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/config.rst.txt @@ -0,0 +1,45 @@ +Configuration +============= + +Submodules +---------- + +Template Context +---------------- + +.. automodule:: config.template_context + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: config.tests + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: config.utils + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: config.views + :members: + :undoc-members: + :show-inheritance: + +WSGI +---- + +.. automodule:: config.wsgi + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.cleansing.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.cleansing.rst.txt new file mode 100644 index 00000000..e185fd8e --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.cleansing.rst.txt @@ -0,0 +1,35 @@ +Data Quality Package +==================== + +Inheritance +----------- + +.. inheritance-diagram:: seed.data_quality.models + :parts: 2 + +Submodules +---------- + +Models +------ + +.. automodule:: seed.models.data_quality + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: seed.tests.data_quality + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.views.data_quality + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.data.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.data.rst.txt new file mode 100644 index 00000000..cf066173 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.data.rst.txt @@ -0,0 +1,22 @@ +Data Package +============ + +Submodules +---------- + +BEDES +----- + +.. automodule:: seed.data.bedes + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.data + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.data_importer.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.data_importer.rst.txt new file mode 100644 index 00000000..a446d80d --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.data_importer.rst.txt @@ -0,0 +1,55 @@ +Data Importer Package +===================== + +Submodules +---------- + +Managers +-------- + +.. automodule:: seed.data_importer.managers + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. .. automodule:: seed.data_importer.models +.. :members: +.. :undoc-members: +.. :show-inheritance: + +URLs +---- + +.. automodule:: seed.data_importer.urls + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: seed.data_importer.utils + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.data_importer.views + :members: + :undoc-members: + :show-inheritance: + :noindex: + + +Module contents +--------------- + +.. automodule:: seed.data_importer + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.features.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.features.rst.txt new file mode 100644 index 00000000..ce361d2e --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.features.rst.txt @@ -0,0 +1,22 @@ +Features Package +================ + +Submodules +---------- + +.. Steps +.. -------------------------- + +.. .. automodule:: seed.features.steps +.. :members: +.. :undoc-members: +.. :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.features + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.landing.management.commands.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.landing.management.commands.rst.txt new file mode 100644 index 00000000..57da9c38 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.landing.management.commands.rst.txt @@ -0,0 +1,22 @@ +Landing Management Package +========================== + +Submodules +---------- + +Update EULA +----------- + +.. automodule:: seed.landing.management.commands.update_eula + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.landing.management.commands + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.landing.management.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.landing.management.rst.txt new file mode 100644 index 00000000..c17e2852 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.landing.management.rst.txt @@ -0,0 +1,17 @@ +seed.landing.management package +=============================== + +Subpackages +----------- + +.. toctree:: + + seed.landing.management.commands + +Module contents +--------------- + +.. automodule:: seed.landing.management + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.landing.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.landing.rst.txt new file mode 100644 index 00000000..8103b029 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.landing.rst.txt @@ -0,0 +1,61 @@ +Landing Package +=============== + +Subpackages +----------- + +.. toctree:: + + seed.landing.management + +Submodules +---------- + +Forms +----- + +.. automodule:: seed.landing.forms + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. automodule:: seed.landing.models + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: seed.landing.tests + :members: + :undoc-members: + :show-inheritance: + +URLs +---- + +.. automodule:: seed.landing.urls + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.landing.views + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.landing + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.lib.mappings.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.lib.mappings.rst.txt new file mode 100644 index 00000000..f7bbb15c --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.lib.mappings.rst.txt @@ -0,0 +1,62 @@ +seed.lib.mappings package +========================= + +Submodules +---------- + +seed.lib.mappings.mapper module +------------------------------- + +.. automodule:: seed.lib.mappings.mapper + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.mapping_columns module +---------------------------------------- + +.. automodule:: seed.lib.mappings.mapping_columns + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.mapping_data module +------------------------------------- + +.. automodule:: seed.lib.mappings.mapping_data + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.test_mapper module +------------------------------------ + +.. automodule:: seed.lib.mappings.test_mapper + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.test_mapping_columns module +--------------------------------------------- + +.. automodule:: seed.lib.mappings.test_mapping_columns + :members: + :undoc-members: + :show-inheritance: + +seed.lib.mappings.test_mapping_data module +------------------------------------------ + +.. automodule:: seed.lib.mappings.test_mapping_data + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.lib.mappings + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.lib.merging.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.lib.merging.rst.txt new file mode 100644 index 00000000..98b5be8a --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.lib.merging.rst.txt @@ -0,0 +1,22 @@ +seed.lib.merging package +======================== + +Submodules +---------- + +seed.lib.merging.merging module +------------------------------- + +.. automodule:: seed.lib.merging.merging + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.lib.merging + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.lib.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.lib.rst.txt new file mode 100644 index 00000000..8de8e0e6 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.lib.rst.txt @@ -0,0 +1,23 @@ +Library Packages +================ + +Submodules +---------- + +Module contents +--------------- + +.. automodule:: seed.lib + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: seed.lib.mappings + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: seed.lib.merging + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.management.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.management.rst.txt new file mode 100644 index 00000000..9b600793 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.management.rst.txt @@ -0,0 +1,17 @@ +Management Package +================== + +Subpackages +----------- + +.. toctree:: + + seed.management.commands + +Module contents +--------------- + +.. automodule:: seed.management + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.managers.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.managers.rst.txt new file mode 100644 index 00000000..d77c318c --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.managers.rst.txt @@ -0,0 +1,29 @@ +Managers Package +================ + +Subpackages +----------- + +.. toctree:: + + seed.managers.tests + +Submodules +---------- + +JSON +---- + +.. automodule:: seed.managers.json + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.managers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.managers.tests.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.managers.tests.rst.txt new file mode 100644 index 00000000..2ef2cc25 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.managers.tests.rst.txt @@ -0,0 +1,22 @@ +Manager Tests Package +===================== + +Submodules +---------- + +Test JSON Manager +----------------- + +.. automodule:: seed.managers.tests.test_json_manager + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.managers.tests + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.mappings.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.mappings.rst.txt new file mode 100644 index 00000000..e749754f --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.mappings.rst.txt @@ -0,0 +1,38 @@ +Mapping Package +=============== + +Submodules +---------- + +seed.mappings.mapper module +--------------------------- + +.. automodule:: seed.mappings.mapper + :members: + :undoc-members: + :show-inheritance: + +.. seed.mappings.reconcile_mappings module +.. --------------------------------------- + +.. .. automodule:: seed.mappings.reconcile_mappings +.. :members: +.. :undoc-members: +.. :show-inheritance: + +seed.mappings.seed_mappings module +---------------------------------- + +.. automodule:: seed.mappings.seed_mappings + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.mappings + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.models.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.models.rst.txt new file mode 100644 index 00000000..fb0187a3 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.models.rst.txt @@ -0,0 +1,71 @@ +Models +=================== + +Submodules +---------- + +AuditLog +--------------------------- + +.. automodule:: seed.models.auditlog + :members: + :undoc-members: + :show-inheritance: + +Columns +-------------------------- + +.. automodule:: seed.models.columns + :members: + :undoc-members: + :show-inheritance: + +Cycles +------------------------- + +.. automodule:: seed.models.cycles + :members: + :undoc-members: + :show-inheritance: + +Joins +------------------------ + +.. automodule:: seed.models.joins + :members: + :undoc-members: + :show-inheritance: + +Generic Models +------------------------- + +.. automodule:: seed.models.models + :members: + :undoc-members: + :show-inheritance: + + +Properties +----------------------------- + +.. automodule:: seed.models.properties + :members: + :undoc-members: + :show-inheritance: + +TaxLots +--------------------------- + +.. automodule:: seed.models.tax_lots + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.models + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.public.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.public.rst.txt new file mode 100644 index 00000000..8a292bdc --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.public.rst.txt @@ -0,0 +1,22 @@ +Public Package +============== + +Submodules +---------- + +Models +------ + +.. automodule:: seed.public.models + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.public + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.rst.txt new file mode 100644 index 00000000..771c0324 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.rst.txt @@ -0,0 +1,106 @@ +SEED Package +============ + +Subpackages +----------- + +.. toctree:: + + seed.features + seed.management + seed.mappings + seed.templatetags + seed.test_helpers + seed.tests + + +Inheritance +----------- + +.. inheritance-diagram:: seed.models + :parts: 2 + + +Submodules +---------- + +Decorators +---------- + +.. automodule:: seed.decorators + :members: + :undoc-members: + :show-inheritance: + +Factory +------- + +.. automodule:: seed.factory + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. automodule:: seed.models + :members: + :undoc-members: + :show-inheritance: + +.. Reconcile +.. --------- + +.. .. automodule:: seed.reconcile +.. :members: +.. :undoc-members: +.. :show-inheritance: + +Search +------ + +.. automodule:: seed.search + :members: + :undoc-members: + :show-inheritance: + +Tasks +----- + +.. automodule:: seed.tasks + :members: + :undoc-members: + :show-inheritance: + +Token Generator +--------------- + +.. automodule:: seed.token_generators + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: seed.utils + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.views + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.serializers.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.serializers.rst.txt new file mode 100644 index 00000000..5f3a7dcf --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.serializers.rst.txt @@ -0,0 +1,30 @@ +Serializers Package +=================== + +Submodules +---------- + +Serializers +----------- + +.. automodule:: seed.serializers.celery + :members: + :undoc-members: + :show-inheritance: + +Labels +------ + +.. automodule:: seed.serializers.labels + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.serializers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.templatetags.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.templatetags.rst.txt new file mode 100644 index 00000000..5f799d24 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.templatetags.rst.txt @@ -0,0 +1,13 @@ +Templatetags Package +========================= + +Submodules +---------- + +Breadcrumbs +----------- + +.. automodule:: seed.templatetags.breadcrumbs + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.test_helpers.factory.lib.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.test_helpers.factory.lib.rst.txt new file mode 100644 index 00000000..7cbfda51 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.test_helpers.factory.lib.rst.txt @@ -0,0 +1,13 @@ +Test Helper Factory Lib Package +=============================== + +Submodules +---------- + +Chomsky +------- + +.. automodule:: seed.test_helpers.factory.lib.chomsky + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.test_helpers.factory.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.test_helpers.factory.rst.txt new file mode 100644 index 00000000..3b3a5393 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.test_helpers.factory.rst.txt @@ -0,0 +1,20 @@ +Test Helper Factor Package +========================== + +Subpackages +----------- + +.. toctree:: + + seed.test_helpers.factory.lib + +Submodules +---------- + +Helpers +------- + +.. automodule:: seed.test_helpers.factory.helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.test_helpers.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.test_helpers.rst.txt new file mode 100644 index 00000000..d0ebe883 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.test_helpers.rst.txt @@ -0,0 +1,17 @@ +Test Helpers Package +==================== + +Subpackages +----------- + +.. toctree:: + + seed.test_helpers.factory + +Module contents +--------------- + +.. automodule:: seed.test_helpers + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.tests.functional.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.tests.functional.rst.txt new file mode 100644 index 00000000..774c5447 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.tests.functional.rst.txt @@ -0,0 +1,21 @@ +Tests (Functional) Package +========================== + +Submodules +---------- + +Base +---- +.. automodule:: seed.functional.tests.base + :members: + +Page +---- +.. automodule:: seed.functional.tests.page + :members: + +Pages +----- +.. automodule:: seed.functional.tests.pages + :members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.tests.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.tests.rst.txt new file mode 100644 index 00000000..dcbf1b28 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.tests.rst.txt @@ -0,0 +1,80 @@ +Tests Package +============= + +Submodules +---------- + +.. toctree:: + :maxdepth: 2 + + seed.test_helpers + seed.tests.functional + +Admin Views +----------- + +.. automodule:: seed.tests.test_admin_views + :members: + :undoc-members: + :show-inheritance: + +Decorators +---------- + +.. automodule:: seed.tests.test_decorators + :members: + :undoc-members: + :show-inheritance: + +Exporters +--------- + +.. automodule:: seed.tests.test_exporters + :members: + :undoc-members: + :show-inheritance: + +Models +------ + +.. automodule:: seed.tests.test_models + :members: + :undoc-members: + :show-inheritance: + +Tasks +----- + +.. automodule:: seed.tests.test_tasks + :members: + :undoc-members: + :show-inheritance: + +Views +----- + +.. automodule:: seed.tests.test_views + :members: + :undoc-members: + :show-inheritance: + +Tests +----- + +.. automodule:: seed.tests.tests + :members: + :undoc-members: + :show-inheritance: + +.. automodule:: seed.tests.functional + :members: + :undoc-members: + :show-inheritance: + +Utils +----- + +.. automodule:: seed.tests.util + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.urls.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.urls.rst.txt new file mode 100644 index 00000000..ab11d6be --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.urls.rst.txt @@ -0,0 +1,29 @@ +URLs Package +============ + +Submodules +---------- + +Accounts +-------- + +.. automodule:: seed.urls.accounts + :members: + :undoc-members: + :show-inheritance: + +APIs +---- + +.. automodule:: seed.urls.api + :members: + :undoc-members: + :show-inheritance: + +Main +---- + +.. automodule:: seed.urls.main + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.utils.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.utils.rst.txt new file mode 100644 index 00000000..27fd9b6c --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.utils.rst.txt @@ -0,0 +1,37 @@ +Utilities Package +================= + +Submodules +---------- + +APIs +---- + +.. automodule:: seed.utils.api + :members: + :undoc-members: + :show-inheritance: + +Buildings +--------- + +.. automodule:: seed.utils.buildings + :members: + :undoc-members: + :show-inheritance: + +Organizations +------------- + +.. automodule:: seed.utils.organizations + :members: + :undoc-members: + :show-inheritance: + +Time +---- + +.. automodule:: seed.utils.time + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/modules/seed.views.rst.txt b/docs/code_documentation/3.2.0/_sources/modules/seed.views.rst.txt new file mode 100644 index 00000000..195e1ed6 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/modules/seed.views.rst.txt @@ -0,0 +1,49 @@ +Views Package +============= + +Submodules +---------- + +Accounts +-------------------------- + +.. automodule:: seed.views.accounts + :members: + :undoc-members: + :show-inheritance: + :noindex: + +APIs +---- + +.. automodule:: seed.views.api + :members: + :undoc-members: + :show-inheritance: + :noindex: + +Main +---- + +.. automodule:: seed.views.main + :members: + :undoc-members: + :show-inheritance: + :noindex: + +Meters +------ + +.. automodule:: seed.views.meters + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: seed.views + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/code_documentation/3.2.0/_sources/postgres_upgrade.rst.txt b/docs/code_documentation/3.2.0/_sources/postgres_upgrade.rst.txt new file mode 100644 index 00000000..85ae58f5 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/postgres_upgrade.rst.txt @@ -0,0 +1,51 @@ +Upgrade a SEED database from Postgres 12 to Postgres 16 +======================================================= + +Assumptions +----------- + +- This process assumes that you're currently using Postgres 12.7 with TimescaleDB 2.3.0 from ``timescale/timescaledb-postgis:2.3.0-pg12`` or ``timescale/timescaledb-postgis:latest-pg12`` +- This also assumes that you have a directory in the host filesystem, e.g. ``~/share``, that is bind mounted to ``/share`` in your existing database container + +1. Create a dump of the current database + +.. code-block:: bash + + docker exec seed_postgres pg_dump -d seed -U seeduser -Fc -f /share/seed-pg12.dump + +2. Create a temporary Postgres 13 container using the Docker image ``timescale/timescaledb-ha:pg13.14-ts2.14.2-oss`` + +.. code-block:: bash + + docker run --rm --name=seed-pg13 -e POSTGRES_DB=seed -e POSTGRES_USER=seeduser -e POSTGRES_PASSWORD=password -v ~/share:/share timescale/timescaledb-ha:pg13.14-ts2.14.2-oss + +Once the container has finished initializing, open a separate shell + +.. code-block:: bash + + docker exec -it seed-pg13 bash + psql -d seed -U seeduser -c "CREATE EXTENSION postgis;" + psql -d seed -U seeduser -c "DROP EXTENSION timescaledb;" + psql -d seed -U seeduser -c "CREATE EXTENSION timescaledb WITH VERSION '2.3.0';" + psql -d seed -U seeduser -c "SELECT timescaledb_pre_restore();" + pg_restore -d seed -U seeduser /share/seed-pg12.dump + psql -d seed -U seeduser -c "SELECT timescaledb_post_restore();" + psql -d seed -U seeduser -c "ALTER EXTENSION timescaledb UPDATE;" + pg_dump -d seed -U seeduser -Fc -f /share/seed-pg13.dump + +3. Start the new, permanent Postgres 16 container using the Docker image ``timescale/timescaledb-ha:pg16.2-ts2.14.2-oss`` + +.. code-block:: bash + + docker run -d --name=seed-pg16 -e POSTGRES_DB=seed -e POSTGRES_USER=seeduser -e POSTGRES_PASSWORD=password -v ~/share:/share timescale/timescaledb-ha:pg16.2-ts2.14.2-oss + +Once the container has finished initializing, open a separate shell + +.. code-block:: bash + + docker exec -it seed-pg16 bash + psql -d seed -U seeduser -c "CREATE EXTENSION postgis;" + psql -d seed -U seeduser -c "SELECT timescaledb_pre_restore();" + pg_restore -d seed -U seeduser /share/seed-pg13.dump + psql -d seed -U seeduser -c "SELECT timescaledb_post_restore();" + pg_dump -d seed -U seeduser -Fc -f /share/seed-pg16.dump diff --git a/docs/code_documentation/3.2.0/_sources/setup_docker.rst.txt b/docs/code_documentation/3.2.0/_sources/setup_docker.rst.txt new file mode 100644 index 00000000..3f020794 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/setup_docker.rst.txt @@ -0,0 +1,149 @@ +Installation using Docker +========================= + +Docker works natively on Linux, Mac OSX, and Windows 10. If you are using an older version of +Windows (and some older versions of Mac OSX), you will need to install Docker Toolbox. + +Choose either `Docker Native (Windows/OSX)`_ or `Docker Native (Ubuntu)`_ to +install Docker. + +Docker Native (Ubuntu) +---------------------- + +Follow instructions `here `_. + +* `Install Docker Compose `_ + + +Docker Native (Windows/OSX) +--------------------------- + +Following instructions `for Mac `_ or +`for Windows `_. Note that for OSX you must have docker desktop version `3.0 or later `. + +* `Install Docker Compose `_ + + +Building and Running Containers for Non-Development +------------------------------------------------------- + +* Run Docker Compose + + .. code-block:: bash + + docker compose build + + `Be Patient`_ ... If the containers build successfully, then start the containers + + .. code-block:: bash + + docker volume create --name=seed_pgdata + docker volume create --name=seed_media + docker compose up + + **Note that you may need to build the containers a couple times for everything to converge** + +* Login to container + + The docker-compose file creates a default user and password. Below are the defaults but can + be overridden by setting environment variables. + + .. code-block:: bash + + username: user@seed-platform.org + password: super-secret-password + + +.. note:: + + Don't forget that you need to reset your default username and password if you are going + to use these Docker images in production mode! + +Using Docker for Development +---------------------------- + +The development environment is configured for live reloading (i.e., restart webserver when files change) +and debugging. It builds off the base docker-compose.yml, so it's necessary +to specify the files being used in docker-compose commands as seen below. + +Build +^^^^^ + +.. code-block:: bash + + # create volumes for the database and media directory + docker volume create --name=seed_pgdata + docker volume create --name=seed_media + + # build the images + docker compose -f docker-compose.yml -f docker-compose.dev.yml build + +Running the Server +^^^^^^^^^^^^^^^^^^ + +NOTE: the server config is sourced from config.settings.docker_dev, which will include +your local_untracked.py if it exists. If you have a local_untracked.py, make sure it doesn't +overwrite the database or celery configuration! + +.. code-block:: bash + + docker compose -f docker-compose.yml -f docker-compose.dev.yml up + +If the server doesn't start successfully, and :code:`docker compose logs` doesn't help, +the django development server probably failed to start due to an error in your config or code. +Unfortunately docker/django logging doesn't appear to work when the container is first started. +Just try running the server yourself with docker exec, and see what the output is. + +The development docker-compose file has some configurable parameters for specifying volumes to use: + +- SEED_DB_VOLUME: the name of the docker volume to mount for postgres +- SEED_MEDIA_VOLUME: the name of the docker volume to mount for the seed media folder + +Docker will use environment variables from the shell or from a .env file to set these values. + +This is useful if you want to switch between different databases for testing. +For example, if you want to create a separate volume for storing a production backup, you could do the following + +.. code-block:: bash + + docker volume create --name=seed_pgdata_prod + SEED_DB_VOLUME=seed_pgdata_prod docker compose -f docker-compose.yml -f docker-compose.dev.yml up + +NOTE: you'll need to run :code:`docker compose down` to remove the containers before you +can restart the containers connecting to different volumes. + +Running Tests +^^^^^^^^^^^^^ + +While the containers are running (i.e., after running the docker compose up command), use docker exec to run tests in the web container: + +.. code-block:: bash + + docker exec -it seed_web ./manage.py test --settings config.settings.docker_dev + +Add the setting :code:`--nocapture` in order to see :code:`stdout` while running tests. You will need to do this in order to make use of debugging as described below or the output to your debug commands will not display until after the break point has passed and the tests are finished. + +Also worth noting: output from logging (_log.debug, etc) will not display in any situation unless a test fails. + +Debugging +^^^^^^^^^ + +To use pdb on the server, the web container has `remote-pdb `_ installed. +In your code, insert the following + +.. code-block:: bash + + import remote_pdb; remote_pdb.set_trace() + +Once the breakpoint is triggered, you should see the web container log something like "RemotePdb session open at 127.0.0.1:41653, waiting for connection ...". +To connect to the remote session, run netcat from inside the container (using the appropriate port). + +.. code-block:: bash + + docker exec -it seed_web nc 127.0.0.1:41653 + +.. _MacPorts: https://www.macports.org/ +.. _Homebrew: http://brew.sh/ +.. _npm: https://www.npmjs.com/ +.. _nodejs.org: http://nodejs.org/ +.. _Be Patient: https://www.youtube.com/watch?v=f4hkPn0Un_Q diff --git a/docs/code_documentation/3.2.0/_sources/setup_osx.rst.txt b/docs/code_documentation/3.2.0/_sources/setup_osx.rst.txt new file mode 100644 index 00000000..9bc64be9 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/setup_osx.rst.txt @@ -0,0 +1,383 @@ +Installation on OSX +=================== + +.. _virtualenv: https://virtualenv.pypa.io/en/latest/ +.. _pyenv: https://github.com/pyenv/pyenv +.. _virtualenvwrapper: https://virtualenvwrapper.readthedocs.io/en/latest/ +.. _MacPorts: https://www.macports.org/ +.. _Homebrew: http://brew.sh/ +.. _npm: https://www.npmjs.com/ +.. _nodejs.org: http://nodejs.org/ + +These instructions are for installing and running SEED on Mac OSX in +development mode. + +Quick Installation Instructions +------------------------------- + +This section is intended for developers who may already have their machine +ready for general development. If this is not the case, skip to Prerequisites. Note that SEED uses python 3. + +* install Postgres 11.1 and redis for cache and message broker +* install PostGIS 2.5 and enable it on the database using `CREATE EXTENSION postgis;` +* install TimescaleDB 1.5.0 +* use a virtualenv (if desired) +* `git clone git@github.com:seed-platform/seed.git` +* create a `local_untracked.py` in the `config/settings` folder and add CACHE and DB config (example `local_untracked.py.dist`) +* to enable geocoding, get MapQuest API key and attach it to your organization +* `export DJANGO_SETTINGS_MODULE=config.settings.dev` in all terminals used by SEED (celery terminal and runserver terminal) +* `pip install -r requirements/local.txt` + * for condas python, you way need to run this command to get pip install to succeed: `conda install -c conda-forge python-crfsuite` +* npm install +* `./manage.py migrate` +* `./manage.py create_default_user` +* `./manage.py runserver` +* `DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 4 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler` +* navigate to `http://127.0.0.1:8000/app/#/profile/admin` in your browser to add users to organizations +* main app runs at `127.0.0.1:8000/app` + +The `python manage.py create_default_user` will setup a default `superuser` +which must be used to access the system the first time. The management command +can also create other superusers. + +.. code-block:: console + + ./manage.py create_default_user --username=demo@seed-platform.org --organization=lbl --password=demo123 + + +Prerequisites +------------- + +These instructions assume you have MacPorts_ or Homebrew_. Your system +should have the following dependencies already installed: + +* git (`port install git` or `brew install git`) +* graphviz (`brew install graphviz`) +* pyenv_ (Recommended) + + .. note:: + + Although you *could* install Python packages globally, this is the + easiest way to install Python packages. Setting these up first will + help avoid polluting your base Python installation and make it much + easier to switch between different versions of the code. + + .. code-block:: bash + + brew install pyenv + brew install pyenv-virtualenv + pyenv install + pyenv virtualenv seed + pyenv local seed + + +PostgreSQL 11.1 +--------------- + +MacPorts:: + + sudo su - root + port install postgresql94-server postgresql94 postgresql94-doc + # init db + mkdir -p /opt/local/var/db/postgresql94/defaultdb + chown postgres:postgres /opt/local/var/db/postgresql94/defaultdb + su postgres -c '/opt/local/lib/postgresql94/bin/initdb -D /opt/local/var/db/postgresql94/defaultdb' + + # At this point, you may want to add start/stop scripts or aliases to + # ~/.bashrc or your virtualenv ``postactivate`` script + # (in ``~/.virtualenvs/{env-name}/bin/postactivate``). + + alias pg_start='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \ + -D /opt/local/var/db/postgresql94/defaultdb \ + -l /opt/local/var/db/postgresql94/defaultdb/postgresql.log start"' + alias pg_stop='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \ + -D /opt/local/var/db/postgresql94/defaultdb stop"' + + pg_start + + sudo su - postgres + PATH=$PATH:/opt/local/lib/postgresql94/bin/ + +Homebrew:: + + brew install postgres + # follow the post install instructions to add to launchagents or call + # manually with `postgres -D /usr/local/var/postgres` + # Skip the remaining Postgres instructions! + + + +Configure PostgreSQL. Replace 'seeddb', 'seeduser' with desired db/user. By +default use password `seedpass` when prompted. Use the code block below in development only since +the seeduser is a SUPERUSER. + +.. code-block:: bash + + createuser -P seeduser + createdb `whoami` + psql -c 'CREATE DATABASE "seeddb" WITH OWNER = "seeduser";' + psql -c 'GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO seeduser;' + psql -c 'ALTER ROLE seeduser SUPERUSER;' + + + +PostGIS 2.5 +----------- + +MacPorts:: + + # Assuming you're still root from installing PostgreSQL, + port install postgis2 + + + +Homebrew:: + + brew install postgis + + + +Configure PostGIS:: + + psql -d seeddb -c "CREATE EXTENSION postgis;" + + # For testing, give seed user superuser access: + # psql -c 'ALTER USER seeduser CREATEDB;' + + +If upgrading from an existing database or existing local_untracked.py file, make sure to add the +MapQuest API Key and set the database engine to 'ENGINE': 'django.contrib.gis.db.backends.postgis'. + +Now exit any root environments, becoming just yourself (even though it's not +that easy being green), for the remainder of these instructions. + + +TimescaleDB 1.5.0 +----------------- + +Note, as of version 1.5.0, dumping and restoring databases requires that both the source and target +database have the same version of TimescaleDB. + +Downloading From Source:: + + # Note: Installing from source should only be done + # if you have a Postgres installation not maintained by Homebrew. + # This installation requires C compiler (e.g., gcc or clang) and CMake version 3.4 or greater. + + git clone https://github.com/timescale/timescaledb.git + cd timescaledb + git checkout 1.5.0 + + # Bootstrap the build system + ./bootstrap + + # If OpenSSL can't be found by cmake - run the following instead + # ./bootstrap -DOPENSSL_ROOT_DIR= # e.g., -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl + + # To build the extension + cd build && make + + # To install + make install + + # Find postgresql.conf + # Then uncomment the shared_preload_libraries line changing it to the following + # shared_preload_libraries = 'timescaledb' + psql -d postgres -c "SHOW config_file;" + + # Restart PostgreSQL instance + + + +Python Packages +--------------- + +Run these commands as your normal user id. + +Change to a virtualenv (using virtualenvwrapper) or do the following as a +superuser. A virtualenv is usually better for development. Set the virtualenv +to seed. + +.. code-block:: bash + + workon seed + +Make sure PostgreSQL command line scripts are in your PATH (if using MacPorts) + +.. code-block:: bash + + export PATH=$PATH:/opt/local/lib/postgresql94/bin + +Some packages (uWSGI) may need to find your C compiler. Make sure you have +'gcc' on your system, and then also export this to the `CC` environment +variable: + +.. code-block:: bash + + export CC=gcc + +Install requirements with `pip` + +.. code-block:: bash + + pip install -r requirements/local.txt + +NodeJS/npm +---------- + +Install npm_. You can do this by installing from nodejs.org_, MacPorts, or +Homebrew: + +MacPorts:: + + sudo port install npm + +Homebrew:: + + brew install npm + +Configure Django and Databases +------------------------------ + +In the `config/settings` directory, there must be a file called +`local_untracked.py` that sets up databases and a number of other things. +To create and edit this file, start by copying over the template + +.. code-block:: bash + + cd config/settings + cp local_untracked.py.dist local_untracked.py + +Edit `local_untracked.py`. Open the file you created in your favorite editor. The PostgreSQL config section will look something like this: + +.. code-block:: python + + # postgres DB config + DATABASES = { + 'default': { + 'ENGINE': 'django.contrib.gis.db.backends.postgis', + 'NAME': 'seeddb', + 'USER': 'seeduser', + 'PASSWORD': 'seedpass', + 'HOST': 'localhost', + 'PORT': '5432', + } + } + +You may want to comment out the AWS settings. + +For Redis, edit the `CACHES` and `CELERY_BROKER_URL` values to look like this: + +.. code-block:: python + + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' + CACHES = { + 'default': { + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, + } + } + +MapQuest API Key +---------------- + +Register for a MapQuest API key: +``_ + +Visit the Manage Keys page: +``_ +Either create a new key or use the key initially provided. +Copy the "Consumer Key" into the target organizations MapQuest API Key field under the organization's settings page or directly within the DB. + +Run Django Migrations +--------------------- + +Change back to the root of the repository. Now run the migration script to set +up the database tables + +.. code-block:: bash + + export DJANGO_SETTINGS_MODULE=config.settings.dev + ./manage.py migrate + +Django Admin User +----------------- + +You need a Django admin (super) user. + +.. code-block:: bash + + ./manage.py create_default_user --username=admin@my.org --organization=seedorg --password=badpass + +Of course, you need to save this user/password somewhere, since this is what +you will use to login to the SEED website. + +If you want to do any API testing (and of course you do!), you will need to +add an API KEY for this user. You can do this in postgresql directly: + +.. code-block:: bash + + psql seeddb seeduser + seeddb=> update landing_seeduser set api_key='DEADBEEF' where id=1; + +The 'secret' key DEADBEEF is hard-coded into the test scripts. + +Install Redis +------------- + +You need to manually install Redis for Celery to work. + +MacPorts:: + + sudo port install redis + +Homebrew:: + + brew install redis + # follow the post install instructions to add to launchagents or + # call manually with `redis-server` + +Install JavaScript Dependencies +------------------------------- + +The JS dependencies are installed using node.js package management (npm). + +.. code-block:: bash + + npm install + +Start the Server +---------------- + +You should put the following statement in ~/.bashrc or add it to the +virtualenv post-activation script (e.g., in +`~/.virtualenvs/seed/bin/postactivate`). + +.. code-block:: bash + + export DJANGO_SETTINGS_MODULE=config.settings.dev + +The combination of Redis, Celery, and Django have been encapsulated in a +single shell script, which examines existing processes and does not start +duplicate instances: + +.. code-block:: bash + + ./bin/start-seed.sh + +When this script is done, the Django stand-alone server will be running in +the foreground. + +Login +----- + +Open your browser and navigate to http://127.0.0.1:8000 + +Login with the user/password you created before, e.g., `admin@my.org` and +`badpass`. + +.. note:: + + these steps have been combined into a script called `start-seed.sh`. + The script will also not start Celery or Redis if they already seem + to be running. diff --git a/docs/code_documentation/3.2.0/_sources/translation.rst.txt b/docs/code_documentation/3.2.0/_sources/translation.rst.txt new file mode 100644 index 00000000..b40ae388 --- /dev/null +++ b/docs/code_documentation/3.2.0/_sources/translation.rst.txt @@ -0,0 +1,88 @@ +Translating SEED +================ + +1. Update translations on `lokalise`_. + +2. Copy lokalise.yml.example to lokalise.yml. Update API token. + +3. Install lokalise locally + + .. code:: bash + + brew tap lokalise/cli-2 + brew install lokalise2 + +3. Run scripts if you have Lokalise CLI installed. If not, see scripts for manual steps. + + .. code:: bash + + script/get_python_translations.sh + script/get_angular_translations.sh + +4. Uncomment the ``useMissingTranslationHandlerLog`` line seed.js to log untranslated strings to the console for review + +5. Verify and commit changes + +**Note: The lokalize website is the canonical source of data. If you +change the locale files locally, then you need to push them to +lokalize.** + +TL;DR + +SEED is localized for more than just English, so a little more care is +needed as we add new UI. All translatable strings are held in either +per-language ``.json`` files (for Angular-controlled strings, which are +the majority), or ``.mo`` files (for strings supplied by Django). + +At render time, SEED will sniff out the browser's ``Accept:`` header. +Based on that, we choose the right file. The language files themselves +are key->value mappings from a translation "key" to a translated value. +Either Angular or Django will then swap that value into the DOM wherever +it sees the key. If no translation is available, the key remains in the +DOM. (There are some wrinkles with HTML styling and pluralization that +we'll review below). + +So, the basic flow on top of any new UI features is now: + +1. Tag any user-visible strings in the UI as "translatable." There are + currently 12 (!) ways in which to do this; see below. +2. Create the translation key at `lokalise`_. We're using lokalise + because it can smooth over differences in the file formats that + Angular and Django require, and is a nice tool for managing the + process of getting translations done by a native speaker: we can put + up screenshots to clarify how the translated phrase is used, track + translation progress, etc. +3. Get a translation done. As a placeholder, lokalise can provide an + auto-filled translation from Google Translate or a few other + services, but it's fairly straightforward to order a professional + translation through lokalise. +4. Pull new translation files into the right places in the source tree + and commit them. There are scripts under ``/scripts`` to make this + mostly automatic. +5. Visually check that the containing UI looks OK with the translated + string(s). Some languages (e.g., French, German) can be wordy relative + to English and cause UI elements like buttons to expand oddly. Adjust + the layout or adjust the translation as needed. + +.. _general-philosophies--style: + +General philosophies / style +---------------------------- + +Don't go crazy with indirection and interpolation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +It's probably better to err on the side of too many keys than to get +clever with interpolation or Angular expressions to avoid +near-duplicates of keys. The aim should be that there is at least one +place where a competent translator can see the whole string at once. + +Compare: + +:: + +

{$:: inventory_type == 'taxlots' ? + translations['INCLUDE_SHARED_TAXLOTS'] : + translations['INCLUDE_SHARED'] + +.. _lokalise: https://lokalise.com/project/3537487659ca9b1dce98a7.36378626/?view=multi diff --git a/docs/code_documentation/3.2.0/_static/_sphinx_javascript_frameworks_compat.js b/docs/code_documentation/3.2.0/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/docs/code_documentation/3.2.0/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/docs/code_documentation/3.2.0/_static/basic.css b/docs/code_documentation/3.2.0/_static/basic.css new file mode 100644 index 00000000..30fee9d0 --- /dev/null +++ b/docs/code_documentation/3.2.0/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/_static/css/badge_only.css b/docs/code_documentation/3.2.0/_static/css/badge_only.css new file mode 100644 index 00000000..c718cee4 --- /dev/null +++ b/docs/code_documentation/3.2.0/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/Roboto-Slab-Bold.woff b/docs/code_documentation/3.2.0/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/Roboto-Slab-Bold.woff2 b/docs/code_documentation/3.2.0/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/Roboto-Slab-Regular.woff b/docs/code_documentation/3.2.0/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/Roboto-Slab-Regular.woff2 b/docs/code_documentation/3.2.0/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/fontawesome-webfont.eot b/docs/code_documentation/3.2.0/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/fontawesome-webfont.svg b/docs/code_documentation/3.2.0/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/docs/code_documentation/3.2.0/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/fontawesome-webfont.ttf b/docs/code_documentation/3.2.0/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/fontawesome-webfont.woff b/docs/code_documentation/3.2.0/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/fontawesome-webfont.woff2 b/docs/code_documentation/3.2.0/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/lato-bold-italic.woff b/docs/code_documentation/3.2.0/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/css/fonts/lato-bold-italic.woff differ diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/lato-bold-italic.woff2 b/docs/code_documentation/3.2.0/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/lato-bold.woff b/docs/code_documentation/3.2.0/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/css/fonts/lato-bold.woff differ diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/lato-bold.woff2 b/docs/code_documentation/3.2.0/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/css/fonts/lato-bold.woff2 differ diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/lato-normal-italic.woff b/docs/code_documentation/3.2.0/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/css/fonts/lato-normal-italic.woff differ diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/lato-normal-italic.woff2 b/docs/code_documentation/3.2.0/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/lato-normal.woff b/docs/code_documentation/3.2.0/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/css/fonts/lato-normal.woff differ diff --git a/docs/code_documentation/3.2.0/_static/css/fonts/lato-normal.woff2 b/docs/code_documentation/3.2.0/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/css/fonts/lato-normal.woff2 differ diff --git a/docs/code_documentation/3.2.0/_static/css/theme.css b/docs/code_documentation/3.2.0/_static/css/theme.css new file mode 100644 index 00000000..19a446a0 --- /dev/null +++ b/docs/code_documentation/3.2.0/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/_static/doctools.js b/docs/code_documentation/3.2.0/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/docs/code_documentation/3.2.0/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs/code_documentation/3.2.0/_static/documentation_options.js b/docs/code_documentation/3.2.0/_static/documentation_options.js new file mode 100644 index 00000000..b1611d5c --- /dev/null +++ b/docs/code_documentation/3.2.0/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '3.2.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/_static/file.png b/docs/code_documentation/3.2.0/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/file.png differ diff --git a/docs/code_documentation/3.2.0/_static/graphviz.css b/docs/code_documentation/3.2.0/_static/graphviz.css new file mode 100644 index 00000000..8d81c02e --- /dev/null +++ b/docs/code_documentation/3.2.0/_static/graphviz.css @@ -0,0 +1,19 @@ +/* + * graphviz.css + * ~~~~~~~~~~~~ + * + * Sphinx stylesheet -- graphviz extension. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +img.graphviz { + border: 0; + max-width: 100%; +} + +object.graphviz { + max-width: 100%; +} diff --git a/docs/code_documentation/3.2.0/_static/jquery.js b/docs/code_documentation/3.2.0/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/docs/code_documentation/3.2.0/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/_static/js/html5shiv.min.js b/docs/code_documentation/3.2.0/_static/js/html5shiv.min.js new file mode 100644 index 00000000..cd1c674f --- /dev/null +++ b/docs/code_documentation/3.2.0/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/_static/js/theme.js b/docs/code_documentation/3.2.0/_static/js/theme.js new file mode 100644 index 00000000..1fddb6ee --- /dev/null +++ b/docs/code_documentation/3.2.0/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/docs/code_documentation/3.2.0/_static/minus.png b/docs/code_documentation/3.2.0/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/minus.png differ diff --git a/docs/code_documentation/3.2.0/_static/plus.png b/docs/code_documentation/3.2.0/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/docs/code_documentation/3.2.0/_static/plus.png differ diff --git a/docs/code_documentation/3.2.0/_static/pygments.css b/docs/code_documentation/3.2.0/_static/pygments.css new file mode 100644 index 00000000..0d49244e --- /dev/null +++ b/docs/code_documentation/3.2.0/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/_static/searchtools.js b/docs/code_documentation/3.2.0/_static/searchtools.js new file mode 100644 index 00000000..7918c3fa --- /dev/null +++ b/docs/code_documentation/3.2.0/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/docs/code_documentation/3.2.0/_static/sphinx_highlight.js b/docs/code_documentation/3.2.0/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/docs/code_documentation/3.2.0/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/docs/code_documentation/3.2.0/api.html b/docs/code_documentation/3.2.0/api.html new file mode 100644 index 00000000..82cd8078 --- /dev/null +++ b/docs/code_documentation/3.2.0/api.html @@ -0,0 +1,185 @@ + + + + + + + API — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

API

+
+

Authentication

+

Authentication is handled via an encoded authorization token set in a HTTP header. +To request an API token, go to /app/#/profile/developer and click ‘Get a New API Key’.

+

Authenticate every API request with your username (email, all lowercase) and the API key via Basic Auth. +The header is sent in the form of Authorization: Basic <credentials>, where credentials is the base64 encoding of the email and key joined by a single colon :.

+

Using Python, use the requests library:

+
import requests
+
+result = requests.get('https://seed-platform.org/api/version/', auth=(user_email, api_key))
+print result.json()
+
+
+

Using curl, pass the username and API key as follows:

+
curl -u user_email:api_key http://seed-platform.org/api/version/
+
+
+

If authentication fails, the response’s status code will be 302, redirecting the user to /app/login.

+
+
+

Payloads

+

Many requests require a JSON-encoded payload and parameters in the query string of the url. A frequent +requirement is including the organization_id of the org you belong to. For example:

+
curl -u user_email:api_key https://seed-platform.org/api/v2/organizations/12/
+
+
+

Or in a JSON payload:

+
curl -u user_email:api_key \
+  -d '{"organization_id":6, "role": "viewer"}' \
+  https://seed-platform.org/api/v2/users/12/update_role/
+
+
+

Using Python:

+
params = {'organization_id': 6, 'role': 'viewer'}
+result = requests.post('https://seed-platform.org/api/v2/users/12/update_role/',
+                       data=json.dumps(params),
+                       auth=(user_email, api_key))
+print result.json()
+
+
+
+
+

Responses

+

Responses from all requests will be JSON-encoded objects, as specified in each endpoint’s documentation. +In the case of an error, most endpoints will return this instead of the expected payload (or an HTTP status code):

+
{
+    "status": "error",
+    "message": "explanation of the error here"
+}
+
+
+
+
+

API Endpoints

+

A list of interactive endpoints are available by accessing the API menu item on the left navigation +pane within you account on your SEED instance.

+

To view a list of non-interactive endpoints without an account, view swagger on the development server.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/aws.html b/docs/code_documentation/3.2.0/aws.html new file mode 100644 index 00000000..6957e1ed --- /dev/null +++ b/docs/code_documentation/3.2.0/aws.html @@ -0,0 +1,275 @@ + + + + + + + AWS Setup — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

AWS Setup

+

Amazon Web Services (AWS) provides the preferred hosting for the SEED Platform.

+

seed is a Django Project and Django’s documentation is an excellent place for general +understanding of this project’s layout.

+
+

Prerequisites

+

Ubuntu server 18.04 LTS

+
+

Note

+

These instructions have not been updated for Ubuntu 18.04. It is recommended to use Docker-based deployments.

+
+
sudo apt-get update
+sudo apt-get upgrade
+sudo apt-get install -y libpq-dev python-dev python-pip libatlas-base-dev \
+gfortran build-essential g++ npm libxml2-dev libxslt1-dev git mercurial \
+libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python
+
+
+

PostgreSQL and Redis are not included in the above commands. For a quick installation on AWS it +is okay to install PostgreSQL and Redis locally on the AWS instance. If a more permanent and +scalable solution, it is recommended to use AWS’s hosted Redis (ElastiCache) and PostgreSQL service.

+
+

Note

+

postgresql >=9.4 is required to support JSON Type

+
+
# To install PostgreSQL and Redis locally
+sudo apt-get install redis-server
+sudo apt-get install postgresql postgresql-contrib
+
+
+
+

Amazon Web Services (AWS) Dependencies

+

The following AWS services can be used for SEED but are not required:

+
    +
  • RDS (PostgreSQL >=9.4)

  • +
  • ElastiCache (redis)

  • +
  • SES

  • +
+
+
+
+

Python Dependencies

+

Clone the SEED repository from github

+
$ git clone git@github.com:SEED-platform/seed.git
+
+
+

enter the repo and install the python dependencies from requirements

+
$ cd seed
+$ sudo pip install -r requirements/aws.txt
+
+
+
+
+

JavaScript Dependencies

+

npm is required to install the JS dependencies.

+
$ sudo apt-get install build-essential
+$ sudo apt-get install curl
+
+
+
$ npm install
+
+
+
+
+

Database Configuration

+

Copy the local_untracked.py.dist file in the config/settings directory to +config/settings/local_untracked.py, and add a DATABASES configuration with your database username, +password, host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database +instance you have manually installed within your infrastructure.

+
# Database
+DATABASES = {
+    'default': {
+        'ENGINE':'django.db.backends.postgresql_psycopg2',
+        'NAME': 'seed',
+        'USER': '',
+        'PASSWORD': '',
+        'HOST': '',
+        'PORT': '',
+    }
+}
+
+
+
+

Note

+

In the above database configuration, seed is the database name, this +is arbitrary and any valid name can be used as long as the database exists.

+
+

create the database within the postgres psql shell:

+
CREATE DATABASE seed;
+
+
+

or from the command line:

+
createdb seed
+
+
+

create the database tables and migrations:

+
python manage.py syncdb
+python manage.py migrate
+
+
+

create a superuser to access the system

+
$ python manage.py create_default_user --username=demo@example.com --organization=example --password=demo123
+
+
+
+

Note

+

Every user must be tied to an organization, visit /app/#/profile/admin +as the superuser to create parent organizations and add users to them.

+
+
+
+

Cache and Message Broker

+

The SEED project relies on redis for both cache and message brokering, and +is available as an AWS ElastiCache service. +local_untracked.py should be updated with the CACHES and CELERY_BROKER_URL +settings.

+
CELERY_BROKER_URL = 'redis://seed-core-cache.ntmprk.0001.usw2.cache.amazonaws.com:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+
+
+
+

Running Celery the Background Task Worker

+

Celery is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, celery +can be started:

+
celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/data_model.html b/docs/code_documentation/3.2.0/data_model.html new file mode 100644 index 00000000..564d0cd7 --- /dev/null +++ b/docs/code_documentation/3.2.0/data_model.html @@ -0,0 +1,606 @@ + + + + + + + Data Model — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Data Model

+_images/case-a.webp +_images/case-b.webp +_images/case-c.webp +_images/case-d.webp +_images/data-model.webp +
+

Todo

+

Documentation below is out of state and needs updated.

+
+

Our primary data model is based on a tree structure with BuildingSnapshot +instances as nodes of the tree and the tip of the tree referenced by a +CanonicalBuilding.

+

Take the following example: a user has loaded a CSV file containing information +about one building and created the first BuildingSnapshot (BS0). At this point +in time, BS0 is linked to the first CanonicalBuilding (CB0), and CB0 is also +linked to BS0.

+
BS0 <-- CB0
+BS0 --> CB0
+
+
+

These relations are represented in the database as foreign keys from the +BuildingSnapshot table to the CanonicalBuilding table, and from the +CanonicalBuilding table to the BuildingSnapshot table.

+

The tree structure comes to fruition when a building, BS0 in our case, is +matched with a new building, say BS1, enters the system and is auto-matched.

+

Here BS1 entered the system and was matched with BS0. When a match occurs, +a new BuildingSnapshot is created, BS2, with the fields from the existing +BuildingSnapshot, BS0, and the new BuildingSnapshot, BS1, merged +together. If both the existing and new BuildingSnapshot have data for a +given field, the new record’s fields are preferred and merged into the child, B3.

+

The fields from new snapshot are preferred because that is the newer of the +two records from the perspective of the system. By preferring the most recent fields +this allows for evolving building snapshots over time. For example, if an existing +canonical record has a Site EUI value of 75 and some changes happen to a building +that cause this to change to 80 the user can submit a new record with that change.

+

All BuildingSnapshot instances point to a CanonicalBuilding.

+
BS0  BS1
+  \ /
+  BS2 <-- CB0
+
+BS0 --> CB0
+BS1 --> CB0
+BS2 --> CB0
+
+
+
+

parents and children

+

BuildingSnapshots also have linkage to other BuildingSnapshots in order to +keep track of their parents and children. This is represented in the +Django model as a many-to-many relation from BuildingSnapshot to BuildingSnapshot. +It is represented in the PostgreSQL database as an additional seed_buildingsnapshot_children +table.

+

In our case here, BS0 and BS1 would both have children BS2, and BS2 would +have parents BS0 and BS1.

+
+

Note

+

throughout most of the application, the search_buildings endpoint +is used to search or list active building. This is to say, buildings that +are pointed to by an active CanonicalBuilding. +The search_mapping_results endpoint allows the search of buildings +regardless of whether the BuildingSnapshot is pointed to by an active +CanonicalBuilding or not and this search is needed during the mapping +preview and matching sections of the application.

+
+

For illustration purposes let’s suppose BS2 and a new building BS3 match to form a child BS4.

+ + + + + + + + + + + + + + + + + + + + +

parent

child

BS0

BS2

BS1

BS2

BS2

BS4

BS3

BS4

+

And the corresponding tree would look like:

+
BS0  BS1
+  \ /
+  BS2  BS3
+    \  /
+     BS4 <-- CB0
+
+BS0 --> CB0
+BS1 --> CB0
+BS2 --> CB0
+BS3 --> CB0
+BS4 --> CB0
+
+
+
+

matching

+

During the auto-matching process, if a raw BuildingSnapshot matches an +existing BuildingSnapshot instance, then it will point to the existing +BuildingSnapshot instance’s CanonicalBuilding. In the case where there is no +existing BuildingSnapshot to match, a new CanonicalBuilding will be created, as +happened to B0 and C0 above.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

field

BS0

BS1

BS2 (child)

id1

11

11

11

id2

12

12

id3

13

13

id4

14

15

15

+
+
+
+

manual-matching vs auto-matching

+

Since BuildingSnapshots can be manually matched, there is the possibility for +two BuildingSnapshots each with an active CanonicalBuilding to match and the +system has to choose to move only one CanonicalBuilding to the tip of the tree +for the primary BuildingSnapshot and deactivate the secondary +BuildingSnapshot’s CanonicalBuilding.

+

Take for example:

+
BS0  BS1
+  \ /
+  BS2  BS3
+    \  /
+     BS4 <-- CB0 (active: True)         BS5 <-- CB1 (active: True)
+
+
+

If a user decides to manually match BS4 and BS5, the system will take the +primary BuildingSnapshot’s CanonicalBuilding and have it point to their +child and deactivate CB1. The deactivation is handled by setting a field +on the CanonicalBuilding instance, active, from True to False.

+

Here is what the tree would look like after the manual match of BS4 and +BS5:

+
BS0  BS1
+  \ /
+  BS2  BS3
+    \  /
+     BS4  BS5 <-- CB1 (active: False)
+       \  /
+        BS6 <-- CB0 (active: True)
+
+
+

Even though BS5 is pointed to by a CanonicalBuilding, CB1, BS5 will not be +returned by the normal search_buildings endpoint because the +CanonicalBuilding pointing to it has its field active set to False.

+
+

Note

+

anytime a match is unmatched the system will create a new +CanonicalBuilding or set an existing CanonicalBuilding’s active field to +True for any leaf BuildingSnapshot trees.

+
+
+
+

what really happens to the BuildingSnapshot table on import (and when)

+

The above is conceptually what happens but sometimes the devil is in the details. +Here is what happens to the BuildingSnapshot table in the database when records +are imported.

+

Every time a record is added at least two BuildingSnapshot records are created.

+

Consider the following simple record:

+ + + + + + + + + + + + + + + + + +

Property Id

Year Ending

Property Floor Area

Address 1

Release Date

499045

2000

1234

1 fake st

12/12/2000

+

The first thing the user is upload the file. When the user sees the +“Successful Upload!” dialog one record has been added to the +BuildingSnapshot table.

+

This new record has an id (73700 in this case) and a created and +modified timestamp. Then there are a lot of empty fields and a +source_type of 0. Then there is the extra_data column which contains +the contents of the record in key-value form:

+
+
Address 1:
+

“1 fake st”

+
+
Property Id:
+

“499045”

+
+
Year Ending:
+

“2000”

+
+
Release Date:
+

“12/12/2000”

+
+
Property Floor Area:
+

“1234”

+
+
+

And a corresponding extra_data_sources that looks like

+
+
Address 1:
+

73700

+
+
Property Id:
+

73700

+
+
Year Ending:
+

73700

+
+
Release Date:
+

73700

+
+
Property Floor Area:
+

73700

+
+
+

All of the fields that look like _source_id are also populated +with 73700 E.G. owner_postal_code_source_id.

+

The other fields of interest are the organization field which +is populated with the user’s default organization and the import_file_id +field which is populated with a reference to a data_importer_importfile record.

+

At this point the record has been created before the user hits the +“Continue to data mapping” button.

+

The second record (id = 73701) is created by the time the user gets to the screen +with the “Save Mappings” button. This second record has the following fields populated:

+
    +
  • id

  • +
  • created

  • +
  • modified

  • +
  • pm_property_id

  • +
  • year_ending

  • +
  • gross_floor_area

  • +
  • address_line_1

  • +
  • release_date

  • +
  • source_type (this is 2 instead of 0 as with the other record)

  • +
  • import_file_id

  • +
  • organization_id.

  • +
+

That is all. All other fields are empty. In this case that is all that happens.

+

Now consider the same user uploading a new file from the next year that looks like

+ + + + + + + + + + + + + + + + + +

Property Id

Year Ending

Property Floor Area

Address 1

Release Date

499045

2000

1234

1 fake st

12/12/2001

+

As before one new record is created on upload. This has id 73702 and follows the same +pattern as 73700. And similarly 73703 is created like 73701 before the “Save Mappings” +button appears.

+

However this time the system was able to make a match with an existing record. +After the user clicks the “Confirm mappings & start matching” button a new record +is created with ID 73704.

+

73704 is identical to 73703 (in terms of contents of the BuildingSnapshot table only) +with the following exceptions:

+
    +
  • created and modified timestamps are different

  • +
  • match type is populated and has a value of 1

  • +
  • confidence is populated and has a value of .9

  • +
  • source_type is 4 instead of 2

  • +
  • canonical_building_id is populated with a value

  • +
  • import_file_id is NULL

  • +
  • last_modified_by_id is populated with value 2 (This is a key into the landing_seeduser table)

  • +
  • address_line_1_source_id is 73701

  • +
  • gross_floor_area_source_id is populated with value 73701

  • +
  • pm_property_id_source_id is populated with 73701

  • +
  • release_date_source_id is populated with 73701

  • +
  • year_ending_source_id is populated with 73701

  • +
+
+
+

what really happens to the CanonicalBuilding table on import (and when)

+

In addition to the BuildingSnapshot table the CanonicalBuilding table is also updated +during the import process. To summarize the above 5 records were created in the +BuildingSnapshot table:

+
    +
  1. 73700 is created from the raw 2000 data

  2. +
  3. 73701 is the mapped 2000 data,

  4. +
  5. 73702 is created from the raw 2001 data

  6. +
  7. 73703 is the mapped 2001 data

  8. +
  9. 73704 is the result of merging the 2000 and 2001 data.

  10. +
+

In this process CanonicalBuilding is updated twice. First when the 2000 record is imported the +CanonicalBuilding gets populated with one new row at the end of the matching step. +I.E. when the user sees the “Load More Data” screen. At this point there is a new row that looks like

+ + + + + + + + + + + + + +

id

active

canonical_building_id

20505

TRUE

73701

+

At this point there is one new canonical building and that is the BuildingSnapshot with +id 73701. Next the user uploads the 2001 data. When the “Matching Results” screen +appears the CanonicalBuilding table has been updated. Now it looks like

+ + + + + + + + + + + + + +

id

active

canonical_building_id

20505

TRUE

73704

+

There is still only one canonical building but now it is the BuildingSnapshot record +that is the result of merging the 2000 and 2001 data: id = 73704.

+
+
+

organization

+

BuildingSnapshots belong to an Organization field that is a foreign key into the organization +model (orgs_organization in Postgres).

+

Many endpoints filter the buildings based on the organizations the requesting user +belongs to. E.G. get_buildings changes which fields are returned based on the +requesting user’s membership in the BuildingSnapshot’s organization.

+
+
+

*_source_id fields

+

Any field in the BuildingSnapshot table that is populated with data from a +submitted record will have a corresponding _source_id field. E.G +pm_property_id has pm_property_id_source_id, +address_line_1 has address_line_1_source_id, +etc…

+

These are foreign keys into the BuildingSnapshot that is the source of that +value. To extend the above table

+ + + + + + + + + + + + + + + + + + + + + + + +

field

BS0

BS1

BS2 (child)

BS2 (child) _source_id

id1

11

11

BS0

id2

12

12

BS1

+

NOTE: The BuildingSnapshot records made from the raw input file have all the +_source_id fields populated with that record’s ID. The non-canonical BuildingSnapshot +records created from the mapped data have none set. The canonical BuildingSnapshot +records that are the result of merging two records have only the _source_id fields +set where the record itself has data. E.G. in the above address_line_1 is set to +“1 fake st.” so there is a value in the canonical BuildingSnapshot’s address_line_1_source_id +field. However there is no block number so block_number_source_id is empty. This +is unlike the two raw BuildingSnapshot records who also have no block_number but +nevertheless have a block_number_source_id populated.

+
+
+

extra_data

+

The BuildingSnapshot model has many “named” fields. Fields like “address_line_1”, +“year_built”, and “pm_property_id”. However the users are allowed to submit files +with arbitrary fields. Some of those arbitrary fields can be mapped to “named” +fields. E.G. “Street Address” can usually be mapped to “Address Line 1”. +For all the fields that cannot be mapped like that there is the extra_data field.

+

extra_data is Django json field that serves as key-value storage for other +user-submitted fields. As with the other “named” fields there is a corresponding +extra_data_sources field that serves the same role as the other _source_id fields. +E.G. If a BuildingSnapshot has an extra_data field that looks like

+
+
an_unknown_field:
+

1

+
+
something_else:
+

2

+
+
+

It should have an extra_data_sources field that looks like

+
+
an_unknown_field:
+

some_BuildingSnapshot_id

+
+
something_else:
+

another_BuildingSnapshot_id

+
+
+
+
+

saving and possible data loss

+

When saving a Property file some fields that are truncated if too long. +The following are truncated to 255 characters

+
    +
  • jurisdiction_tax_lot_id

  • +
  • pm_property_id

  • +
  • custom_id_1

  • +
  • ubid

  • +
  • lot_number

  • +
  • block_number

  • +
  • district

  • +
  • owner

  • +
  • owner_email

  • +
  • owner_telephone

  • +
  • owner_address

  • +
  • owner_city_state

  • +
  • owner_postal_code

  • +
+

And the following are truncated to 255:

+
    +
  • property_name

  • +
  • address_line_1

  • +
  • address_line_2

  • +
  • city

  • +
  • postal_code

  • +
  • state_province

  • +
  • building_certification

  • +
+

No truncation happens to any of the fields stored in extra_data.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/data_quality.html b/docs/code_documentation/3.2.0/data_quality.html new file mode 100644 index 00000000..00fe1cbd --- /dev/null +++ b/docs/code_documentation/3.2.0/data_quality.html @@ -0,0 +1,126 @@ + + + + + + + Data Quality — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Data Quality

+

Data quality checks are run after the data are paired, during import of Properties/TaxLots, or on-demand by selecting rows in the inventory +page and clicking the action button. This checks whether any default or user-defined Rules are broken or satisfied by Property/TaxLot records.

+

Notably, in most cases when data quality checks are run, Labels can be applied for any broken Rules that have a Label. +To elaborate, Rules can have an attached Label. When a data quality check is run, records that break one of these “Labeled Rules” +are then given that Label. The case where this Label attachment does not happen is during import due to performance reasons.

+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/deployment.html b/docs/code_documentation/3.2.0/deployment.html new file mode 100644 index 00000000..915921da --- /dev/null +++ b/docs/code_documentation/3.2.0/deployment.html @@ -0,0 +1,212 @@ + + + + + + + Deployment Guide — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Deployment Guide

+

SEED is intended to be installed on Linux instances in the cloud (e.g., AWS), and on local hardware. SEED Platform does not officially support Windows for production deployment. If this is desired, see the Django notes.

+ +
+

Migrations

+

Migrations are handles through Django; however, various versions have customs actions for the migrations. See the migrations page for more information.

+
+
+

Monitoring

+
+

Sentry

+

Sentry can monitor your webservers for any issues. To enable sentry add the following to +your local_untracked.py files after setting up your Sentry account on sentry.io.

+

The RAVEN_CONFIG is used for the backend and the SENTRY_JS_DSN is used for the frontend. At the moment, +it is recommended to setup two sentry projects, one for backend and one for frontend.

+
import sentry_sdk
+from sentry_sdk.integrations.django import DjangoIntegration
+from sentry_sdk.integrations.celery import CeleryIntegration
+
+sentry_sdk.init(
+    dsn="https://<user>@<key>.ingest.sentry.io/<job>",
+    integrations=[
+        DjangoIntegration(),
+        CeleryIntegration(),
+    ],
+
+    # Set traces_sample_rate to 1.0 to capture 100%
+    # of transactions for performance monitoring.
+    # We recommend adjusting this value in production.
+    traces_sample_rate=1.0,
+
+    # If you wish to associate users to errors (assuming you are using
+    # django.contrib.auth) you may enable sending PII data.
+    send_default_pii=True
+)
+
+SENTRY_JS_DSN = 'https://<key>@sentry.io/<job_id>'
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/developer_resources.html b/docs/code_documentation/3.2.0/developer_resources.html new file mode 100644 index 00000000..6688e859 --- /dev/null +++ b/docs/code_documentation/3.2.0/developer_resources.html @@ -0,0 +1,611 @@ + + + + + + + Developer Resources — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Developer Resources

+ +
+

General Notes

+
+

Pre-commit

+

We use precommit commits for formatting. Set it up locally with

+
pre-commit install
+
+
+
+
+

Ruff Settings

+

Ruff is used to statically verify code syntax. To run ruff locally call:

+
tox -e precommit -- ruff
+tox -e precommit -- ruff-format
+
+
+
+
+

Python Type Hints

+

Python type hints are beginning to be added to the SEED codebase. The benefits are +eliminating some accidental typing mistakes to prevent bugs as well as a better IDE +experience.

+
+

Usage

+

SEED does not require exhaustive type annotations, but it is recommended you add them if you +create any new functions or refactor any existing code where it might be beneficial (e.g. types +that appear ambiguous or that the IDE can’t determine) and not require a ton of additional effort.

+

When applicable, we recommend you use built-in collection types +such as list, dict or tuple instead of the capitalized types +from the typing module. You can also use TypedDict and NotRequired from the typing_extensions +package to specify the types of required/optional keys of dictionaries.

+

Common gotchas:

+
    +
  • If trying to annotate a class method with the class itself, import from __future__ import annotations

  • +
  • If you’re getting warnings about runtime errors due to a type name, make sure your IDE is set up to point to an environment with python 3.9

  • +
  • If you’re wasting time trying to please the type checker, feel free to throw # type: ignore on the problematic line (or at the top of the file to ignore all issues for that file)

  • +
+
+
+

Type Checking

+

CI currently runs static type checking on the codebase using mypy. For +your own IDE, we recommend the following extensions:

+
    +
  • VSCode: Pylance (uses Microsoft’s Pyright type checking)

  • +
+

To run the same typechecking applied in CI (i.e., using mypy) you can run the following

+
tox -e mypy
+
+
+
+
+
+
+

Django Notes

+
+

Adding New Fields to Database

+

Adding new fields to SEED can be complicated since SEED has a mix of typed fields (database fields) and extra data +fields. Follow the steps below to add new fields to the SEED database:

+
    +
  1. Add the field to the PropertyState or the TaxLotState model. Adding fields to the Property or TaxLot models is more complicated and not documented yet.

  2. +
  3. Add field to list in the following locations:

  4. +
+
    +
  • models/columns.py: Column.DATABASE_COLUMNS

  • +
  • TaxLotState.coparent or PropertyState.coparent: SQL query and keep_fields

  • +
+
    +
  1. Run ./manage.py makemigrations

  2. +
  3. Add in a Python script in the new migration to add in the new column into every organizations list of columns. Note that the new_db_fields will be the same as the data in the Column.DATABASE_COLUMNS that were added.

    +
    +
    def forwards(apps, schema_editor):
    +    Column = apps.get_model("seed", "Column")
    +    Organization = apps.get_model("orgs", "Organization")
    +
    +    new_db_fields = [
    +        {
    +            'column_name': 'geocoding_confidence',
    +            'table_name': 'PropertyState',
    +            'display_name': 'Geocoding Confidence',
    +            'column_description': 'Geocoding Confidence',
    +            'data_type': 'number',
    +        }, {
    +            'column_name': 'geocoding_confidence',
    +            'table_name': 'TaxLotState',
    +            'display_name': 'Geocoding Confidence',
    +            'column_description': 'Geocoding Confidence',
    +            'data_type': 'number',
    +        }
    +    ]
    +
    +    # Go through all the organizations
    +    for org in Organization.objects.all():
    +        for new_db_field in new_db_fields:
    +            columns = Column.objects.filter(
    +                organization_id=org.id,
    +                table_name=new_db_field['table_name'],
    +                column_name=new_db_field['column_name'],
    +                is_extra_data=False,
    +            )
    +
    +            if not columns.count():
    +                new_db_field['organization_id'] = org.id
    +                Column.objects.create(**new_db_field)
    +            elif columns.count() == 1:
    +                # If the column exists, then update the display_name and data_type if empty
    +                c = columns.first()
    +                if c.display_name is None or c.display_name == '':
    +                    c.display_name = new_db_field['display_name']
    +                if c.data_type is None or c.data_type == '' or c.data_type == 'None':
    +                    c.data_type = new_db_field['data_type']
    +                        for col in columns:
    +                # If the column exists, then update the column_description if empty
    +                if c.column_description is None or c.column_description == '':
    +                    c.column_description = new_db_field['column_description']
    +                c.save()
    +            else:
    +                print("  More than one column returned")
    +
    +
    +class Migration(migrations.Migration):
    +    dependencies = [
    +        ('seed', '0090_auto_20180425_1154'),
    +    ]
    +
    +    operations = [
    +        ... existing db migrations ...,
    +        migrations.RunPython(forwards),
    +    ]
    +
    +
    +
    +
  4. +
  5. Run migrations ./manage.py migrate

  6. +
  7. Run unit tests, fix failures. Below is a list of files that need to be fixed (this is not an exhaustive list)

  8. +
+
    +
  • test_mapping_data.py:test_keys

  • +
  • test_columns.py:test_column_retrieve_schema

  • +
  • test_columns.py:test_column_retrieve_db_fields

  • +
+
    +
  1. (Optional) Update example files to include new fields

  2. +
  3. Test import workflow with mapping to new fields

  4. +
+
+
+
+

NGINX Notes

+

Toggle maintenance mode to display a maintenance page and prevent access to all site resources including API endpoints:

+
docker exec seed_web ./docker/maintenance.sh on
+docker exec seed_web ./docker/maintenance.sh off
+
+
+
+
+

AngularJS Integration Notes

+
+

Template Tags

+

Angular and Django both use {{ and }} as variable delimiters, and thus the AngularJS variable delimiters are +renamed {$ and $}.

+
window.SEED.apps.seed = angular.module('SEED', ['$interpolateProvider', ($interpolateProvider) => {
+  $interpolateProvider.startSymbol('{$');
+  $interpolateProvider.endSymbol('$}');
+}]);
+
+
+
+
+

Django CSRF Token and AJAX Requests

+

For ease of making angular $http requests, we automatically add the CSRF token to all $http requests as +recommended by http://django-angular.readthedocs.io/en/latest/integration.html#xmlhttprequest

+
window.SEED.apps.seed.run(($http, $cookies) => {
+  $http.defaults.headers.common['X-CSRFToken'] = $cookies['csrftoken'];
+});
+
+
+
+
+

Routes and Partials or Views

+

Routes in static/seed/js/seed.js (the normal angularjs app.js)

+
SEED_app.config(['stateHelperProvider', '$urlRouterProvider', '$locationProvider', (stateHelperProvider, $urlRouterProvider, $locationProvider) => {
+  stateHelperProvider
+    .state({
+      name: 'home',
+      url: '/',
+      templateUrl: static_url + 'seed/partials/home.html'
+    })
+    .state({
+      name: 'profile',
+      url: '/profile',
+      templateUrl: static_url + 'seed/partials/profile.html',
+      controller: 'profile_controller',
+      resolve: {
+        auth_payload: ['auth_service', '$q', 'user_service', function (auth_service, $q, user_service) {
+          var organization_id = user_service.get_organization().id;
+          return auth_service.is_authorized(organization_id, ['requires_superuser']);
+        }],
+        user_profile_payload: ['user_service', function (user_service) {
+          return user_service.get_user_profile();
+        }]
+      }
+    });
+}]);
+
+
+

HTML partials in static/seed/partials/

+
+
+
+

Logging

+

Information about error logging can be found here - https://docs.djangoproject.com/en/1.7/topics/logging/

+

Below is a standard set of error messages from Django.

+

A logger is configured to have a log level. This log level describes the severity of +the messages that the logger will handle. Python defines the following log levels:

+
DEBUG: Low level system information for debugging purposes
+INFO: General system information
+WARNING: Information describing a minor problem that has occurred.
+ERROR: Information describing a major problem that has occurred.
+CRITICAL: Information describing a critical problem that has occurred.
+
+
+

Each message that is written to the logger is a Log Record. The log record is stored +in the web server & Celery

+
+
+

BEDES Compliance and Managing Columns

+

Columns that do not represent hardcoded fields in the application are represented using +a Django database model defined in the seed.models module. The goal of adding new columns +to the database is to create seed.models.Column records in the database for each column to +import. Currently, the list of Columns is dynamically populated by importing data.

+

There are default mappings for ESPM are located here:

+
+
+
+
+

Resetting the Database

+

This is a brief description of how to drop and re-create the database +for the seed application.

+

The first two commands below are commands distributed with the +Postgres database, and are not part of the SEED application. The third +command below will create the required database tables for SEED and +setup initial data that the application expects (e.g. initial columns for +BEDES). The last command below (spanning multiple lines) will create a +new superuser and organization that you can use to login to the +application, and from there create any other users or organizations +that you require.

+

Below are the commands for resetting the database and creating a new +user:

+
createuser -U seed seeduser
+
+psql -d postgres -U seeduser -c 'DROP DATABASE seed;'
+psql -d postgres -U seeduser -c 'CREATE DATABASE seed;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;'
+
+./manage.py migrate
+./manage.py create_default_user \
+    --username=demo@seed-platform.org \
+    --password=password \
+    --organization=testorg
+
+
+
+
+

Restoring a Database Dump

+
psql -d postgres -U seeduser -c 'DROP DATABASE seed;'
+psql -d postgres -U seeduser -c 'CREATE DATABASE seed;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS postgis;'
+psql -d seed -U seeduser -c 'CREATE EXTENSION IF NOT EXISTS timescaledb;'
+psql -d seed -U seeduser -c 'SELECT timescaledb_pre_restore();'
+
+# restore a previous database dump (must be pg_restore 12+)
+pg_restore -d seed -U seeduser /backups/prod-backups/prod_20191203_000002.dump
+# if any errors appear during the pg_restore process check that the `installed_version` of the timescaledb extension where the database was dumped matches the extension version where it's being restored
+# `SELECT default_version, installed_version FROM pg_available_extensions WHERE name = 'timescaledb';`
+
+psql -d seed -U seeduser -c 'SELECT timescaledb_post_restore();'
+
+./manage.py migrate
+
+# if needed add a user to the database
+./manage.py create_default_user \
+    --username=demo@seed-platform.org \
+    --password=password \
+    --organization=testorg
+
+
+

If restoring a production backup to a different deployment update the site settings for password reset emails, and disable celerybeat Salesforce updates/emails:

+
./manage.py shell
+
+from django.contrib.sites.models import Site
+site = Site.objects.first()
+site.domain = 'dev1.seed-platform.org'
+site.name = 'SEED Dev1'
+site.save()
+
+from seed.models import Organization
+Organization.objects.filter(salesforce_enabled=True).update(salesforce_enabled=False)
+
+from django_celery_beat.models import PeriodicTask, PeriodicTasks
+PeriodicTask.objects.filter(enabled=True, name__startswith='salesforce_sync_org-').update(enabled=False)
+PeriodicTasks.update_changed()
+
+
+
+
+

Migrating the Database

+

Migrations are handles through Django; however, various versions have customs actions for the migrations. See the migrations page for more information based on the version of SEED.

+
+
+

Testing

+

JS tests can be run with Jasmine at the url /angular_js_tests/.

+

Python unit tests are run with

+
python manage.py test --settings=config.settings.test
+
+
+
+
Note on geocode-related testing:

Most of these tests use VCR.py and cassettes to capture and reuse recordings of HTTP requests and responses. Given that, unless you want to make changes and/or refresh the cassettes/recordings, there isn’t anything needed to run the geocode tests.

+

In the case that the geocoding logic/code is changed or you’d like to the verify the MapQuest API is still working as expected, you’ll need to run the tests with a small change. Namely, you’ll want to provide the tests with an API key via an environment variable called “TESTING_MAPQUEST_API_KEY” or within your local_untracked.py file with that same variable name.

+

In order to refresh the actual cassettes, you’ll just need to delete or move the old ones which can be found at “.seed/tests/data/vcr_cassettes”. The API key should be hidden within the cassettes, so these new cassettes can and should be pushed to GitHub.

+
+
+

Run coverage using

+
coverage run manage.py test --settings=config.settings.test
+coverage report --fail-under=83
+
+
+

Python compliance uses Ruff

+
tox -e precommit -- ruff
+tox -e precommit -- ruff-format
+
+
+

JavaScript compliance uses ESLint, SCSS compliance uses StyleLint, and HTML compliance uses Prettier

+
npm run lint
+npm run lint:fix
+
+
+
+
+

Building Documentation

+

Older versions of the source code documentation are (still) on readthedocs; however, newer versions are built and pushed to the seed-website repository manually. To build the documentation follow the script below:

+
cd docs
+rm -rf htmlout
+sphinx-build -b html source htmlout
+
+
+

For releasing, copy the htmlout directory into the seed-platform’s website repository under docs/code_documentation/<new_version>. Make sure to add the new documentation to the table in the docs/developer_resources.md.

+
+
+

Contribution Instructions / Best Practices

+

If this is the first time contributing and you are outside of the DOE National Lab system, then you will need to review and fill out the contribution agreement which is found in SEED’s Contribution Agreement in the GitHub repository

+

The desired workflow for development and submitting changes is the following:

+
    +
  1. Fork the repository on GitHub if you do not have access to the repository, otherwise, work within the https://github.com/seed-platform/seed repository.

  2. +
  3. Ensure there is a ticket/issue created for the work you are doing. Verify that the ticket is assigned to you and that it is part of the latest project board on the GitHub site (https://github.com/orgs/SEED-platform/projects).

  4. +
  5. Move the ticket/issue to ‘In Progress’ in the GitHub project tracker when you begin work

  6. +
  7. Create a branch off of develop (unless it is a hotfix, then branch of the appropriate tag). The recommended naming convention is <issue_id>-short-descriptive-name.

  8. +
  9. Make changes and write a test for the code added.

  10. +
  11. Make sure tests pass locally. Most branches created and pushed to GitHub will be tested automatically.

  12. +
  13. Upon completion of the work, create a pull request (PR) against the develop branch (or hotfix branch if applicable). In the PR description fill out the requested information and include the issue number (e.g., #1234).

  14. +
  15. +
    Assign one label to the PR (not the ticket/issue) in order to auto-populate change logs (e.g., Bug, Feature, Maintenance, Performance, DoNotPublish) This is required and CI will fail if not present.
      +
    • Bug (these will appear as “Bug Fixes” in the change log)

    • +
    • Feature (features will appear as “New Features” item in the change log)

    • +
    • Enhancement (these will appear as “Improvements” in the change log)

    • +
    • Maintenance (these will appear under “Maintenance” in the change log)

    • +
    • Performance (these will appear under “Maintenance” in the change log)

    • +
    • Documentation (these will appear under “Maintenance” in the change log)

    • +
    • Do not publish (these will no appear in the change log)

    • +
    +
    +
    +
  16. +
  17. Ensure all tests pass.

  18. +
  19. Assign a reviewer to the PR.

  20. +
  21. If the reviewer requests changes, then addresses changes and re-assign the reviewer as needed.

  22. +
  23. Once approved, merge the PR!

  24. +
  25. Move the related ticket(s)/issue(s) to the ‘Ready to Deploy’ column in the GitHub project tracker.

  26. +
+
+
+

Release Instructions

+

To make a release do the following:

+
    +
  1. Create a branch from develop to prepare the updates (e.g., 2.21.0-release-prep).

  2. +
  3. Update the root package.json file with the release version number, and then run npm install. Always use MAJOR.MINOR.RELEASE.

  4. +
  5. Update the docs/sources/migrations.rst file with any required actions.

  6. +
  7. Commit the changes and push the release prep branch to GitHub, then go to the Releases page to draft a new release which will generate the changelog.

  8. +
  9. Copy the GitHub changelog results into CHANGELOG.md. Cleanup the formatting and items as needed (make sure the spelling is correct, starts with a capital letter, if any PRs were missing the Do not publish label, etc.) and push the changelog update.

  10. +
  11. Make sure that any new UI needing localization has been tagged for translation, and that any new translation keys exist in the lokalise.com project. (see translation documentation).

  12. +
  13. Create PR for release preparation and merge after tests/reviews pass.

  14. +
  15. Create a new Release using the develop branch and new release number as the tag (https://github.com/SEED-platform/seed/releases). Include list of changes since previous release (e.g., the additions to CHANGELOG.md).

  16. +
  17. Locally, merge the develop branch into the main branch and push.

  18. +
  19. Verify that the Docker versions are built and pushed to Docker Hub (https://hub.docker.com/r/seedplatform/seed/tags/).

  20. +
  21. Publish the new documentation in the seed-platform website repository (see instructions above under Building Documentation).

  22. +
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/docker.html b/docs/code_documentation/3.2.0/docker.html new file mode 100644 index 00000000..8d4982d4 --- /dev/null +++ b/docs/code_documentation/3.2.0/docker.html @@ -0,0 +1,249 @@ + + + + + + + Docker Deployment on AWS — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Docker Deployment on AWS

+

Amazon Web Services (AWS) provides the preferred hosting for the SEED Platform.

+

seed is a Django Project and Django’s documentation is an excellent place for general +understanding of this project’s layout.

+
+

Installation

+

Ubuntu server 18.04 or newer with a m5ad.xlarge (if using in Production instance)

+
    +
  • After launching the instance, run the following commands to install docker.

  • +
+
# Install any upgrades
+sudo apt-get update
+sudo apt-get upgrade -y
+
+# Remove any old docker engines
+sudo apt-get remove docker docker-engine docker.io containerd runc
+
+# Install docker community edition
+sudo apt-get update
+sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
+curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
+sudo add-apt-repository \
+    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
+    $(lsb_release -cs) \
+    stable"
+
+sudo apt-get update
+sudo apt-get install -y docker-ce docker-ce-cli containerd.io
+# Add your user to the docker group
+sudo groupadd docker
+sudo usermod -aG docker $USER
+newgrp docker
+
+
+
+

Note

+

It is okay if the first command fails

+
+
    +
  • Verify that the DNS is working correctly. Run the following and verify the response lists IPs (v6 most likely)

  • +
+
# verify that the dns resolves
+docker run --rm seedplatform/seed getent hosts seed-platform.org
+# or
+docker run --rm tutum/dnsutils nslookup email.us-west-2.amazonaws.com
+
+
+
    +
  • Install Docker compose

  • +
+
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
+sudo chmod +x /usr/local/bin/docker-compose
+
+
+
    +
  • Checkout SEED (or install from the releases).

  • +
+
git clone
+
+
+
    +
  • Add in the Server setting into profile.d. For example add the content below (appropriately filled out) into /etc/profile.d/seed.sh

  • +
+
export POSTGRES_USER=seed
+export POSTGRES_DB=seed
+export POSTGRES_PASSWORD=GDEus3fasd1askj89QkAldjfX
+export POSTGRES_PORT=5432
+export SECRET_KEY="96=7jg%_&1-z9c9qwwu2@w$hb3r322yf3lz@*ekw-1@ly-%+^"
+
+# The admin user is only valid only until the database is restored
+export SEED_ADMIN_USER=user@seed-platform.org
+export SEED_ADMIN_PASSWORD="7FeBWal38*&k3jlfa92lakj8ih4"
+export SEED_ADMIN_ORG=default
+
+# For SES
+export AWS_ACCESS_KEY_ID=<AWS_ACCESS_KEY>
+export AWS_SECRET_ACCESS_KEY=<AWS_SECRET_KEY>
+export AWS_SES_REGION_NAME=us-west-2
+export AWS_SES_REGION_ENDPOINT=email.us-west-2.amazonaws.com
+export SERVER_EMAIL=user@seed-platform.org
+
+# For custom cookie validity duration
+export COOKIE_EXPIRATION=1209600
+
+
+
    +
  • Before launching the first time, make sure the persistent volumes and the backup directory exist.

  • +
+
docker volume create --name=seed_pgdata
+docker volume create --name=seed_media
+
+mkdir -p $HOME/seed-backups
+
+
+
+

Note

+

Make sure to have the seed-backups in your path, otherwise the db-postgres container will not launch.

+
+
    +
  • Launch the project

  • +
+
cd <checkout dir>
+./deploy.sh
+
+
+
+
+

Deploying with Docker

+

The preferred way to deploy with Docker is using docker swarm and docker stack. +Look at the deploy.sh script for implementation details.

+

The short version is to simply run the command below. Note that the passing of the docker-compose.yml filename is not required if using docker-compose.local.yml.

+

`bash +./deploy.sh docker-compose.local.yml +`

+

If deploying using a custom docker-compose yml file, then simple replace the name in the command above.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/faq.html b/docs/code_documentation/3.2.0/faq.html new file mode 100644 index 00000000..fe350911 --- /dev/null +++ b/docs/code_documentation/3.2.0/faq.html @@ -0,0 +1,190 @@ + + + + + + + Frequently Asked Questions — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Frequently Asked Questions

+

Here are some frequently asked questions and/or issues.

+ +
+

Questions

+
+

What is the SEED Platform?

+

The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity.

+

The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL.

+

The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions.

+

Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy.

+
+
+
+

Issues

+
+

Why is the domain set to example.com?

+

If you see example.com in the emails that are sent from your hosted version of SEED then you will +need to update your django sites object in the database.

+
$ ./manage.py shell
+
+from django.contrib.sites.models import Site
+one = Site.objects.all()[0]
+one.domain = 'newdomain.org'
+one.name = 'SEED'
+one.save()
+
+
+
+
+

Why aren’t the static assets being served correctly?

+

Make sure that your local_untracked.py file does not have STATICFILES_STORAGE set to anything. If so, +then comment out that section and redeploy/recollect/compress your static assets.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/genindex.html b/docs/code_documentation/3.2.0/genindex.html new file mode 100644 index 00000000..62c4ca40 --- /dev/null +++ b/docs/code_documentation/3.2.0/genindex.html @@ -0,0 +1,2916 @@ + + + + + + Index — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | J + | K + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | U + | V + | W + | X + | Y + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

J

+ + + +
+ +

K

+ + + +
+ +

L

+ + + +
+ +

M

+ + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

Q

+ + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + + +
+ +

X

+ + +
+ +

Y

+ + + +
+ + + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/getting_started.html b/docs/code_documentation/3.2.0/getting_started.html new file mode 100644 index 00000000..49bdbb13 --- /dev/null +++ b/docs/code_documentation/3.2.0/getting_started.html @@ -0,0 +1,160 @@ + + + + + + + Getting Started — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/help.html b/docs/code_documentation/3.2.0/help.html new file mode 100644 index 00000000..c5288258 --- /dev/null +++ b/docs/code_documentation/3.2.0/help.html @@ -0,0 +1,141 @@ + + + + + + + Help — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Help

+
+

For SEED Platform Users

+

Please visit our website for information, tutorials, and documentation to help you learn how to use SEED.

+

https://seed-platform.org

+

The SEED Users Forum is where you can review user announcements, workflow questions, and join to connect with other users.

+

https://lists.buildingenergytools.org/g/SEEDusers/topics

+

For general inquiries or help on a specific problem, please fill out a request on the building data tools website help desk and select SEED as the relevant tool:

+

https://buildingdata.energy.gov/#/help-desk

+
+
+

For SEED Platform Developers

+

The open-source code is available on the GitHub organization SEED-Platform and contains various repositories for the different components of the platform such as the main SEED application, a Python SEED client to communicate to SEED’s API and various example datasets.

+

https://github.com/SEED-platform

+

The SEED Developers Forum contains various topics and joining enables you to connect with other developers. It is recommended to join this forum to submit developer questions, features requests, and report issues as needed. Also, submitting issues on GitHub is encouraged.

+

https://lists.buildingenergytools.org/g/SEEDdevelopers/topics

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/index.html b/docs/code_documentation/3.2.0/index.html new file mode 100644 index 00000000..c607c41a --- /dev/null +++ b/docs/code_documentation/3.2.0/index.html @@ -0,0 +1,244 @@ + + + + + + + Standard Energy Efficiency Data (SEED) Platform — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Standard Energy Efficiency Data (SEED) Platform

+

The Standard Energy Efficiency Data (SEED) Platform™ is a web-based application +that helps organizations easily manage data on the energy performance of large +groups of buildings. Users can combine data from multiple sources, clean and +validate it, and share the information with others. The software application +provides an easy, flexible, and cost-effective method to improve the quality +and availability of data to help demonstrate the economic and environmental +benefits of energy efficiency, to implement programs, and to target investment +activity.

+

The SEED application is written in Python/Django, with AngularJS, Bootstrap, +and other JavaScript libraries used for the front-end. The back-end database +is required to be PostgreSQL.

+

The SEED web application provides both a browser-based interface for users to +upload and manage their building data, as well as a full set of APIs that app +developers can use to access these same data management functions.

+

Work on SEED Platform is managed by the National Renewable Energy Laboratory, +with funding from the U.S. Department of Energy.

+
+ +
+
+
+

Indices and tables

+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/kubernetes_deployment.html b/docs/code_documentation/3.2.0/kubernetes_deployment.html new file mode 100644 index 00000000..f85ec164 --- /dev/null +++ b/docs/code_documentation/3.2.0/kubernetes_deployment.html @@ -0,0 +1,373 @@ + + + + + + + Kubernetes Deployment Guide with Helm — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Kubernetes Deployment Guide with Helm

+

Kubernetes is a robust container orchestration system for easy application deployment and management. Helm takes that a step further with by packaging up required helm “charts” into one deployment command.

+
+

Setup

+
+

Cluster

+

In order to deploy the SEED platform on a Kubernetes you will need “cluster” which will be configured by your cloud service of choice. Each installation will be slightly different depending on the service. +Below are links to quick-start guides for provisioning a cluster and connecting. These instructions are specifically for AWS, but after the Kubernetes cluster is launched, the helm commands can be used in +the same way.

+
    +
  • Amazon Web Services (AWS)

  • +
  • Google Cloud Platform (GCP)

  • +
  • Azure (AKS)

  • +
+
+

AWS CLI Configuration

+

Download and configure the AWS CLI with instructions: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html

+
aws configure
+AWS Access Key ID [None]: <insert key> (from account)
+AWS Secret Access Key [None]: <insert secret key> (from account)
+Default region name [None]: us-east-1
+Default output format [None]: json
+
+
+
+
+
+

Kubectl

+

Download and install Kubectl:

+
    +
  • Windows

  • +
  • +
    Mac (with Homebrew) brew install kubectl

    ` +brew install kubectl +`

    +
    +
    +
  • +
+

Kubectl is the main function in which you will be interfacing with your deployed application on your cluster. This CLI is what connects you to your cluster that you have just provisioned. +If your cloud service did not have you configure kubectl in your cluster setup, you can download it here. Once kubectl is installed and configured to your cluster +you can run some simple commands to ensure its working properly:

+
#View the cluster
+kubectl cluster-info
+
+#View pods, services and replicasets (will be empty until deploying an app)
+kubectl get all
+
+
+

All of the common kubectl commands can be found in these docs

+
+

Note

+

For those unfamiliar with CLIs, there are a number of GUI applications that are able to deploy on your stack with ease. One of which is Kubernetes native application called Dashboard UI or a third-party application called Octant brew install octant.

+
+
+
+

Helm

+

Helm organizes all of your Kubernetes deployment, service, and volume yml files into “charts” that can be deployed, managed, and published with simple commands. +To install Helm:

+ +
+
+

EKS Control (AWS Specific)

+

EKSCtl is a command line tool to manage Elastic Kubernetes clusters on AWS. If not using AWS, then disregard this section.

+ +

To launch a cluster on using EKSCts, run the following command in the terminal (assuming adequate permissions for the user). Also make sure to replace items in the <> brackets.

+
eksctl create cluster \
+--name <cluster-name> \
+--version 1.21 \
+--region us-east-1 \
+--node-type m5.large \
+--nodes 1 \
+--nodes-min 1 \
+--nodes-max 1 \
+--managed \
+--tags environment=<env-type, e.g., dev, prod>
+
+
+
+
+

Charts

+

SEED stores its charts in the charts directory of the Github Repo. There are two main charts that are deployed when starting SEED on Kubernetes.

+
    +
  • persistentvolumes - these are the volumes to store SEED media data and SEED Postgres data

  • +
  • seed - this stores all of the other deployment and service files for the application

  • +
+

Unlike persistentvolumes, the seed charts must be modified with user environment variables that will be forwarded to the docker container for deployment. +Before deployment, the user MUST set these variables to their desired values.

+

This chart contains the deployment specification for the SEED web container. Replace all the values in <>.

+
# Environment variables for the web container
+- env:
+    # AWS Email service variables to send emails to new users - can be removed if not using this functionality.
+    - name: AWS_ACCESS_KEY_ID
+      value: <access_key_id>
+    - name: AWS_SECRET_ACCESS_KEY
+      value: <secret_access_key>
+    - name: AWS_SES_REGION_NAME
+      value: us-west-2
+    - name: AWS_SES_REGION_ENDPOINT
+      value: email.us-west-2.amazonaws.com
+    - name: SERVER_EMAIL
+      value: info@seed-platform.org
+    # Django Variables
+    - name: DJANGO_SETTINGS_MODULE
+      value: config.settings.docker
+    - name: SECRET_KEY
+      value: <replace-secret-key>
+    - name: SEED_ADMIN_ORG
+      value: default
+    - name: SEED_ADMIN_PASSWORD
+      value: <super-secret-password>
+    - name: SEED_ADMIN_USER
+      value: <user@seed-platform.org>
+    - name: COOKIE_EXPIRATION
+      value: 1209600
+    # Postgres variables
+    - name: POSTGRES_DB
+      value: seed
+    - name: POSTGRES_PASSWORD
+      value: <super-secret-password> # must match db-postgres-deployment.yaml and web-celery-deployment.yaml
+    - name: POSTGRES_PORT
+      value: "5432"
+    - name: POSTGRES_USER
+      value: seeduser
+    # Bsyncr analysis variables
+    - name: BSYNCR_SERVER_PORT
+      value: "5000"
+    - name: BSYNCR_SERVER_HOST
+      value: bsyncr
+    # Sentry monitoring - remove if not applicable
+    - name: SENTRY_JS_DSN
+      value: <enter-dsn>
+    - name: SENTRY_RAVEN_DSN
+      value: <enter-dsn>
+    # Google self registration security - remove if not applicable
+    - name: GOOGLE_RECAPTCHA_SITE_KEY
+      value: <reCAPTCHA-site-key>
+    - name: GOOGLE_RECAPTCHA_SECRET_KEY
+      value: <reCAPTCHA-key>
+    image: seedplatform/seed:<insert deployment image version>
+    #versions can be found here https://github.com/SEED-platform/seed/releases/tag/v2.9.3
+
+
+

This chart contains the deployment specification for the Celery container to connect to Postgres. Replace the Postgres password to match web-deployment.

+
- name: POSTGRES_PASSWORD
+  value: <super-secret-password>  # must match db-postgres-deployment.yaml and web-celery-deployment.yaml
+
+
+

This chart contains the deployment specification for the bsyncr analysis server. Request a NOAA token from this website.

+
- name: NOAA_TOKEN
+  value: <token>
+
+
+
+
+
+

Deployment

+

Once you are connected to your cluster and have your settings configured with the environment variables of you choice in the charts, you are ready to deploy the app. +First, make sure that the correct context is selected which is needed if there is more than one cluster:

+
kubectl config get-contexts
+kubectl config use-context <context-name>
+
+
+

Deploy the site using the helm commands in the root of the charts directory.

+
    +
  • helm install --generate-name persistentvolumes

  • +
  • helm install --generate-name seed

  • +
+

You will be able to see SEED coming online with statuses like container creating, and running with:

+
    +
  • kubectl get all

  • +
+

Once all of the pods are running you will be able to hit the external ingress through the URL listed in the web service information. It should look something like

+
service/web           LoadBalancer   10.100.154.227   <my-unique-url>   80:32291/TCP
+
+
+
+
+

Managing Existing Clusters

+
+

Upgrade/Redeploy the Helm Stack

+

To upgrade or dedeploy a helm chart, first find the helm release that you want to upgrade, then run the upgrade with the selected chart.

+
helm list
+helm upgrade <cluster-name> ./seed
+
+
+
+
+

Managing the Kubernetes Cluster (AWS Specific)

+

Enable kubectl to talk to one of the created clusters by running the following command in the terminal after configuring the AWS credentials and cli.

+
aws eks --region <aws-region> update-kubeconfig --name <cluster-name>
+
+
+
+
+

Logging In

+

After a successful deployment in order to login you will need to create yourself as a user in the web container. To do this, we will exec into the container and run some Django commands. +* View all deployments and services, kubectl get all +* kubectl get pods +* kubectl exec -it <pod-id> -- bash

+

Now that we are in the container, we can make a user. +.. code-block:: bash

+
+

./manage.py create_default_user –username=admin@my.org –organization=seedorg –password=badpass

+
+

You can now use these credentials to log in to the SEED website.

+
+
+

Update web and web-celery

+

The command below will restart the pods and re-pull the docker images.

+
kubectl rollout restart deployment web && kubectl rollout restart deployment web-celery
+
+
+
+
+
+

Other Resources

+

Common kubectl actions can be found on the kubernetes website

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/license.html b/docs/code_documentation/3.2.0/license.html new file mode 100644 index 00000000..4043d4c6 --- /dev/null +++ b/docs/code_documentation/3.2.0/license.html @@ -0,0 +1,187 @@ + + + + + + + License — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

License

+

SEED Platform™, Copyright (c) 2017, 2024 Alliance for Sustainable Energy, LLC, and other contributors. +All rights reserved.

+

Redistribution and use in source and binary forms, with or without modification, are permitted +provided that the following conditions are met:

+

(1) Redistributions of source code must retain the above copyright notice, this list of +conditions and the following disclaimer.

+

(2) Redistributions in binary form must reproduce the above copyright notice, this list of +conditions and the following disclaimer in the documentation and/or other materials provided +with the distribution.

+

(3) Neither the name of the copyright holder nor the names of its contributors may be used +to endorse or promote products derived from this software without specific prior written +permission.

+

(4) Other than as required in clauses (1) and (2), distributions in any form of modifications +or other derivative works may not use the “SEED Platform” trademark, “Standard Energy +Efficiency Data Platform”, “Standard Energy Efficiency Data”, “SEED”, or any other confusingly +similar designation without specific prior written permission from the U.S. Department of Energy.

+

(5) The name of the copyright holder(s), any contributors, the United States Government, the +United States Department of Energy, or any of their employees may not be used to endorse or +promote products derived from this software without specific prior written permission from the +respective party.

+

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) AND ANY CONTRIBUTORS “AS IS” AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT HOLDER(S), ANY CONTRIBUTORS, THE UNITED STATES GOVERNMENT, OR THE UNITED STATES +DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +THE POSSIBILITY OF SUCH DAMAGE.

+

+

This program also includes the following licenses:

+

Copyright (c) 2014 - 2017 The Regents of the University of California, through +Lawrence Berkeley National Laboratory (subject to receipt of any required approvals +from the U.S. Department of Energy) and contributors. All rights reserved.

+
    +
  1. Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met:

    +
    +

    (1) Redistributions of source code must retain the copyright notice, this +list of conditions and the following disclaimer.

    +

    (2) Redistributions in binary form must reproduce the copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution.

    +

    (3) Neither the name of the University of California, Lawrence Berkeley +National Laboratory, U.S. Dept. of Energy nor the names of its +contributors may be used to endorse or promote products derived from this +software without specific prior written permission.

    +

    (4) Neither the names Standard Energy Efficiency Data Platform, Standard +Energy Efficiency Data, SEED Platform, SEED, derivatives thereof nor +designations containing these names, may be used to endorse or promote +products derived from this software without specific prior written +permission from the U.S. Dept. of Energy.

    +
    +
  2. +
  3. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  4. +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/linux.html b/docs/code_documentation/3.2.0/linux.html new file mode 100644 index 00000000..e35dd306 --- /dev/null +++ b/docs/code_documentation/3.2.0/linux.html @@ -0,0 +1,400 @@ + + + + + + + General Linux Setup — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

General Linux Setup

+

While Amazon Web Services (AWS) provides the preferred hosting for SEED, +running on a bare-bones Linux server follows a similar setup, replacing the +AWS services with their Linux package counterparts, namely: PostgreSQL and +Redis.

+

SEED is a Django project and Django’s documentation +is an excellent place to general understanding of this project’s layout.

+
+

Prerequisites

+

Ubuntu server/desktop 16.04 or newer (18.04 recommended)

+

Install the following base packages to run SEED:

+
sudo add-apt-repository ppa:timescale/timescaledb-ppa
+sudo apt update
+sudo apt upgrade
+sudo apt install libpq-dev python3-dev python3-pip libatlas-base-dev \
+gfortran build-essential nodejs npm libxml2-dev libxslt1-dev git \
+libssl-dev libffi-dev curl uwsgi-core uwsgi-plugin-python mercurial
+sudo apt install gdal-bin postgis
+sudo apt install redis-server
+sudo apt install timescaledb-postgresql-10 postgresql-contrib
+
+
+
+

Note

+

postgresql >=9.3 is required to support JSON Type

+
+
+
+

Configure PostgreSQL

+

Replace ‘seeddb’, ‘seeduser’ with desired db/user. By +default use password seedpass when prompted

+
$ sudo timescaledb-tune
+$ sudo service postgresql restart
+$ sudo su - postgres
+$ createuser -P "seeduser"
+$ createdb "seeddb" --owner="seeduser"
+$ psql
+postgres=# GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO "seeduser";
+postgres=# ALTER USER "seeduser" CREATEDB CREATEROLE SUPERUSER;
+postgres=# \q
+$ exit
+
+
+
+
+

Python Dependencies

+

clone the seed repository from github

+
$ git clone git@github.com:SEED-platform/seed.git
+
+
+

enter the repo and install the python dependencies from requirements

+
$ cd seed
+$ pip3 install -r requirements/local.txt
+
+
+
+
+

JavaScript Dependencies

+
$ npm install
+
+
+
+
+

Django Database Configuration

+

Copy the local_untracked.py.dist file in the config/settings directory to +config/settings/local_untracked.py, and add a DATABASES configuration with your database username, password, +host, and port. Your database configuration can point to an AWS RDS instance or a PostgreSQL 9.4 database instance +you have manually installed within your infrastructure.

+
# Database
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.contrib.gis.db.backends.postgis',
+        'NAME': 'seeddb',
+        'USER': 'seeduser',
+        'PASSWORD': '<PASSWORD>',
+        'HOST': 'localhost',
+        'PORT': '5432',
+    }
+}
+
+
+
+

Note

+

Other databases could be used such as MySQL, but are not supported +due to the postgres-specific JSON Type

+
+

In in the above database configuration, seed is the database name, this is arbitrary and any valid name can be +used as long as the database exists. Enter the database name, user, password you set above.

+

The database settings can be tested using the Django management command, python3 manage.py dbshell to connect to the +configured database.

+

create the database tables and migrations:

+
$ python3 manage.py migrate
+
+
+
+
+

Cache and Message Broker

+

The SEED project relies on redis for both cache and message brokering, and +is available as an AWS ElastiCache service or with the redis-server +Linux package. (sudo apt install redis-server)

+

local_untracked.py should be updated with the CACHES and CELERY_BROKER_URL +settings.

+
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+
+
+
+

Creating the initial user

+

create a superuser to access the system

+
$ python3 manage.py create_default_user --username=admin@my.org --organization=lbnl --password=badpass
+
+
+
+

Note

+

Of course, you need to save this user/password somewhere, since this is what +you will use to login to the SEED website.

+

Every user must be tied to an organization, visit /app/#/profile/admin +as the superuser to create parent organizations and add users to them.

+
+
+
+

Running celery the background task worker

+

Celery is used for background tasks (saving data, matching, data quality checks, etc.) +and must be connected to the message broker queue. From the project directory, celery +can be started:

+
DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 2 --max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler
+
+
+
+
+

Running the development web server

+

The Django dev server (not for production use) can be a quick and easy way to +get an instance up and running. The dev server runs by default on port 8000 +and can be run on any port. See Django’s runserver documentation for more +options.

+
$ python3 manage.py runserver --settings=config.settings.dev
+
+
+
+
+

Running a production web server

+

Our recommended web server is uwsgi sitting behind nginx. The python package uwsgi is needed for this, and +should install to /usr/local/bin/uwsgi We recommend using dj-static to load static files.

+
+

Note

+

The use of the dev settings file is production ready, and should be +used for non-AWS installs with DEBUG set to False for production use.

+
+
$ pip3 install uwsgi dj-static
+
+
+

Generate static files:

+
$ python3 manage.py collectstatic --settings=config.settings.prod -i package.json -i package-lock.json -i node_modules/openlayers-ext/index.html
+
+
+

Update config/settings/local_untracked.py:

+
DEBUG = False
+# static files
+STATIC_ROOT = 'collected_static'
+STATIC_URL = '/static/'
+
+
+

Start the web server (this also starts celery):

+
$ ./bin/start-seed
+
+
+
+

Warning

+

Note that uwsgi has port set to 80. In a production setting, a dedicated web server such as nginx would be +receiving requests on port 80 and passing requests to uwsgi running on a different port, e.g 8000.

+
+
+
+

Environment Variables

+

The following environment variables can be set within the ~/.bashrc file to +override default Django settings.

+
export SENTRY_DSN=https://xyz@app.getsentry.com/123
+export DEBUG=False
+export ONLY_HTTPS=True
+
+
+
+
+

Mail Services

+
+

AWS SES Service

+

In the AWS setup, we can use SES to provide an email service for Django. The service is +configured in the config/settings/local_untracked.py:

+
EMAIL_BACKEND = 'django_ses.SESBackend'
+
+
+

In general, the following steps are needed to configure SES:

+
    +
  1. Access Amazon SES Console - Quickstart

  2. +
  3. Login to Amazon SES Console. Verify which region we are using (e.g., us-east-1)

  4. +
  5. Decide on email address that will be sending the emails and add them to the SES Verified Emails.

  6. +
  7. Test that SES works as expected (while in the SES sandbox). Note that you will need to add the sender and recipient emails to the verified emails while in the sandbox.

  8. +
  9. Update the local_untracked.py file or set the environment variables for the docker file.

  10. +
  11. Once ready, move the SES instance out of the sandbox. Following instructions here

  12. +
  13. (Optional) Set up Amazon Simple Notification Service (Amazon SNS) to notify you of bounced emails and other issues.

  14. +
  15. (Optional) Use the AWS Management Console to set up Easy DKIM, which is a way to authenticate your emails. Amazon SES console will have the values for SPF and DKIM that you need to put into your DNS.

  16. +
+
+
+

SMTP service

+

Many options for setting up your own SMTP service/server or using other SMTP +third party services are available and compatible including gmail. SMTP is not configured for working within Docker at the moment.

+
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
+
+
+
+
+
+

local_untracked.py

+
# PostgreSQL DB config
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.postgresql_psycopg2',
+        'NAME': 'seed',
+        'USER': 'your-username',
+        'PASSWORD': 'your-password',
+        'HOST': 'your-host',
+        'PORT': 'your-port',
+    }
+}
+
+# config for local storage backend
+DOMAIN_URLCONFS = {'default': 'config.urls'}
+
+CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+# SMTP config
+EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
+
+# static files
+STATIC_ROOT = 'collected_static'
+STATIC_URL = '/static/'
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/mapping.html b/docs/code_documentation/3.2.0/mapping.html new file mode 100644 index 00000000..da9af900 --- /dev/null +++ b/docs/code_documentation/3.2.0/mapping.html @@ -0,0 +1,166 @@ + + + + + + + Mapping — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Mapping

+

This document describes the set of calls that occur from the web client or API +down to the back-end for the process of mapping data into SEED.

+

An overview of the process is:

+
    +
  1. Import - A file is uploaded to the server

  2. +
  3. Save - The file is batched saved into the database as JSON data

  4. +
  5. Mapping - Mapping occurs on that file

  6. +
  7. Matching / Merging

  8. +
  9. Pairing

  10. +
+
+

Import

+

From the web UI, the import process invokes seed.views.main.save_raw_data to save the data. When the data is +done uploading, we need to know whether it is a Portfolio Manager file, so we can add metadata to the record in the +database. The end of the upload happens in seed.data_importer.views.DataImportBackend.upload_complete. At this +point, the request object has additional attributes for Portfolio Manager files. These are saved in the model +seed.data_importer.models.ImportFile.

+
+
+

Mapping

+

Once files are uploaded, file header columns need to be mapped to SEED columns. Mappings can be specified/decided manually for any particular file import, +or mapping profiles can be created and subsequently applied to any file imports.

+

When a column mapping profile is applied to an import file, file header columns defined in the profile must match exactly (spaces, lowercase, uppercase, etc.) +in order for the corresponding SEED column information to be used/mapped.

+
+
+

Matching

+
+

Todo

+

document

+
+
+
+

Pairing

+
+

Todo

+

document

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/matching.html b/docs/code_documentation/3.2.0/matching.html new file mode 100644 index 00000000..b7b04b6c --- /dev/null +++ b/docs/code_documentation/3.2.0/matching.html @@ -0,0 +1,243 @@ + + + + + + + Matching — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Matching

+
+

What is it?

+

Within SEED, matching refers to a possible relationship between at least 2 properties or at least 2 tax lots. +Two properties match if they have the same values for some specified field(s). +These specified fields are referred to as matching criteria, and each SEED organization has its +own set of matching criteria which is customizable by users.

+
+
+

Why does it exist?

+

At a high level, matching is used to identify if two or more property records are actually different +representations of the same property (or tax lots representing one tax lot). For example, within the same cycle, +two matching records, so one persists while the other is used and subsequently discarded to update the persisting record +(say if the building owner’s phone number changed). Or across different cycles, it’s possible that the +two records capture the same property at different times/cycles - this relationship is referred to as a link.

+
+
+

How and when is it used?

+
+

In-Cycle Merging

+

(This is different from manual merging.)

+

For records within the same cycle, there really shouldn’t be more than one +representation of the same property (or tax lot). As much as possible, the program +is set up to prevent this from happening by automatically merging matched +records together whenever they might occur in the same cycle.

+

Specifically, a merge of matches might need to occur after any of the following events:

+
    +
  1. The record has been manually edited.

  2. +
  3. The record was just created as a result of a manual merge (via the ‘Actions’ on the Properties or Tax Lots page).

  4. +
  5. The record has just been imported.

  6. +
+

The actual execution of merges includes a few additional, unrelated steps but, +in the scope of merging, the following occurs.

+

The record in the scenarios listed above is the “target” record. Any and all +matches found, excluding the “target”, are merged together first. If there are +overlapping values, priority is given to more recently updated records.

+

Once these matches (excluding the target) are merged together, the final step is +to merge the “target” record. In all but one case, choosing between overlapping +values gives priority to the “target”. That one case is when a record has just been +imported. Here, overlapping values follow merge protection rules set by +the user for an organization in this final step.

+
+
+

Linking (Across Cycles)

+

For records in different cycles, matches between these are considered links. +Links are used to connect snapshots of the same record year-over-year (at different time periods). +This allows for the analysis of how the record has changed over time.

+

In the case of properties, these links are used to associate meters to properties. +This means that adding meters to a property in one cycle will make those meters +accessible to that same property’s instance in all other cycles.

+

This association can be viewed in aggregate; all of the records within some selected cycles are +grouped and displayed with their links. Alternatively, this association can be viewed for particular linked +group; the linked records of this group are displayed by themselves.

+
+
+

Putting them Together, Match-Merge-Linking

+

As mentioned earlier, there is a rule or assumption that at most one representation of +the same record can exist in any given cycle.

+

This avoids unresolvable situations that would prevent year-over-year analysis. +In the most simple case, a record in Cycle A matches two records in Cycle B. +SEED wouldn’t know which of the two records in Cycle B should be +the “snapshot” for this time period.

+

For this reason, in-cycle match merging always occurs before cross-cycle match linking. +So when searches for links do happen, ambiguous cases have already been resolved.

+

For an individual record, these are the following cases in which a +match-merge-link is automatically run: +1. Explicit triggering (from the Property/TaxLot Detail page) +2. After editing (in the Property/TaxLot Detail page) +3. After manual merging (in the Properties/Tax Lots list page). Explicitly +specified merges happen as chosen by the user. Then, if the resulting record has +matches, merges and/or linking happens. +4. When importing a record. If the incoming record has matches, +merges and/or linking happens.

+

For a whole organization, a match-merge-link round for all records in that +organization is run in the following cases: +1. During the original deployment of this feature - This happens in order to +initially normalize the existing data and establish all initial links. +2. Whenever a user changes matching criteria - This happens in order to +re-normalize existing data and reestablish links. As of this writing, before +committing matching criteria changes, a user can view a preview of how their +records will be affected as these are difficult to reverse.

+
+
+

Note on In-Cycle Not-merged Matches

+

Even though the application tries it’s best to have only one representative record per property +(or tax lot) per Cycle, it’s possible for there to exist matches that were not merged. +This can happen if a user manually unmerges a record after a (manual or automatic) merge occurs. +If this happens, and there exists two records that match each other but are not merged, +both records are completely unlinked. Without user intervention such as editing +one of the matching criteria values, these will be merged and linked as described +above next time the system finds them during a match search.

+
+
+
+

Match Searching in Depth

+

Though they accomplish the same goal, the process for merging is very different between the last case, importing, +and the first 2 cases, manual edit or manual merge.

+

In the case of manual merging or editing, this process accounts for the fact that these are records that already exist. +Specifically, they may have associations such as labels, notes, pairings, and for properties, meters. +So during a subsequent match search leading to a merge of two or more records, all of these “old” associations are +carried over to the final record once merges are complete.

+

In the case of importing, considerations must be taken for the fact that, in most cases, multiple records +are being imported together. Also, since this is the entry point for records, it’s possible that a user might +accidentally try to import the same record snapshot twice - where all the record values are the same as another +existing record (as opposed to just having the same values for matching criteria fields). So on import, the process is as follows:

+
    +
  1. Amongst only the incoming records, duplicates (of other incoming or existing) are flagged and ignored.

  2. +
  3. Amongst only the incoming records, matching records are merged together.

  4. +
  5. Amongst all records in the same Cycle, incoming records that match an existing record gets merged with priority to that existing record. If the incoming record has multiple existing matches, the existing matches are merged together in latest updated order first while also combining any other associations (labels, notes, etc.) just as in the manual merge or edit cases. Since the incoming record is new, it doesn’t have any of the other associations.

  6. +
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/migrations.html b/docs/code_documentation/3.2.0/migrations.html new file mode 100644 index 00000000..92cb50da --- /dev/null +++ b/docs/code_documentation/3.2.0/migrations.html @@ -0,0 +1,549 @@ + + + + + + + Migrations — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Migrations

+

Django handles the migration of the database very well; however, there are various changes to SEED that may require some custom (manual) migrations. The migration documentation includes the required changes based on deployment and development for each release.

+
+

Version Develop

+

In order to support Redis passwords, the configuration of the Redis/Celery settings changed a bit. +You will need to add the following to your local_untracked.py configuration file. If you are using +Docker then you will not need to do this.

+
CELERY_RESULT_BACKEND = CELERY_BROKER_URL
+
+
+

If you are using a password, then in your local_untracked.py configuration, add the password to +the CELERY_BROKER_URL. Your final configuration should look like the following in your +local_untracked.py file

+
CELERY_BROKER_URL = 'redis://:password@127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+CELERY_RESULT_BACKEND = CELERY_BROKER_URL
+CELERY_TASK_DEFAULT_QUEUE = 'seed-local'
+CELERY_TASK_QUEUES = (
+    Queue(
+        CELERY_TASK_DEFAULT_QUEUE,
+        Exchange(CELERY_TASK_DEFAULT_QUEUE),
+        routing_key=CELERY_TASK_DEFAULT_QUEUE
+    ),
+)
+
+
+
+
+

Version 3.2.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 3.1.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 3.0.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 3.0.0-beta.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.22.0

+
    +
  • Run ./manage.py migrate.

  • +
  • +
    There is a Redis dependency update in this release that requires users and deployments to modify their settings’ CACHES config.
      +
    1. Update your dependencies with pip install -r requirements/base.txt

    2. +
    3. Update the CACHES BACKEND property to django_redis.cache.RedisCache

    4. +
    5. Update the CACHES LOCATION property to match the redis-py native URL notation for connection strings, including the redis protocol and database number. e.g. redis://localhost:6379/1

    6. +
    +

    Since the CELERY_BROKER_URL setting must also be in the same format, it may be helpful to configure that setting first and then reference it in the caches LOCATION parameter.

    +
    +
    +
  • +
  • See the PR for an example migration.

  • +
+
+
+

Version 2.21.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.20.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.20.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
  • There is a single long running migration related to importing census tract disadvantaged community data. This migration should take around 7 minutes to complete.

  • +
+
+
+

Version 2.19.0

+
    +
  • Run ./manage.py migrate.

  • +
  • +
    There is a new migration in this release that requires column names to be unique across organization, table_name, and is_extra_data. This migration will fail if there are duplicate column names. If you have duplicate column names, you will need to manually fix them in your database before running the migration. The following steps will help you identify and fix the duplicate column names:
      +
    • Check the organization age to gauge the impact of the change. If it is a deprecated org, impact of the change will be low. Often this issue arose in older organizations when units were not part of the columns. The old mapping columns were not upserts with the units, so typically the columns impacted are the ones with units.

    • +
    • Query the seed_column table for the organization and column name displayed on the screen (e.g., organization_id = 300 and column_name = ‘Source EUI (kBtu/ft2)’). If there is no table_name set, it is likely an import file column name and can easily be cleaned up without causing issues. In such cases, there will be two rows, and you want to keep the one with the units_pint column set.

    • +
    • More complex columns may require deleting or updating the column_id in the seed_columnmapping_* tables. If there is a foreign key constraint with seed_columnmapping_*, take note of the ID you want to remove and the ID you want it to be replaced with (preferably keep the one with units_pint).

    • +
    • +
      If the constraint is on seed_columnmapping_column_raw:
        +
      • The field should be an import file column (i.e., no table_name item). Query for the old column in seed_columnmapping_column_raw (e.g., column_name = <old_id>).

      • +
      • Replace the old ID with the new one. If it errors because it already exists, then the row can be deleted.

      • +
      • Return to the seed_column table and remove the old ID.

      • +
      +
      +
      +
    • +
    • +
      If the constraint is on seed_columnmapping_column_mapped:
        +
      • The mapped column should have a table_name in the field. If not, it is likely an older organization.

      • +
      • If there is no table_name, remove the row from the seed_columnmapping_column_mapped table.

      • +
      • Return to the seed_column table and remove the old ID.

      • +
      +
      +
      +
    • +
    +
    +
    +
  • +
+
+
+

Version 2.18.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.18.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.4

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.3

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.2

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.17.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.16.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.15.2

+
    +
  • There are no migrations needed for this version.

  • +
+
+
+

Version 2.15.1

+
    +
  • There are no migrations needed for this version.

  • +
+
+
+

Version 2.15.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.14.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.13.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.12.0 - 2.12.4

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.11.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.10.0

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.7.3 to 2.9.0

+
    +
  • The migrations should work without additional support. Simply run ./manage.py migrate.

  • +
+
+
+

Version 2.7.2

+
    +
  • The migrations should work without additional support. Simply run ./manage.py migrate. There are no manual migrations needed.

  • +
  • Note the Important Note in Version 2.7.1 migration below which may require the need to run a “fake” migration

  • +
+
+
+

Version 2.7.1

+
    +
  • There are no special migrations needed for this version. Simply run ./manage.py migrate.

  • +
+

Important Note:

+

If upgrading from < 2.7.0 to >= 2.7.1 you may encounter a failed migration with 0118_match_merge_link_all_orgs. This is expected if the database is several versions behind, and it effectively reorders migration 118 to run after all other migrations have completed to prepare your database to recognize properties and taxlots across multiple cycles. Run the following code manually to fully migrate:

+
    +
  1. ./manage.py migrate --fake seed 0118_match_merge_link_all_orgs

  2. +
  3. ./manage.py migrate

  4. +
  5. ./manage.py shell

    +
    +
    from seed.lib.superperms.orgs.models import Organization
    +from seed.utils.match import whole_org_match_merge_link
    +
    +for org in Organization.objects.all():
    +    whole_org_match_merge_link(org.id, 'PropertyState')
    +    whole_org_match_merge_link(org.id, 'TaxLotState')
    +
    +
    +
    +
  6. +
+
+
+

Version 2.7.0

+
    +
  • This migration will run a match/merge/pair/link method upon migration. Make sure to run the migration manually and not inside of the docker container using the ./deploy.sh script.

  • +
  • Make sure to backup the database before performing the migration.

  • +
  • Run ./manage.py migrate.

  • +
+
+
+

Version 2.6.1

+
    +
  • The migrations should work without additional support. Simply run ./manage.py migrate. There are no manual migrations needed for the 2.6.1 release.

  • +
+
+
+

Version 2.6.0

+

Version 2.6.0 includes support for meters and time series data storage. In order to use this release +you must first install TimescaleDB.

+
+

Docker-based Deployment

+

Docker-based deployments shouldn’t require running any additional commands for installation. The +timescaledb installation will happen automatically when updating the postgres container. Also, +the installation of the extension occurs in a Django migration.

+
+
+

Ubuntu

+
sudo add-apt-repository ppa:timescale/timescaledb-ppa
+sudo apt update
+sudo apt install timescaledb-postgresql-10
+sudo timescaledb-tune
+sudo service postgresql restart
+
+
+
+
+

Max OSX

+
brew tap timescale/tap
+brew install timescaledb
+/usr/local/bin/timescaledb_move.sh
+timescaledb-tune
+brew services restart postgresql
+
+
+
+
+
+

Version 2.5.2

+
    +
  • There are no manual migrations that are needed. The ./manage.py migrate command may take awhile to run since the migration requires the recalculation of all the normalized addresses to parse bldg correct and to cast the result as a string and not a bytestring.

  • +
+
+
+

Version 2.5.1

+
    +
  • The migrations should work by simply running ./manage.py migrate. There are no manual migrations needed for the 2.5.1 release.

  • +
+
+
+

Version 2.5.0

+
+

Docker-based Deployment

+
    +
  • Add the MapQuest API key to your organization.

  • +
  • On deployment, the error below is indicative that you need to install the extensions in the postgres database. Run docker exec <postgres_container_id> update-postgis.sh.

    +
    +

    django.db.utils.OperationalError: could not open extension control file “/usr/share/postgresql/11/extension/postgis.control”: No such file or directory

    +
    +
  • +
  • If you are using a copied version of the docker-compose.yml file, then you need to change 127.0.0.1:5000/postgres to 127.0.0.1:5000/postgres-seed

  • +
+
+
+

Development

+
    +
  • Delete your bower directory rm -rf seed/static/vendors.

  • +
  • Delete your css directory rm -rf seed/static/seed/css.

  • +
  • Remove these lines from local_untracked.py if you have them.

  • +
+
DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'
+STATICFILES_STORAGE = DEFAULT_FILE_STORAGE
+
+
+
    +
  • Run pip3 install -r requirements/local.txt.

  • +
  • Run npm install from root checkout of SEED.

  • +
  • If testing geocoding, then sign up for as a MapQuest Developer and create a new MapQuest Key.

  • +
  • Add the key to the organization that you are using in development.

  • +
  • Update your DATABASES engine to be django.contrib.gis.db.backends.postgis

  • +
+
DATABASES = {
+    'default': {
+        'ENGINE': 'django.contrib.gis.db.backends.postgis',
+        'NAME': 'seeddb',
+        'USER': 'seeduser',
+        'PASSWORD': 'seedpass',
+        'HOST': 'localhost',
+        'PORT': '5432',
+    }
+}
+
+
+
    +
  • Run ./manage.py migrate

  • +
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules.html b/docs/code_documentation/3.2.0/modules.html new file mode 100644 index 00000000..b611e328 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules.html @@ -0,0 +1,525 @@ + + + + + + + Modules — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Modules

+
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/config.html b/docs/code_documentation/3.2.0/modules/config.html new file mode 100644 index 00000000..3b90a661 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/config.html @@ -0,0 +1,219 @@ + + + + + + + Configuration — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Configuration

+
+

Submodules

+
+
+

Template Context

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+config.template_context.sentry_js(request)
+
+ +
+
+config.template_context.session_key(request)
+
+ +
+
+

Tests

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+config.utils.de_camel_case(name)
+
+ +
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+config.views.robots_txt(request, allow=False)
+
+ +
+
+

WSGI

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

:description WSGI config for config project.

+

This module contains the WSGI application used by Django’s development server +and any production WSGI deployments. It should expose a module-level variable +named application. Django’s runserver and runfcgi commands discover +this application via the WSGI_APPLICATION setting.

+

Usually you will have the standard Django WSGI application here, but it also +might make sense to replace the whole Django WSGI application with a custom one +that later delegates to the Django one. For example, you could introduce WSGI +middleware here, or combine a Django application with an application of another +framework.

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.cleansing.html b/docs/code_documentation/3.2.0/modules/seed.cleansing.html new file mode 100644 index 00000000..3ad70e87 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.cleansing.html @@ -0,0 +1,955 @@ + + + + + + + Data Quality Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Data Quality Package

+
+

Inheritance

+
+
+

Submodules

+
+
+

Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+exception seed.models.data_quality.ComparisonError
+

Bases: Exception

+
+ +
+
+class seed.models.data_quality.DataQualityCheck(*args, **kwargs)
+

Bases: Model

+

Object that stores the high level configuration per organization of the DataQualityCheck

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+REQUIRED_FIELDS = {'PropertyState': ['address_line_1', 'custom_id_1', 'pm_property_id'], 'TaxLotState': ['address_line_1', 'custom_id_1', 'jurisdiction_tax_lot_id']}
+
+ +
+
+add_goal_rule_labels(rule)
+
+ +
+
+add_invalid_geometry_entry_provided(row_id, rule, display_name, value)
+
+ +
+
+add_result_comparison_error(row_id, rule, display_name, value, rule_check)
+
+ +
+
+add_result_dimension_error(row_id, rule, display_name, value)
+
+ +
+
+add_result_is_null(row_id, rule, display_name, value)
+
+ +
+
+add_result_max_error(row_id, rule, display_name, value, rule_max)
+
+ +
+
+add_result_min_error(row_id, rule, display_name, value, rule_min)
+
+ +
+
+add_result_missing_and_none(row_id, rule, display_name, value)
+
+ +
+
+add_result_missing_req(row_id, rule, display_name, value)
+
+ +
+
+add_result_range_error(row_id, rule, display_name, value)
+
+ +
+
+add_result_string_error(row_id, rule, display_name, value)
+
+ +
+
+add_result_type_error(row_id, rule, display_name, value)
+
+ +
+
+add_rule(rule)
+

Add a new rule to the Data Quality Checks

+
+
Parameters:
+

rule – dict to be added as a new rule

+
+
Returns:
+

None

+
+
+
+ +
+
+add_rule_if_new(rule)
+

Add a new rule to the Data Quality Checks only if rule does not exist

+
+
Parameters:
+

rule – dict to be added as a new rule

+
+
Returns:
+

None

+
+
+
+ +
+
+static cache_key(identifier, organization_id)
+

Static method to return the location of the data_quality results from redis.

+
+
Parameters:
+

identifier – Import file primary key

+
+
Returns:
+

+
+
+
+ +
+
+check_data(record_type, rows)
+

Send in data as a queryset from the Property/Taxlot ids.

+
+
Parameters:
+
    +
  • record_type – one of PropertyState | TaxLotState

  • +
  • rows – rows of data to be checked for data quality

  • +
+
+
Returns:
+

None

+
+
+
+ +
+
+check_data_cross_cycle(goal_id, state_pairs)
+

Send in data as properties and their goal state pairs. Update GoalNote.passed_checks with data quality check return +:param goal: +:param state_pairs: [{property: Property, baseline: PropertyState, current: PropertyState}, {}, …]

+
+ +
+
+get_fieldnames(record_type)
+

Get fieldnames to apply to results.

+
+ +
+
+get_value(property_obj, data_type, goal, cycle_key)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+init_result(record_type, row, fields)
+
+ +
+
+static initialize_cache(identifier, organization_id)
+

Initialize the cache for storing the results. This is called before the +celery tasks are chunked up.

+

The cache_key is different than the identifier. The cache_key is where all the results are +to be stored for the data quality checks, the identifier, is the random number (or specified +value that is used to identifier both the progress and the data storage

+
+
Parameters:
+

identifier – Identifier for cache, if None, then creates a random one

+
+
Returns:
+

list, [cache_key and the identifier]

+
+
+
+ +
+
+initialize_rules()
+

Initialize the default rules for a DataQualityCheck object

+
+
Returns:
+

None

+
+
+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+prune_results()
+
+ +
+
+remove_all_rules()
+

Removes all the rules associated with this DataQualityCheck instance.

+
+
Returns:
+

None

+
+
+
+ +
+
+remove_status_label(label_class, rule, linked_id)
+

Remove label because it did not match any of the range exceptions

+
+
Parameters:
+
    +
  • label_class – statuslabel object, either property label or taxlot label

  • +
  • rule – rule object

  • +
  • linked_id – id of propertystate or taxlotstate object

  • +
+
+
Returns:
+

boolean, if labeled was applied

+
+
+
+ +
+
+reset_all_rules()
+

Delete all rules and reinitialize the default set of rules

+
+
Returns:
+

None

+
+
+
+ +
+
+reset_default_rules()
+

Reset only the default rules

+
+
Returns:
+

+
+
+
+ +
+
+reset_results()
+
+ +
+
+classmethod retrieve(organization_id)
+

DataQualityCheck was previously a simple object but has been migrated to a django model. +This method ensures that the data quality model will be backwards compatible.

+

This is the preferred method to initialize a new object.

+
+
Parameters:
+

organization – instance of Organization

+
+
Returns:
+

obj, DataQualityCheck

+
+
+
+ +
+
+retrieve_result_by_address(address)
+

Retrieve the results of the data quality checks for a specific address.

+
+
Parameters:
+

address – string, address to find the result for

+
+
Returns:
+

dict, results of data quality check for specific building

+
+
+
+ +
+
+retrieve_result_by_tax_lot_id(tax_lot_id)
+

Retrieve the results of the data quality checks by the jurisdiction ID.

+
+
Parameters:
+

tax_lot_id – string, jurisdiction tax lot id

+
+
Returns:
+

dict, results of data quality check for specific building

+
+
+
+ +
+
+rules
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+save_to_cache(identifier, organization_id)
+

Save the results to the cache database. The data in the cache are +stored as a list of dictionaries. The data in this class are stored as +a dict of dict. This is important to remember because the data from the +cache cannot be simply loaded into the above structure.

+
+
Parameters:
+

identifier – Import file primary key

+
+
Returns:
+

None

+
+
+
+ +
+
+update_status_label(label_class, rule, linked_id, row_id, add_to_results=True)
+
+
Parameters:
+
    +
  • label_class – statuslabel object, either propertyview label or taxlotview label

  • +
  • rule – rule object

  • +
  • linked_id – id of propertyview or taxlotview object

  • +
  • row_id

  • +
  • add_to_results – bool

  • +
+
+
Returns:
+

boolean, if labeled was applied

+
+
+
+ +
+ +
+
+exception seed.models.data_quality.DataQualityTypeCastError
+

Bases: Exception

+
+ +
+
+class seed.models.data_quality.Rule(*args, **kwargs)
+

Bases: Model

+

Rules for DataQualityCheck

+
+
+DATA_TYPES = [(0, 'number'), (1, 'string'), (2, 'date'), (3, 'year'), (4, 'area'), (5, 'eui')]
+
+ +
+
+DEFAULT_RULES = [{'condition': 'not_null', 'data_type': 1, 'field': 'address_line_1', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'not_null', 'data_type': 1, 'field': 'pm_property_id', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'not_null', 'field': 'custom_id_1', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'not_null', 'field': 'jurisdiction_tax_lot_id', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'TaxLotState'}, {'condition': 'not_null', 'data_type': 1, 'field': 'address_line_1', 'not_null': True, 'rule_type': 0, 'severity': 0, 'table_name': 'TaxLotState'}, {'condition': 'range', 'data_type': 4, 'field': 'conditioned_floor_area', 'max': 7000000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 4, 'field': 'conditioned_floor_area', 'min': 100, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 0, 'field': 'energy_score', 'max': 100, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 0, 'field': 'energy_score', 'min': 10, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 2, 'field': 'generation_date', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 0, 'field': 'gross_floor_area', 'max': 7000000, 'min': 100, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 0, 'field': 'occupied_floor_area', 'max': 7000000, 'min': 100, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'ft**2'}, {'condition': 'range', 'data_type': 2, 'field': 'recent_sale_date', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 2, 'field': 'release_date', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 5, 'field': 'site_eui', 'max': 1000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'site_eui', 'min': 10, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'site_eui_weather_normalized', 'max': 1000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'source_eui', 'max': 1000, 'min': 0, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'source_eui', 'min': 10, 'rule_type': 0, 'severity': 1, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 5, 'field': 'source_eui_weather_normalized', 'max': 1000, 'min': 10, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState', 'units': 'kBtu/ft**2/year'}, {'condition': 'range', 'data_type': 3, 'field': 'year_built', 'max': '2024', 'min': 1700, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'data_type': 2, 'field': 'year_ending', 'max': '20241231', 'min': 18890101, 'rule_type': 0, 'severity': 0, 'table_name': 'PropertyState'}, {'condition': 'range', 'cross_cycle': True, 'data_type': 5, 'field': 'eui', 'max': 40, 'name': 'High EUI % Change', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'range', 'cross_cycle': True, 'data_type': 5, 'field': 'eui', 'min': -40, 'name': 'Low EUI % Change', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'range', 'cross_cycle': True, 'data_type': 4, 'field': 'area', 'max': 5, 'name': 'High Area % Change', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'range', 'cross_cycle': True, 'data_type': 4, 'field': 'area', 'min': -5, 'name': 'Low Area % Change', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'range', 'data_type': 5, 'field': 'eui', 'max': 1000, 'name': 'High EUI', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'range', 'data_type': 5, 'field': 'eui', 'min': 40, 'name': 'Low EUI', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'range', 'data_type': 4, 'field': 'area', 'max': 1000000, 'name': 'High Area', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'range', 'data_type': 4, 'field': 'area', 'min': 1000, 'name': 'Low Area', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'not_null', 'data_type': 5, 'field': 'eui', 'name': 'Missing EUI', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}, {'condition': 'not_null', 'data_type': 4, 'field': 'area', 'name': 'Missing Area', 'rule_type': 0, 'severity': 0, 'table_name': 'Goal'}]
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+RULE_EXCLUDE = 'exclude'
+
+ +
+
+RULE_INCLUDE = 'include'
+
+ +
+
+RULE_NOT_NULL = 'not_null'
+
+ +
+
+RULE_RANGE = 'range'
+
+ +
+
+RULE_REQUIRED = 'required'
+
+ +
+
+RULE_TYPE = [(0, 'default'), (1, 'custom')]
+
+ +
+
+RULE_TYPE_CUSTOM = 1
+
+ +
+
+RULE_TYPE_DEFAULT = 0
+
+ +
+
+SEVERITY = [(0, 'error'), (1, 'warning'), (2, 'valid')]
+
+ +
+
+SEVERITY_ERROR = 0
+
+ +
+
+SEVERITY_VALID = 2
+
+ +
+
+SEVERITY_WARNING = 1
+
+ +
+
+TYPE_AREA = 4
+
+ +
+
+TYPE_DATE = 2
+
+ +
+
+TYPE_EUI = 5
+
+ +
+
+TYPE_NUMBER = 0
+
+ +
+
+TYPE_STRING = 1
+
+ +
+
+TYPE_YEAR = 3
+
+ +
+
+condition
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+cross_cycle
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_quality_check
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+data_quality_check_id
+
+ +
+
+data_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+enabled
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+field
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+for_derived_column
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+format_strings(value)
+
+ +
+
+get_data_type_display(*, field=<django.db.models.fields.IntegerField: data_type>)
+
+ +
+
+get_rule_type_display(*, field=<django.db.models.fields.IntegerField: rule_type>)
+
+ +
+
+get_severity_display(*, field=<django.db.models.fields.IntegerField: severity>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+max
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+maximum_valid(value)
+

Validate that the value is not greater than the maximum specified by the rule.

+
+
Parameters:
+

value – Value to validate rule against

+
+
Returns:
+

bool, True is valid, False if the value is out of range

+
+
+
+ +
+
+min
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+minimum_valid(value)
+

Validate that the value is not less than the minimum specified by the rule.

+
+
Parameters:
+

value – Value to validate rule against

+
+
Returns:
+

bool, True is valid, False if the value is out of range

+
+
+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+not_null
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+required
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+rule_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+severity
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+status_label
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+status_label_id
+
+ +
+
+str_to_data_type(value)
+

If the check is coming from a field in the database then it will be typed correctly; +however, for extra_data, the values are typically strings or unicode. Therefore, the +values are typed before they are checked using the rule’s data type definition.

+
+
Parameters:
+

value – variant, value to type

+
+
Returns:
+

typed value

+
+
+
+ +
+
+table_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+text_match
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+units
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+valid_text(value)
+

Validate the rule matches the specified text. Text is matched by regex.

+
+
Parameters:
+

value – Value to validate rule against

+
+
Returns:
+

bool, True is valid, False if the value does not match

+
+
+
+ +
+ +
+
+exception seed.models.data_quality.UnitMismatchError
+

Bases: Exception

+
+ +
+
+seed.models.data_quality.format_pint_violation(rule, source_value)
+

Format a pint min, max violation for human readability.

+

:param rule +:param source_value : Quantity - value to format into range +:return (formatted_value, formatted_min, formatted_max) : (String, String, String)

+
+ +
+
+

Tests

+
+
+

Views

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.data.html b/docs/code_documentation/3.2.0/modules/seed.data.html new file mode 100644 index 00000000..2d6949d1 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.data.html @@ -0,0 +1,157 @@ + + + + + + + Data Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Data Package

+
+

Submodules

+
+
+

BEDES

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.data_importer.html b/docs/code_documentation/3.2.0/modules/seed.data_importer.html new file mode 100644 index 00000000..bc9c1af7 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.data_importer.html @@ -0,0 +1,242 @@ + + + + + + + Data Importer Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Data Importer Package

+
+

Submodules

+
+
+

Managers

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.data_importer.managers.NotDeletedManager(*args, **kwargs)
+

Bases: Manager

+
+
+get_all(*args, **kwargs)
+

Method to return ALL ImportFiles, including the ones where deleted == True which are normally excluded. +This is used for database/filesystem cleanup.

+
+ +
+
+get_queryset(*args, **kwargs)
+

Return a new QuerySet object. Subclasses can override this method to +customize the behavior of the Manager.

+
+ +
+ +
+ +
+ +
+
+

Models

+
+
+

URLs

+
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

Utility methods pertaining to data import tasks (save, mapping, matching).

+
+
+seed.data_importer.utils.kbtu_thermal_conversion_factors(country)
+

Returns thermal conversion factors provided by Portfolio Manager. +In the PM app, using NREL’s test account, a property was created for each US +and CAN. All possible Meters of different Type and Units were added. +Readings of value 1 were added to deduce the factors provided below.

+

Consideration was given regarding having the provided ‘country’ value align with +Organizations’ thermal_conversion_assumption enums. Even though these two +should be aligned, the concept and need for these factors are not specific +solely to Orgs. So the ‘country’ value here is expected to be a string. +Specifically, there are instances in the codebase where the factors are +needed irrespective of any Organization’s preferences.

+
+ +
+
+seed.data_importer.utils.kgal_water_conversion_factors(coutry)
+

Returns water conversion factor provided by Portfolio Manager. +Conversion factors taken from: https://www.kylesconverter.com/volume/kilogallons

+

# should country be considered?

+
+ +
+
+seed.data_importer.utils.usage_point_id(raw_source_id)
+

Extracts and returns the usage point ID of a GreenButton full uri ID.

+
+ +
+
+

Views

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.features.html b/docs/code_documentation/3.2.0/modules/seed.features.html new file mode 100644 index 00000000..e396668c --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.features.html @@ -0,0 +1,175 @@ + + + + + + + Features Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.html b/docs/code_documentation/3.2.0/modules/seed.html new file mode 100644 index 00000000..c2b06dda --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.html @@ -0,0 +1,843 @@ + + + + + + + SEED Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SEED Package

+
+

Subpackages

+
+ +
+
+
+

Inheritance

+
+
+

Submodules

+
+
+

Decorators

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.decorators.DRFEndpointMixin
+

alias of Mixin

+
+ +
+
+seed.decorators.ajax_request(func)
+

Copied from django-annoying, with a small modification. Now we also check for ‘status’ or +‘success’ keys and slash return correct status codes

+

If view returned serializable dict, returns response in a format requested +by HTTP_ACCEPT header. Defaults to JSON if none requested or match.

+

Currently supports JSON or YAML (if installed), but can easily be extended.

+

Example:

+
@ajax_request
+def my_view(request):
+    news = News.objects.all()
+    news_titles = [entry.title for entry in news]
+    return {"news_titles": news_titles}
+
+
+
+ +
+
+seed.decorators.ajax_request_class(func)
+
    +
  • Copied from django-annoying, with a small modification. Now we also check for ‘status’ or

  • +
+

‘success’ keys and return correct status codes

+

If view returned serializable dict, returns response in a format requested +by HTTP_ACCEPT header. Defaults to JSON if none requested or match.

+

Currently supports JSON or YAML (if installed), but can easily be extended.

+

Example:

+
@ajax_request
+def my_view(self, request):
+    news = News.objects.all()
+    news_titles = [entry.title for entry in news]
+    return {"news_titles": news_titles}
+
+
+
+ +
+
+seed.decorators.decorator_to_mixin(decorator)
+

Converts a decorator written for a function view into a mixin for a class-based view.

+

Example:

+
LoginRequiredMixin = decorator_to_mixin(login_required)
+
+
+class MyView(LoginRequiredMixin):
+    pass
+
+
+class SomeView(decorator_to_mixin(some_decorator), decorator_to_mixin(something_else)):
+    pass
+
+
+
+ +
+
+seed.decorators.get_prog_key(func_name, import_file_pk)
+

Return the progress key for the cache

+
+ +
+
+seed.decorators.lock_and_track(fn, *args, **kwargs)
+

Decorator to lock tasks to single executor and provide progress url.

+
+ +
+
+seed.decorators.require_organization_id(func)
+

Validate that organization_id is in the GET params and it’s an int.

+
+ +
+
+seed.decorators.require_organization_id_class(fn)
+

Validate that organization_id is in the GET params and it’s an int.

+
+ +
+
+seed.decorators.require_organization_membership(fn)
+

Validate that the organization_id passed in GET is valid for request user.

+
+ +
+
+

Factory

+
+
+

Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Search

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

Search methods pertaining to buildings.

+
+
+seed.search.build_shared_buildings_orgs(orgs)
+

returns a list of sibling and parent orgs

+
+ +
+
+seed.search.create_inventory_queryset(inventory_type, orgs, exclude, order_by, other_orgs=None, cycle_id=None)
+

creates a queryset of properties or taxlots within orgs. +If other_orgs, properties/taxlots in both orgs and other_orgs +will be represented in the queryset.

+
+
Parameters:
+
    +
  • inventory_type – property or taxlot.

  • +
  • orgs – queryset of Organization inst.

  • +
  • exclude – django query exclude dict.

  • +
  • order_by – django query order_by str.

  • +
  • other_orgs – list of other orgs to or the query

  • +
+
+
+
+ +
+
+seed.search.get_inventory_fieldnames(inventory_type)
+

returns a list of field names that will be searched against

+
+ +
+
+seed.search.get_orgs_w_public_fields()
+

returns a list of orgs that have publicly shared fields

+
+ +
+
+seed.search.inventory_search_filter_sort(inventory_type, params, user, cycle_id=None)
+

Given a parsed set of params, perform the search, filter, and sort for +Properties or Taxlots

+
+ +
+
+seed.search.parse_body(request)
+

parses the request body for search params, q, etc

+
+
Parameters:
+

request – django wsgi request object

+
+
Returns:
+

dict

+
+
+

Example:

+
{
+    'exclude': dict, exclude dict for django queryset
+    'order_by': str, query order_by, defaults to 'tax_lot_id'
+    'sort_reverse': bool, True if ASC, False if DSC
+    'page': int, pagination page
+    'number_per_page': int, number per pagination page
+    'show_shared_buildings': bool, whether to search across all user's orgs
+    'q': str, global search param
+    'other_search_params': dict, filter params
+    'project_id': str, project id if exists in body
+}
+
+
+
+ +
+
+seed.search.process_search_params(params, user, is_api_request=False)
+

Given a python representation of a search query, process it into the +internal format that is used for searching, filtering, sorting, and pagination.

+
+
Parameters:
+
    +
  • params – a python object representing the search query

  • +
  • user – the user this search is for

  • +
  • is_api_request – bool, boolean whether this search is being done as an api request.

  • +
+
+
Returns:
+

dict

+
+
+

Example:

+
{
+    'exclude': dict, exclude dict for django queryset
+    'order_by': str, query order_by, defaults to 'tax_lot_id'
+    'sort_reverse': bool, True if ASC, False if DSC
+    'page': int, pagination page
+    'number_per_page': int, number per pagination page
+    'show_shared_buildings': bool, whether to search across all user's orgs
+    'q': str, global search param
+    'other_search_params': dict, filter params
+    'project_id': str, project id if exists in body
+}
+
+
+
+ +
+
+seed.search.search_inventory(inventory_type, q, fieldnames=None, queryset=None)
+

returns a queryset for matching Taxlot(View)/Property(View) +:param str or unicode q: search string +:param list fieldnames: list of model fieldnames +:param queryset: optional queryset to filter from +:returns: :queryset: queryset of matching buildings

+
+ +
+
+seed.search.search_properties(q, fieldnames=None, queryset=None)
+
+ +
+
+seed.search.search_taxlots(q, fieldnames=None, queryset=None)
+
+ +
+
+

Tasks

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.tasks.delete_organization(org_pk)
+

delete_organization_buildings

+
+ +
+
+seed.tasks.invite_new_user_to_seed(domain, email_address, token, user_pk, first_name)
+

Send invitation email to newly created user from the landing page. +NOTE: this function is only used on the landing page because the user has not been assigned an organization +domain – The domain name of the running seed instance +email_address – The address to send the invitation to +token – generated by Django’s default_token_generator +user_pk – primary key for this user record +first_name – First name of the new user +new_user

+

Returns: nothing

+
+ +
+
+seed.tasks.send_salesforce_error_log(org_pk, errors)
+

send salesforce error log to logging email when errors are encountered during scheduled sync

+
+ +
+
+

Token Generator

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
author:
+

Aleck Landgraf

+
+
+

token_generator.py - taken from django core master branch

+

needed a token check that would not expire after three days for sending a +signup email

+
+
+class seed.token_generators.SignupTokenGenerator
+

Bases: object

+

Strategy object used to generate and check tokens for the password +reset mechanism.

+
+
+check_token(user, token, token_expires=True)
+

Check that a password reset token is correct for a given user.

+
+ +
+
+make_token(user)
+

Returns a token that can be used once to do a password reset +for the given user.

+
+ +
+ +
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.landing.html b/docs/code_documentation/3.2.0/modules/seed.landing.html new file mode 100644 index 00000000..d89f5da4 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.landing.html @@ -0,0 +1,891 @@ + + + + + + + Landing Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Landing Package

+
+

Subpackages

+ +
+
+

Submodules

+
+
+

Forms

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.landing.forms.CustomCreateUserForm(*args, **kwargs)
+

Bases: UserCreationForm

+
+
+class Meta
+

Bases: object

+
+
+fields = ['username']
+
+ +
+
+model
+

alias of SEEDUser

+
+ +
+
+widgets = {'username': <django.forms.widgets.EmailInput object>}
+
+ +
+ +
+
+base_fields = {'password1': <django.forms.fields.CharField object>, 'password2': <django.forms.fields.CharField object>, 'username': <django.forms.fields.EmailField object>}
+
+ +
+
+declared_fields = {'password1': <django.forms.fields.CharField object>, 'password2': <django.forms.fields.CharField object>}
+
+ +
+
+property media
+

Return all media required to render the widgets on this form.

+
+ +
+ +
+
+class seed.landing.forms.LoginForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, field_order=None, use_required_attribute=None, renderer=None)
+

Bases: Form

+
+
+base_fields = {'email': <django.forms.fields.EmailField object>, 'password': <django.forms.fields.CharField object>}
+
+ +
+
+declared_fields = {'email': <django.forms.fields.EmailField object>, 'password': <django.forms.fields.CharField object>}
+
+ +
+
+property media
+

Return all media required to render the widgets on this form.

+
+ +
+ +
+
+

Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.landing.models.SEEDUser(*args, **kwargs)
+

Bases: AbstractBaseUser, PermissionsMixin

+

An abstract base class implementing a fully featured User model with +admin-compliant permissions.

+

Username, password and email are required. Other fields are optional.

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+REQUIRED_FIELDS = ['email']
+
+ +
+
+USERNAME_FIELD = 'username'
+
+ +
+
+analysis_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+api_key
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+columnmapping_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+cycle_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+date_joined
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+deactivate_user()
+
+ +
+
+default_building_detail_custom_columns
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+default_custom_columns
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+default_organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+default_organization_id
+
+ +
+
+email
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+email_user(subject, message, from_email=None)
+

Sends an email to this User.

+
+ +
+
+emaildevice_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+first_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+generate_key()
+

Creates and sets an API key for this user. +Adapted from tastypie:

+

https://github.com/toastdriven/django-tastypie/blob/master/tastypie/models.py#L47

+
+ +
+
+get_absolute_url()
+
+ +
+
+get_full_name()
+

Returns the first_name plus the last_name, with a space in between.

+
+ +
+
+get_next_by_date_joined(*, field=<django.db.models.fields.DateTimeField: date_joined>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_date_joined(*, field=<django.db.models.fields.DateTimeField: date_joined>, is_next=False, **kwargs)
+
+ +
+
+get_short_name()
+

Returns the short name for the user.

+
+ +
+
+greenassessmentpropertyauditlog_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+importrecord_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+is_staff
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+last_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+logentry_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+modified_import_records
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+notes
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.contrib.auth.models.UserManager object>
+
+ +
+
+organizationuser_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+orgs
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+phonedevice_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+postofficeemail_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+postofficeemailtemplate_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+classmethod process_header_request(request)
+

Process the header string to return the user if it is a valid user.

+
+
Parameters:
+

request – object, request object with HTTP Authorization

+
+
Returns:
+

User object

+
+
+
+ +
+
+prompt_2fa
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+save(*args, **kwargs)
+

Ensure that email and username are synced.

+
+ +
+
+show_shared_buildings
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+staticdevice_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+totpdevice_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+user_permissions
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+username
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+

Tests

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.landing.tests.UserLoginTest(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_simple_login()
+

Happy path login

+
+ +
+ +
+
+

URLs

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.landing.views.CustomLoginView(**kwargs)
+

Bases: LoginView

+
+
+dispatch(request, *args, **kwargs)
+

This method gets called by the routing engine. The first argument is +request which contains a HttpRequest instance. +The request is stored in self.request for later use. The storage +instance is stored in self.storage.

+

After processing the request using the dispatch method, the +response gets updated by the storage engine (for example add cookies).

+
+ +
+
+get(request, *args, **kwargs)
+

This method handles GET requests.

+

If a GET request reaches this point, the wizard assumes that the user +just starts at the first step or wants to restart the process. +The data of the wizard will be reset before rendering the first step

+
+ +
+
+handle_2fa_prompt(response, user)
+
+ +
+
+handle_auth(request, response)
+
+ +
+
+handle_token(request, response)
+
+ +
+
+post(request, *args, **kwargs)
+

The user can select a particular device to challenge, being the backup +devices added to the account.

+
+ +
+ +
+
+seed.landing.views.account_activation_sent(request)
+
+ +
+
+seed.landing.views.activate(request, uidb64, token)
+
+ +
+
+seed.landing.views.create_account(request)
+
+ +
+
+seed.landing.views.landing_page(request)
+
+ +
+
+seed.landing.views.password_reset(request)
+
+ +
+
+seed.landing.views.password_reset_complete(request)
+
+ +
+
+seed.landing.views.password_reset_confirm(request, uidb64=None, token=None)
+
+ +
+
+seed.landing.views.password_reset_done(request)
+
+ +
+
+seed.landing.views.password_set(request, uidb64=None, token=None)
+
+ +
+
+seed.landing.views.signup(request, uidb64=None, token=None)
+
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.landing.management.commands.html b/docs/code_documentation/3.2.0/modules/seed.landing.management.commands.html new file mode 100644 index 00000000..ac067f48 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.landing.management.commands.html @@ -0,0 +1,167 @@ + + + + + + + Landing Management Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Landing Management Package

+
+

Submodules

+
+
+

Update EULA

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.landing.management.html b/docs/code_documentation/3.2.0/modules/seed.landing.management.html new file mode 100644 index 00000000..d1b46177 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.landing.management.html @@ -0,0 +1,173 @@ + + + + + + + seed.landing.management package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

seed.landing.management package

+
+

Subpackages

+ +
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.lib.html b/docs/code_documentation/3.2.0/modules/seed.lib.html new file mode 100644 index 00000000..d6117ff2 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.lib.html @@ -0,0 +1,159 @@ + + + + + + + Library Packages — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Library Packages

+
+

Submodules

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.lib.mappings.html b/docs/code_documentation/3.2.0/modules/seed.lib.mappings.html new file mode 100644 index 00000000..35f917fa --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.lib.mappings.html @@ -0,0 +1,339 @@ + + + + + + + seed.lib.mappings package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

seed.lib.mappings package

+
+

Submodules

+
+
+

seed.lib.mappings.mapper module

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

:author Dan Gunter <dkgunter@lbl.gov>

+
+
+seed.lib.mappings.mapper.create_column_regexes(raw_columns)
+

Take the columns in the format below and sanitize the keys and add +in the regex.

+
+
Parameters:
+

raw_data – list of strings (columns names from imported file)

+
+
Returns:
+

list of dict

+
+
+
+ +
+
+seed.lib.mappings.mapper.get_pm_mapping(raw_columns, mapping_data=None, resolve_duplicates=True)
+

Create and return Portfolio Manager (PM) mapping for a given version of PM and the given +list of column names.

+

The method will take the raw_columns (from the CSV/XLSX file) and attempt to normalize the +column names so that they can be mapped to the data in the pm-mapping.json[‘from_field’].

+
+ +
+
+

seed.lib.mappings.mapping_columns module

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

:author Nicholas Long <nicholas.long@nrel.gov>

+
+
+class seed.lib.mappings.mapping_columns.MappingColumns(raw_columns, dest_columns, previous_mapping=None, map_args=None, default_mappings=None, threshold=0)
+

Bases: object

+

This class handles the probabilistic mapping of unknown columns to defined fields. This +is mainly used in the build_column_mapping API endpoint.

+
+
+add_mappings(raw_column, mappings, previous_mapping=False)
+

Add mappings to the data structure for later processing.

+
+
Parameters:
+
    +
  • raw_column – list of strings

  • +
  • mappings – list of tuples of potential mappings and confidences

  • +
  • previous_mapping – boolean, if true these mappings will take precedence

  • +
+
+
Returns:
+

Bool, whether the mapping was added

+
+
+
+ +
+
+apply_threshold(threshold)
+

Remove mapping suggestions that do not meet the defined threshold

+

This method is forced as part of the workflow for now, but could easily be made as a +separate call.

+
+
Parameters:
+

threshold – int, min value to be greater than or equal to.

+
+
Returns:
+

None

+
+
+
+ +
+
+property duplicates
+

Check for duplicate initial mapping results. Duplicates exist if the first suggested mapping +for two different raw_columns are the same. The example below would be one of those cases.

+
+
Returns:
+

List of raw col

+
+
+
+ +
+
+property final_mappings
+

Return the final mappings in a format that can be used downstream from this method +{

+
+

“raw_column_1”: (‘table’, ‘db_column_1’, confidence), +“raw_column_2”: (‘table’, ‘db_column_1’, confidence),

+
+

}

+
+ +
+
+first_suggested_mapping(raw_column)
+

Grab the first suggested mapping for a raw column

+
+
Parameters:
+

raw_column – String

+
+
Returns:
+

tuple of the mapping (‘table’, ‘field’, confidence), or ()

+
+
+
+ +
+
+resolve_duplicate(dup_map_field, raw_columns)
+

If there are duplicates, that is two raw_columns are trying to map to the same suggested +column, then select the next available one on the duplicate column. The one with the highest +confidence will ‘win’ the duplicate battle.

+
+
Parameters:
+
    +
  • dup_map_field – String, name of the field that is a duplicate

  • +
  • raw_columns – list, raw columns that mapped to the same result

  • +
+
+
Returns:
+

None

+
+
+
+ +
+
+set_initial_mapping_cmp(raw_column)
+

Set the initial_mapping_cmp helper item in the self.data hash. This is used to detect +if there are any duplicates. The initial mapping cmp will be the first match in the list +(i.e., the one with the highest confidence).

+
+
Parameters:
+

raw_column – String, name of the raw column to set the initial_mapping_cmp

+
+
Returns:
+

None

+
+
+
+ +
+ +
+
+seed.lib.mappings.mapping_columns.sort_duplicates(a, b)
+

Custom sort for the duplicate hash to decide which raw column will get the mapping suggestion +based on the confidence.

+
+ +
+
+

seed.lib.mappings.mapping_data module

+
+
+

seed.lib.mappings.test_mapper module

+
+
+

seed.lib.mappings.test_mapping_columns module

+
+
+

seed.lib.mappings.test_mapping_data module

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.lib.merging.html b/docs/code_documentation/3.2.0/modules/seed.lib.merging.html new file mode 100644 index 00000000..a2fa462e --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.lib.merging.html @@ -0,0 +1,228 @@ + + + + + + + seed.lib.merging package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

seed.lib.merging package

+
+

Submodules

+
+
+

seed.lib.merging.merging module

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

:author Dan Gunter <dkgunter@lbl.gov>

+
+
+seed.lib.merging.merging.get_attrs_with_mapping(data_set_buildings, mapping)
+

Returns a dictionary of attributes from each data_set_building.

+
+
Parameters:
+
    +
  • data_set_buildings – list, instances to merge.

  • +
  • mapping

  • +
+
+
Returns:
+

dict: possible attributes keyed on attr name.

+
+
+
+ +
+
+seed.lib.merging.merging.get_propertystate_attrs(data_set_buildings)
+
+ +
+
+seed.lib.merging.merging.get_state_attrs(state_list)
+

Return a list of state attributes. This does not include any of the extra data columns

+
+ +
+
+seed.lib.merging.merging.get_state_to_state_tuple(inventory)
+

Return the list of the database fields based on the inventory type

+
+ +
+
+seed.lib.merging.merging.get_taxlotstate_attrs(data_set_buildings)
+
+ +
+
+seed.lib.merging.merging.merge_state(merged_state, state1, state2, priorities, ignore_merge_protection=False)
+

Set attributes on our Canonical model, saving differences.

+
+
Parameters:
+
    +
  • merged_state – PropertyState/TaxLotState model inst.

  • +
  • state1 – PropertyState/TaxLotState model inst. Left parent.

  • +
  • state2 – PropertyState/TaxLotState model inst. Right parent.

  • +
  • priorities – dict, column names with favor new or existing

  • +
+
+
Returns:
+

inst(merged_state), updated.

+
+
+
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.management.html b/docs/code_documentation/3.2.0/modules/seed.management.html new file mode 100644 index 00000000..1d51f685 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.management.html @@ -0,0 +1,176 @@ + + + + + + + Management Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Management Package

+
+

Subpackages

+
+
+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.managers.html b/docs/code_documentation/3.2.0/modules/seed.managers.html new file mode 100644 index 00000000..38525fe1 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.managers.html @@ -0,0 +1,174 @@ + + + + + + + Managers Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Managers Package

+
+

Subpackages

+ +
+
+

Submodules

+
+
+

JSON

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.managers.tests.html b/docs/code_documentation/3.2.0/modules/seed.managers.tests.html new file mode 100644 index 00000000..e7d5f68a --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.managers.tests.html @@ -0,0 +1,162 @@ + + + + + + + Manager Tests Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Manager Tests Package

+
+

Submodules

+
+
+

Test JSON Manager

+
+
+

Module contents

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.mappings.html b/docs/code_documentation/3.2.0/modules/seed.mappings.html new file mode 100644 index 00000000..d48b42bb --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.mappings.html @@ -0,0 +1,183 @@ + + + + + + + Mapping Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.models.html b/docs/code_documentation/3.2.0/modules/seed.models.html new file mode 100644 index 00000000..8fdd94e5 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.models.html @@ -0,0 +1,4741 @@ + + + + + + + Models — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Models

+
+

Submodules

+
+
+

AuditLog

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+

Columns

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.columns.Column(*args, **kwargs)
+

Bases: Model

+

The name of a column for a given organization.

+
+
+COLUMN_EXCLUDE_FIELDS = ['bounding_box', 'centroid', 'created', 'data_state', 'derived_data', 'extra_data', 'geocoding_confidence', 'id', 'import_file', 'long_lat', 'merge_state', 'raw_access_level_instance_error', 'raw_access_level_instance_id', 'source_type', 'updated', 'hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+COLUMN_MERGE_FAVOR_EXISTING = 1
+
+ +
+
+COLUMN_MERGE_FAVOR_NEW = 0
+
+ +
+
+COLUMN_MERGE_PROTECTION = [(0, 'Favor New'), (1, 'Favor Existing')]
+
+ +
+
+DATABASE_COLUMNS = [{'column_description': 'PM Property ID', 'column_name': 'pm_property_id', 'data_type': 'string', 'display_name': 'PM Property ID', 'table_name': 'PropertyState'}, {'column_description': 'PM Parent Property ID', 'column_name': 'pm_parent_property_id', 'data_type': 'string', 'display_name': 'PM Parent Property ID', 'table_name': 'PropertyState'}, {'column_description': 'Jurisdiction Tax Lot ID', 'column_name': 'jurisdiction_tax_lot_id', 'data_type': 'string', 'display_name': 'Jurisdiction Tax Lot ID', 'table_name': 'TaxLotState'}, {'column_description': 'Jurisdiction Property ID', 'column_name': 'jurisdiction_property_id', 'data_type': 'string', 'display_name': 'Jurisdiction Property ID', 'table_name': 'PropertyState'}, {'column_description': 'UBID', 'column_name': 'ubid', 'data_type': 'string', 'display_name': 'UBID', 'table_name': 'TaxLotState'}, {'column_description': 'UBID', 'column_name': 'ubid', 'data_type': 'string', 'display_name': 'UBID', 'table_name': 'PropertyState'}, {'column_description': 'Custom ID 1', 'column_name': 'custom_id_1', 'data_type': 'string', 'display_name': 'Custom ID 1', 'table_name': 'PropertyState'}, {'column_description': 'Custom ID 1', 'column_name': 'custom_id_1', 'data_type': 'string', 'display_name': 'Custom ID 1', 'table_name': 'TaxLotState'}, {'column_description': 'Audit Template Building ID', 'column_name': 'audit_template_building_id', 'data_type': 'string', 'display_name': 'Audit Template Building ID', 'table_name': 'PropertyState'}, {'column_description': 'Address Line 1', 'column_name': 'address_line_1', 'data_type': 'string', 'display_name': 'Address Line 1', 'table_name': 'PropertyState'}, {'column_description': 'Address Line 1', 'column_name': 'address_line_1', 'data_type': 'string', 'display_name': 'Address Line 1', 'table_name': 'TaxLotState'}, {'column_description': 'Address Line 2', 'column_name': 'address_line_2', 'data_type': 'string', 'display_name': 'Address Line 2', 'table_name': 'PropertyState'}, {'column_description': 'Address Line 2', 'column_name': 'address_line_2', 'data_type': 'string', 'display_name': 'Address Line 2', 'table_name': 'TaxLotState'}, {'column_description': 'City', 'column_name': 'city', 'data_type': 'string', 'display_name': 'City', 'table_name': 'PropertyState'}, {'column_description': 'City', 'column_name': 'city', 'data_type': 'string', 'display_name': 'City', 'table_name': 'TaxLotState'}, {'column_description': 'State', 'column_name': 'state', 'data_type': 'string', 'display_name': 'State', 'table_name': 'PropertyState'}, {'column_description': 'State', 'column_name': 'state', 'data_type': 'string', 'display_name': 'State', 'table_name': 'TaxLotState'}, {'column_description': 'Normalized Address', 'column_name': 'normalized_address', 'data_type': 'string', 'display_name': 'Normalized Address', 'table_name': 'PropertyState'}, {'column_description': 'Normalized Address', 'column_name': 'normalized_address', 'data_type': 'string', 'display_name': 'Normalized Address', 'table_name': 'TaxLotState'}, {'column_description': 'Postal Code', 'column_name': 'postal_code', 'data_type': 'string', 'display_name': 'Postal Code', 'table_name': 'PropertyState'}, {'column_description': 'Postal Code', 'column_name': 'postal_code', 'data_type': 'string', 'display_name': 'Postal Code', 'table_name': 'TaxLotState'}, {'column_description': 'Associated Tax Lot ID', 'column_name': 'lot_number', 'data_type': 'string', 'display_name': 'Associated Tax Lot ID', 'table_name': 'PropertyState'}, {'column_description': 'Property Name', 'column_name': 'property_name', 'data_type': 'string', 'display_name': 'Property Name', 'table_name': 'PropertyState'}, {'column_description': 'Latitude', 'column_name': 'latitude', 'data_type': 'number', 'display_name': 'Latitude', 'table_name': 'PropertyState'}, {'column_description': 'Longitude', 'column_name': 'longitude', 'data_type': 'number', 'display_name': 'Longitude', 'table_name': 'PropertyState'}, {'column_description': 'Latitude', 'column_name': 'latitude', 'data_type': 'number', 'display_name': 'Latitude', 'table_name': 'TaxLotState'}, {'column_description': 'Longitude', 'column_name': 'longitude', 'data_type': 'number', 'display_name': 'Longitude', 'table_name': 'TaxLotState'}, {'column_description': 'Geocoding Confidence', 'column_name': 'geocoding_confidence', 'data_type': 'string', 'display_name': 'Geocoding Confidence', 'table_name': 'PropertyState'}, {'column_description': 'Geocoding Confidence', 'column_name': 'geocoding_confidence', 'data_type': 'string', 'display_name': 'Geocoding Confidence', 'table_name': 'TaxLotState'}, {'column_description': 'Property Footprint', 'column_name': 'property_footprint', 'data_type': 'geometry', 'display_name': 'Property Footprint', 'table_name': 'PropertyState'}, {'column_description': 'Tax Lot Footprint', 'column_name': 'taxlot_footprint', 'data_type': 'geometry', 'display_name': 'Tax Lot Footprint', 'table_name': 'TaxLotState'}, {'column_description': 'Updated', 'column_name': 'updated', 'data_type': 'datetime', 'display_name': 'Updated', 'table_name': 'PropertyState'}, {'column_description': 'Created', 'column_name': 'created', 'data_type': 'datetime', 'display_name': 'Created', 'table_name': 'PropertyState'}, {'column_description': 'Updated', 'column_name': 'updated', 'data_type': 'datetime', 'display_name': 'Updated', 'table_name': 'TaxLotState'}, {'column_description': 'Created', 'column_name': 'created', 'data_type': 'datetime', 'display_name': 'Created', 'table_name': 'TaxLotState'}, {'column_description': 'Gross Floor Area', 'column_name': 'gross_floor_area', 'data_type': 'area', 'display_name': 'Gross Floor Area', 'table_name': 'PropertyState'}, {'column_description': 'Use Description', 'column_name': 'use_description', 'data_type': 'string', 'display_name': 'Use Description', 'table_name': 'PropertyState'}, {'column_description': 'ENERGY STAR Score', 'column_name': 'energy_score', 'data_type': 'integer', 'display_name': 'ENERGY STAR Score', 'table_name': 'PropertyState'}, {'column_description': 'Property Notes', 'column_name': 'property_notes', 'data_type': 'string', 'display_name': 'Property Notes', 'table_name': 'PropertyState'}, {'column_description': 'Property Type', 'column_name': 'property_type', 'data_type': 'string', 'display_name': 'Property Type', 'table_name': 'PropertyState'}, {'column_description': 'Year Ending', 'column_name': 'year_ending', 'data_type': 'date', 'display_name': 'Year Ending', 'table_name': 'PropertyState'}, {'column_description': 'Owner', 'column_name': 'owner', 'data_type': 'string', 'display_name': 'Owner', 'table_name': 'PropertyState'}, {'column_description': 'Owner Email', 'column_name': 'owner_email', 'data_type': 'string', 'display_name': 'Owner Email', 'table_name': 'PropertyState'}, {'column_description': 'Owner Telephone', 'column_name': 'owner_telephone', 'data_type': 'string', 'display_name': 'Owner Telephone', 'table_name': 'PropertyState'}, {'column_description': 'Building Count', 'column_name': 'building_count', 'data_type': 'integer', 'display_name': 'Building Count', 'table_name': 'PropertyState'}, {'column_description': 'Year Built', 'column_name': 'year_built', 'data_type': 'integer', 'display_name': 'Year Built', 'table_name': 'PropertyState'}, {'column_description': 'Recent Sale Date', 'column_name': 'recent_sale_date', 'data_type': 'datetime', 'display_name': 'Recent Sale Date', 'table_name': 'PropertyState'}, {'column_description': 'Conditioned Floor Area', 'column_name': 'conditioned_floor_area', 'data_type': 'area', 'display_name': 'Conditioned Floor Area', 'table_name': 'PropertyState'}, {'column_description': 'Occupied Floor Area', 'column_name': 'occupied_floor_area', 'data_type': 'area', 'display_name': 'Occupied Floor Area', 'table_name': 'PropertyState'}, {'column_description': 'Owner Address', 'column_name': 'owner_address', 'data_type': 'string', 'display_name': 'Owner Address', 'table_name': 'PropertyState'}, {'column_description': 'Owner City/State', 'column_name': 'owner_city_state', 'data_type': 'string', 'display_name': 'Owner City/State', 'table_name': 'PropertyState'}, {'column_description': 'Owner Postal Code', 'column_name': 'owner_postal_code', 'data_type': 'string', 'display_name': 'Owner Postal Code', 'table_name': 'PropertyState'}, {'column_description': 'Home Energy Score ID', 'column_name': 'home_energy_score_id', 'data_type': 'string', 'display_name': 'Home Energy Score ID', 'table_name': 'PropertyState'}, {'column_description': 'PM Generation Date', 'column_name': 'generation_date', 'data_type': 'datetime', 'display_name': 'PM Generation Date', 'table_name': 'PropertyState'}, {'column_description': 'PM Release Date', 'column_name': 'release_date', 'data_type': 'datetime', 'display_name': 'PM Release Date', 'table_name': 'PropertyState'}, {'column_description': 'Site EUI', 'column_name': 'site_eui', 'data_type': 'eui', 'display_name': 'Site EUI', 'table_name': 'PropertyState'}, {'column_description': 'Site EUI Weather Normalized', 'column_name': 'site_eui_weather_normalized', 'data_type': 'eui', 'display_name': 'Site EUI Weather Normalized', 'table_name': 'PropertyState'}, {'column_description': 'Site EUI Modeled', 'column_name': 'site_eui_modeled', 'data_type': 'eui', 'display_name': 'Site EUI Modeled', 'table_name': 'PropertyState'}, {'column_description': 'Source EUI', 'column_name': 'source_eui', 'data_type': 'eui', 'display_name': 'Source EUI', 'table_name': 'PropertyState'}, {'column_description': 'Source EUI Weather Normalized', 'column_name': 'source_eui_weather_normalized', 'data_type': 'eui', 'display_name': 'Source EUI Weather Normalized', 'table_name': 'PropertyState'}, {'column_description': 'Source EUI Modeled', 'column_name': 'source_eui_modeled', 'data_type': 'eui', 'display_name': 'Source EUI Modeled', 'table_name': 'PropertyState'}, {'column_description': 'Energy Alerts', 'column_name': 'energy_alerts', 'data_type': 'string', 'display_name': 'Energy Alerts', 'table_name': 'PropertyState'}, {'column_description': 'Space Alerts', 'column_name': 'space_alerts', 'data_type': 'string', 'display_name': 'Space Alerts', 'table_name': 'PropertyState'}, {'column_description': 'Building Certification', 'column_name': 'building_certification', 'data_type': 'string', 'display_name': 'Building Certification', 'table_name': 'PropertyState'}, {'column_description': 'Number Properties', 'column_name': 'number_properties', 'data_type': 'integer', 'display_name': 'Number Properties', 'table_name': 'TaxLotState'}, {'column_description': 'Block Number', 'column_name': 'block_number', 'data_type': 'string', 'display_name': 'Block Number', 'table_name': 'TaxLotState'}, {'column_description': 'District', 'column_name': 'district', 'data_type': 'string', 'display_name': 'District', 'table_name': 'TaxLotState'}, {'column_description': 'eGRID Subregion Code', 'column_name': 'egrid_subregion_code', 'data_type': 'string', 'display_name': 'eGRID Subregion Code', 'table_name': 'PropertyState'}, {'column_description': 'Total GHG Emissions', 'column_name': 'total_ghg_emissions', 'data_type': 'ghg', 'display_name': 'Total GHG Emissions', 'table_name': 'PropertyState'}, {'column_description': 'Total Marginal GHG Emissions', 'column_name': 'total_marginal_ghg_emissions', 'data_type': 'ghg', 'display_name': 'Total Marginal GHG Emissions', 'table_name': 'PropertyState'}, {'column_description': 'Total GHG Emissions Intensity', 'column_name': 'total_ghg_emissions_intensity', 'data_type': 'ghg_intensity', 'display_name': 'Total GHG Emissions Intensity', 'table_name': 'PropertyState'}, {'column_description': 'Total Marginal GHG Emissions Intensity', 'column_name': 'total_marginal_ghg_emissions_intensity', 'data_type': 'ghg_intensity', 'display_name': 'Total Marginal GHG Emissions Intensity', 'table_name': 'PropertyState'}, {'column_description': 'Time zone of the property', 'column_name': 'property_timezone', 'data_type': 'string', 'display_name': 'Property Time Zone', 'table_name': 'PropertyState'}, {'column_description': 'Water Use (All Water Sources)', 'column_name': 'water_use', 'data_type': 'water_use', 'display_name': 'Water Use', 'table_name': 'PropertyState'}, {'column_description': 'Indoor Water Use (All Water Sources)', 'column_name': 'indoor_water_use', 'data_type': 'water_use', 'display_name': 'Indoor Water Use', 'table_name': 'PropertyState'}, {'column_description': 'Outdoor Water Use (All Water Sources)', 'column_name': 'outdoor_water_use', 'data_type': 'water_use', 'display_name': 'Outdoor Water Use', 'table_name': 'PropertyState'}, {'column_description': 'Water Use Intensity (All Water Sources)', 'column_name': 'wui', 'data_type': 'wui', 'display_name': 'WUI', 'table_name': 'PropertyState'}, {'column_description': 'Indoor Water Use Intensity (All Water Sources)', 'column_name': 'indoor_wui', 'data_type': 'wui', 'display_name': 'Indoor WUI', 'table_name': 'PropertyState'}]
+
+ +
+
+DATA_TYPE_PARSERS: dict[str, Callable] = {'area': <function Column.<lambda>>, 'boolean': <function Column.<lambda>>, 'date': <function Column.<lambda>>, 'datetime': <built-in method fromisoformat of type object>, 'eui': <function Column.<lambda>>, 'float': <function Column.<lambda>>, 'geometry': <class 'str'>, 'ghg': <function Column.<lambda>>, 'ghg_intensity': <function Column.<lambda>>, 'integer': <function Column.<lambda>>, 'number': <function Column.<lambda>>, 'string': <class 'str'>, 'water_use': <function Column.<lambda>>, 'wui': <function Column.<lambda>>}
+
+ +
+
+DB_TYPES = {'area': 'float', 'boolean': 'boolean', 'date': 'date', 'datetime': 'datetime', 'eui': 'float', 'float': 'float', 'geometry': 'geometry', 'ghg': 'float', 'ghg_intensity': 'float', 'integer': 'integer', 'number': 'float', 'string': 'string', 'water_use': 'float', 'wui': 'float'}
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+EXCLUDED_COLUMN_RETURN_FIELDS = ['hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+EXCLUDED_MAPPING_FIELDS = ['created', 'extra_data', 'lot_number', 'normalized_address', 'geocoded_address', 'geocoded_postal_code', 'geocoded_side_of_street', 'geocoded_country', 'geocoded_state', 'geocoded_county', 'geocoded_city', 'geocoded_neighborhood', 'updated']
+
+ +
+
+EXCLUDED_RENAME_FROM_FIELDS = ['lot_number', 'year_built', 'property_footprint', 'taxlot_footprint', 'bounding_box', 'centroid', 'created', 'data_state', 'derived_data', 'extra_data', 'geocoding_confidence', 'id', 'import_file', 'long_lat', 'merge_state', 'raw_access_level_instance_error', 'raw_access_level_instance_id', 'source_type', 'updated', 'hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+EXCLUDED_RENAME_TO_FIELDS = ['lot_number', 'latitude', 'longitude', 'year_built', 'property_footprint', 'created', 'updated', 'bounding_box', 'centroid', 'created', 'data_state', 'derived_data', 'extra_data', 'geocoding_confidence', 'id', 'import_file', 'long_lat', 'merge_state', 'raw_access_level_instance_error', 'raw_access_level_instance_id', 'source_type', 'updated', 'hash_object', 'normalized_address', 'source_eui_modeled_orig', 'site_eui_orig', 'occupied_floor_area_orig', 'site_eui_weather_normalized_orig', 'site_eui_modeled_orig', 'source_eui_orig', 'gross_floor_area_orig', 'conditioned_floor_area_orig', 'source_eui_weather_normalized_orig']
+
+ +
+
+INTERNAL_TYPE_TO_DATA_TYPE = {'BooleanField': 'boolean', 'CharField': 'string', 'DateField': 'date', 'DateTimeField': 'datetime', 'FloatField': 'double', 'IntegerField': 'integer', 'JSONField': 'string', 'PointField': 'geometry', 'PolygonField': 'geometry', 'TextField': 'string'}
+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+PINNED_COLUMNS = [('PropertyState', 'pm_property_id'), ('TaxLotState', 'jurisdiction_tax_lot_id')]
+
+ +
+
+QUANTITY_UNIT_COLUMNS = [('PropertyState', 'gross_floor_area'), ('PropertyState', 'occupied_floor_area'), ('PropertyState', 'conditioned_floor_area'), ('PropertyState', 'site_eui'), ('PropertyState', 'site_eui_modeled'), ('PropertyState', 'site_eui_weather_normalized'), ('PropertyState', 'source_eui'), ('PropertyState', 'source_eui_modeled'), ('PropertyState', 'source_eui_weather_normalized'), ('PropertyState', 'total_ghg_emissions'), ('PropertyState', 'total_marginal_ghg_emissions'), ('PropertyState', 'total_ghg_emissions_intensity'), ('PropertyState', 'total_marginal_ghg_emissions_intensity'), ('PropertyState', 'water_use'), ('PropertyState', 'indoor_water_use'), ('PropertyState', 'outdoor_water_use'), ('PropertyState', 'wui'), ('PropertyState', 'indoor_wui')]
+
+ +
+
+SHARED_FIELD_TYPES = ((0, 'None'), (1, 'Public'))
+
+ +
+
+SHARED_NONE = 0
+
+ +
+
+SHARED_PUBLIC = 1
+
+ +
+
+UNMAPPABLE_PROPERTY_FIELDS = ['created', 'geocoding_confidence', 'lot_number', 'updated']
+
+ +
+
+UNMAPPABLE_TAXLOT_FIELDS = ['created', 'geocoding_confidence', 'updated']
+
+ +
+
+account_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+actual_emission_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+actual_energy_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+benchmark_id_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+cast(value: Any) Any
+

Cast the value to the correct type for the column.

+
+
Args:

value (Any): Value to cast, typically a string.

+
+
+
+ +
+
+static cast_column_value(column_data_type: str, value: Any, allow_none: bool = True) Any
+

cast a single value from the column data type

+
+
Args:

column_data_type (str): The data type as defined in the column object +value (Any): value to cast. Note the value may already be cast correctly.

+
+
Raises:

Exception: CastException if the value cannot be cast to the correct type

+
+
Returns:

Any: Resulting casted value

+
+
+
+ +
+
+clean()
+

Hook for doing any extra model-wide validation after clean() has been +called on every field by self.clean_fields. Any ValidationError raised +by this method will not be associated with a particular field; it will +have a special-case association with the field defined by NON_FIELD_ERRORS.

+
+ +
+
+column_description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+column_list_profiles
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+column_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+columnlistprofilecolumn_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+comstock_mapping
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+contact_email_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+contact_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+static create_mappings(mappings, organization, user, import_file_id=None)
+

Create the mappings for an organization and a user based on a simple +array of array object.

+
+
Parameters:
+
    +
  • mappings – dict, dictionary containing mapping information

  • +
  • organization – inst, organization object

  • +
  • user – inst, User object

  • +
  • import_file_id – integer, If passed, will cache the column mappings data into the +import_file_id object.

  • +
+
+
+

:return Boolean, True is data are saved in the ColumnMapping table in the database

+
+ +
+
+static create_mappings_from_file(filename, organization, user, import_file_id=None)
+

Load the mappings in from a file in a very specific file format. The columns in the file +must be:

+
+
    +
  1. raw field

  2. +
  3. table name

  4. +
  5. field name

  6. +
  7. field display name

  8. +
  9. field data type

  10. +
  11. field unit type

  12. +
+
+
+
Parameters:
+
    +
  • filename – string, absolute path and name of file to load

  • +
  • organization – id, organization id

  • +
  • user – id, user id

  • +
  • import_file_id – Integer, If passed, will cache the column mappings data into +the import_file_id object.

  • +
+
+
Returns:
+

ColumnMapping, True

+
+
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_admin_account_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+data_admin_email_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+data_admin_name_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+data_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+dataviewparameter_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+static delete_all(organization)
+

Delete all the columns for an organization. Note that this will invalidate all the +data that is in the extra_data fields of the inventory and is irreversible.

+
+
Parameters:
+

organization – instance, Organization

+
+
Returns:
+

[int, int] Number of columns, column_mappings records that were deleted

+
+
+
+ +
+
+derived_column
+

Accessor to the related object on the forward side of a one-to-one relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Restaurant.place is a ForwardOneToOneDescriptor instance.

+
+ +
+
+derived_column_id
+
+ +
+
+derivedcolumn_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+derivedcolumnparameter_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+display_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+geocoding_order
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_merge_protection_display(*, field=<django.db.models.fields.IntegerField: merge_protection>)
+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_modified(*, field=<django.db.models.fields.DateTimeField: modified>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_modified(*, field=<django.db.models.fields.DateTimeField: modified>, is_next=False, **kwargs)
+
+ +
+
+get_shared_field_type_display(*, field=<django.db.models.fields.IntegerField: shared_field_type>)
+
+ +
+
+goal_area_columns
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+goal_eui_column1s
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+goal_eui_column2s
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+goal_eui_column3s
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_file
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+import_file_id
+
+ +
+
+is_excluded_from_hash
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+is_extra_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+is_matching_criteria
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+is_option_for_reports_x_axis
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+is_option_for_reports_y_axis
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+is_updating
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+mapped_mappings
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+merge_protection
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+modified
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+raw_mappings
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+recognize_empty
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+rename_column(new_column_name, force=False)
+

Rename the column and move all the data to the new column. This can move the +data from a canonical field to an extra data field or vice versa. By default the +column.

+
+
Parameters:
+
    +
  • new_column_name – string new name of column

  • +
  • force – boolean force the overwrite of data in the column?

  • +
+
+
Returns:
+

+
+
+
+ +
+
+static retrieve_all(org_id: int, inventory_type: Literal['property', 'taxlot'] | None = None, only_used: bool = False, include_related: bool = True, exclude_derived: bool = False, column_ids: list[int] | None = None) list[dict]
+

Retrieve all the columns for an organization. This method will query for all the columns in the +database assigned to the organization. It will then go through and cleanup the names to ensure that +there are no duplicates. The name column is used for uniquely labeling the columns for UI Grid purposes.

+
+
Parameters:
+
    +
  • org_id – Organization ID

  • +
  • inventory_type – Inventory Type (property|taxlot) from the requester. This sets the related columns if requested.

  • +
  • only_used – View only the used columns that exist in the Column’s table

  • +
  • include_related – Include related columns (e.g., if inventory type is Property, include Taxlot columns)

  • +
  • exclude_derived – Exclude derived columns.

  • +
  • column_ids – List of Column ids.

  • +
+
+
+
+ +
+
+static retrieve_all_by_tuple(org_id)
+

Return list of all columns for an organization as a tuple.

+
[
+    ("PropertyState", "address_line_1"),
+    ("PropertyState", "address_line_2"),
+    ("PropertyState", "building_certification"),
+    ("PropertyState", "building_count"),
+    ("TaxLotState", "address_line_1"),
+    ("TaxLotState", "address_line_2"),
+    ("TaxLotState", "block_number"),
+    ("TaxLotState", "city"),
+    ("TaxLotState", "jurisdiction_tax_lot_id"),
+]
+
+
+
+
Parameters:
+

org_id – int, Organization ID

+
+
Returns:
+

list of tuples

+
+
+
+ +
+
+static retrieve_db_field_name_for_hash_comparison(inventory_type, organization_id)
+

Names only of the columns in the database (fields only, not extra data), independent of inventory type. +These fields are used for generating an MD5 hash to quickly check if the data are the same across +multiple records. Note that this ignores extra_data. The result is a superset of all the fields that are used +in the database across all of the inventory types of interest.

+
+
Returns:
+

list, names of columns, independent of inventory type.

+
+
+
+ +
+
+static retrieve_db_field_table_and_names_from_db_tables()
+

Similar to keys, except it returns a list of tuples of the columns that are in the database

+
[
+    ("PropertyState", "address_line_1"),
+    ("PropertyState", "address_line_2"),
+    ("PropertyState", "building_certification"),
+    ("PropertyState", "building_count"),
+    ("TaxLotState", "address_line_1"),
+    ("TaxLotState", "address_line_2"),
+    ("TaxLotState", "block_number"),
+    ("TaxLotState", "city"),
+    ("TaxLotState", "jurisdiction_tax_lot_id"),
+]
+
+
+

:return:list of tuples

+
+ +
+
+static retrieve_db_fields(org_id)
+

return the fields in the database regardless of properties or taxlots. For example, there is an address_line_1 +in both the TaxLotState and the PropertyState. The command below will take the set to remove the duplicates.

+

[ “address_line_1”, “gross_floor_area”, … ] +:param org_id: int, Organization ID +:return: list

+
+ +
+
+static retrieve_db_fields_from_db_tables()
+

Return the list of database fields that are in the models. This is independent of what are in the +Columns table.

+
+
Returns:
+

+
+
+
+ +
+
+static retrieve_db_types()
+

Return the data types for the database columns in the format of:

+
{
+  "field_name": "data_type",
+  "field_name_2": "data_type_2",
+  "address_line_1": "string",
+}
+
+
+
+
Returns:
+

dict

+
+
+
+ +
+
+static retrieve_mapping_columns(org_id, inventory_type=None)
+

Retrieve all the columns that are for mapping for an organization in a dictionary.

+
+
Parameters:
+
    +
  • org_id – org_id, Organization ID

  • +
  • inventory_type – Inventory Type (property|taxlot) from the requester. This sets the related columns if requested.

  • +
+
+
Returns:
+

list, list of dict

+
+
+
+ +
+
+static retrieve_priorities(org_id)
+

Return the list of priorities for the columns. Result will be in the form of:

+
{
+    'PropertyState': {
+        'lot_number': 'Favor New',
+        'owner_address': 'Favor New',
+        'extra_data': {
+            'data_007': 'Favor New'
+        }
+    'TaxLotState': {
+        'custom_id_1': 'Favor New',
+        'block_number': 'Favor New',
+        'extra_data': {
+            'data_008': 'Favor New'
+        }
+}
+
+
+
+
Parameters:
+

org_id – organization with the columns

+
+
Returns:
+

dict

+
+
+
+ +
+
+salesforce_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+save(*args, **kwargs)
+

Save the current instance. Override this in a subclass if you want to +control the saving process.

+

The ‘force_insert’ and ‘force_update’ parameters can be used to insist +that the “save” must be an SQL insert or update (or equivalent for +non-SQL backends), respectively. Normally, they should not be set.

+
+ +
+
+static save_column_names(model_obj)
+

Save unique column names for extra_data in this organization.

+

This is a record of all the extra_data keys we have ever seen +for a particular organization.

+
+
Parameters:
+

model_obj – model_obj instance (either PropertyState or TaxLotState).

+
+
+
+ +
+
+shared_field_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+table_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+target_emission_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+target_energy_column
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+unit
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+unit_id
+
+ +
+
+units_pint
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+x_axis_columns
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+exception seed.models.columns.ColumnCastError
+

Bases: Exception

+
+ +
+
+seed.models.columns.validate_model(sender, **kwargs)
+
+ +
+
+

Cycles

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.cycles.Cycle(id, organization, user, name, start, end, created)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+analysispropertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+cycles
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+dataview_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+end
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+event_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_end(*, field=<django.db.models.fields.DateField: end>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_start(*, field=<django.db.models.fields.DateField: start>, is_next=True, **kwargs)
+
+ +
+
+classmethod get_or_create_default(organization)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_end(*, field=<django.db.models.fields.DateField: end>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_start(*, field=<django.db.models.fields.DateField: start>, is_next=False, **kwargs)
+
+ +
+
+goal_baseline_cycles
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+goal_current_cycles
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+importfile_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+propertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+start
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+taxlotproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+user
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+user_id
+
+ +
+ +
+
+

Joins

+
+
+

Generic Models

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.models.StatusLabel(id, created, modified, name, color, super_organization, show_in_list)
+

Bases: TimeStampedModel

+
+
+BLUE_CHOICE = 'blue'
+
+ +
+
+COLOR_CHOICES = (('red', 'red'), ('blue', 'blue'), ('light blue', 'light blue'), ('green', 'green'), ('white', 'white'), ('orange', 'orange'), ('gray', 'gray'))
+
+ +
+
+DEFAULT_LABELS = ['Residential', 'Non-Residential', 'Violation', 'Compliant', 'Missing Data', 'Questionable Report', 'Update Bldg Info', 'Call', 'Email', 'Exempted', 'Extension', 'Change of Ownership', 'High EUI', 'Low EUI', 'High EUI % Change', 'Low EUI % Change', 'High Area', 'Low Area', 'High Area % Change', 'Low Area % Change']
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+GRAY_CHOICE = 'gray'
+
+ +
+
+GREEN_CHOICE = 'green'
+
+ +
+
+LIGHT_BLUE_CHOICE = 'light blue'
+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+ORANGE_CHOICE = 'orange'
+
+ +
+
+RED_CHOICE = 'red'
+
+ +
+
+WHITE_CHOICE = 'white'
+
+ +
+
+and_filter_groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+color
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+compliance_label
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+exclude_filter_groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_color_display(*, field=<django.db.models.fields.CharField: color>)
+
+ +
+
+get_next_by_created(*, field=<django_extensions.db.fields.CreationDateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_modified(*, field=<django_extensions.db.fields.ModificationDateTimeField: modified>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django_extensions.db.fields.CreationDateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_modified(*, field=<django_extensions.db.fields.ModificationDateTimeField: modified>, is_next=False, **kwargs)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+indication_label
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+or_filter_groups
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyview_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyviewlabel_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+rule_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+show_in_list
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+super_organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+super_organization_id
+
+ +
+
+taxlotview_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+to_dict()
+
+ +
+
+violation_label
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.models.Unit(*args, **kwargs)
+

Bases: Model

+

Unit of measure for a Column Value.

+
+
+DATE = 4
+
+ +
+
+DATETIME = 5
+
+ +
+
+DECIMAL = 2
+
+ +
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+FLOAT = 3
+
+ +
+
+INTEGER = 6
+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+STRING = 1
+
+ +
+
+UNIT_TYPES = ((1, 'String'), (6, 'Integer'), (3, 'Float'), (4, 'Date'), (5, 'Datetime'))
+
+ +
+
+column_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_unit_type_display(*, field=<django.db.models.fields.IntegerField: unit_type>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+unit_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+unit_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+

Properties

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.properties.Property(*args, **kwargs)
+

Bases: Model

+

The Property is the parent property that ties together all the views of the property. +For example, if a building has multiple changes overtime, then this Property will always +remain the same. The PropertyView will point to the unchanged property as the PropertyState +and Property view are updated.

+

The property can also reference a parent property.

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+access_level_instance
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+access_level_instance_id
+
+ +
+
+analysispropertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+copy_meters(source_property_id, source_persists=True)
+

Copies meters from a source Property to the current Property.

+

It’s most efficient if the persistence of the source Property’s readings +aren’t needed as bulk reassignments can then be used.

+

The cases and logic are described in comments throughout.

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_loggers
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+elements
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+events
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+goalnote_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+historical_note
+

Accessor to the related object on the reverse side of a one-to-one +relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Place.restaurant is a ReverseOneToOneDescriptor instance.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+inventory_documents
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+meters
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+parent_property
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_property_id
+
+ +
+
+property_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+views
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.properties.PropertyAuditLog(id, organization, parent1, parent2, parent_state1, parent_state2, state, view, name, description, import_filename, record_type, created)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_record_type_display(*, field=<django.db.models.fields.IntegerField: record_type>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_filename
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+parent1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent1_id
+
+ +
+
+parent2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent2_id
+
+ +
+
+parent_state1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state1_id
+
+ +
+
+parent_state2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state2_id
+
+ +
+
+propertyauditlog_parent1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyauditlog_parent2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+record_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+view
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+view_id
+
+ +
+ +
+
+class seed.models.properties.PropertyState(*args, **kwargs)
+

Bases: Model

+

Store a single property. This contains all the state information about the property

+

For property_timezone, use the pytz timezone strings. The US has the following and a full +list can be created by calling pytz.all_timezones in Python:

+
+
    +
  • US/Alaska

  • +
  • US/Aleutian

  • +
  • US/Arizona

  • +
  • US/Central

  • +
  • US/East-Indiana

  • +
  • US/Eastern

  • +
  • US/Hawaii

  • +
  • US/Indiana-Starke

  • +
  • US/Michigan

  • +
  • US/Mountain

  • +
  • US/Pacific

  • +
  • US/Samoa

  • +
+
+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+address_line_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+address_line_2
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+analysispropertyview
+

Accessor to the related object on the reverse side of a one-to-one +relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Place.restaurant is a ReverseOneToOneDescriptor instance.

+
+ +
+
+audit_template_building_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+bounding_box
+
+ +
+
+building_certification
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+building_count
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+building_files
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+centroid
+
+ +
+
+city
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+clean()
+

Hook for doing any extra model-wide validation after clean() has been +called on every field by self.clean_fields. Any ValidationError raised +by this method will not be associated with a particular field; it will +have a special-case association with the field defined by NON_FIELD_ERRORS.

+
+ +
+
+conditioned_floor_area
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+conditioned_floor_area_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+classmethod coparent(state_id)
+

Return the coparent of the PropertyState. This will query the PropertyAuditLog table to +determine if there is a coparent and return it if it is found. The state_id needs to be +the base ID of when the original record was imported

+
+
Parameters:
+

state_id – integer, state id to find coparent.

+
+
Returns:
+

dict

+
+
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+custom_id_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+derived_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+egrid_subregion_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+energy_alerts
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+energy_score
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+extra_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+generation_date
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+geocoding_confidence
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_data_state_display(*, field=<django.db.models.fields.IntegerField: data_state>)
+
+ +
+
+get_merge_state_display(*, field=<django.db.models.fields.IntegerField: merge_state>)
+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+get_source_type_display(*, field=<django.db.models.fields.IntegerField: source_type>)
+
+ +
+
+gross_floor_area
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+gross_floor_area_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+hash_object
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+history()
+

Return the history of the property state by parsing through the auditlog. Returns only the ids +of the parent states and some descriptions.

+
+

main +/ / parent1 parent2

+
+

In the records, parent2 is most recent, so make sure to navigate parent two first since we +are returning the data in reverse over (that is most recent changes first)

+
+
Returns:
+

list, history as a list, and the main record

+
+
+
+ +
+
+home_energy_score_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_file
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+import_file_id
+
+ +
+
+indoor_water_use
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+indoor_wui
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+jurisdiction_property_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+latitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+long_lat
+
+ +
+
+longitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+lot_number
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+measure_set
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+measures
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+classmethod merge_relationships(merged_state, state1, state2)
+

Merge together the old relationships with the new.

+
+
Parameters:
+
    +
  • merged_state – empty state to fill with merged state

  • +
  • state1*State

  • +
  • state2*State - given priority over state1

  • +
+
+
+
+ +
+
+merge_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+normalized_address
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+occupied_floor_area
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+occupied_floor_area_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+outdoor_water_use
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_address
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_city_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_email
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_postal_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+owner_telephone
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+parent_state1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+parent_state2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+pm_parent_property_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+pm_property_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+postal_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+promote(cycle, property_id=None)
+

Promote the PropertyState to the view table for the given cycle

+
+
Args:

cycle: Cycle to assign the view +property_id: Optional ID of a canonical property model object +to retain instead of creating a new property

+
+
Returns:

The resulting PropertyView (note that it is not returning the +PropertyState)

+
+
+
+ +
+
+property_footprint
+
+ +
+
+property_name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property_notes
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property_timezone
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+propertyauditlog_state
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertymeasure_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+raw_access_level_instance
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+raw_access_level_instance_error
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+raw_access_level_instance_id
+
+ +
+
+recent_sale_date
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+release_date
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+save(*args, **kwargs)
+

Save the current instance. Override this in a subclass if you want to +control the saving process.

+

The ‘force_insert’ and ‘force_update’ parameters can be used to insist +that the “save” must be an SQL insert or update (or equivalent for +non-SQL backends), respectively. Normally, they should not be set.

+
+ +
+
+scenarios
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+simulation
+

Accessor to the related object on the reverse side of a one-to-one +relation.

+

In the example:

+
class Restaurant(Model):
+    place = OneToOneField(Place, related_name='restaurant')
+
+
+

Place.restaurant is a ReverseOneToOneDescriptor instance.

+
+ +
+
+site_eui
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_modeled
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_modeled_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_weather_normalized
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+site_eui_weather_normalized_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_modeled
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_modeled_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_weather_normalized
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_eui_weather_normalized_orig
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+source_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+space_alerts
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+to_dict(fields=None, include_related_data=True)
+

Returns a dict version of the PropertyState, either with all fields +or masked to just those requested.

+
+ +
+
+total_ghg_emissions
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+total_ghg_emissions_intensity
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+total_marginal_ghg_emissions
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+total_marginal_ghg_emissions_intensity
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+ubid
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+ubidmodel_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+use_description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+water_use
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+wui
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+year_built
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+year_ending
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+class seed.models.properties.PropertyView(*args, **kwargs)
+

Bases: Model

+

Similar to the old world of canonical building.

+

A PropertyView contains a reference to a property (which should not change) and to a +cycle (time period), and a state (characteristics).

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+cycle
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+cycle_id
+
+ +
+
+gapauditlog_view
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+greenassessmentproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property import_filename
+

Get the import file name form the audit logs

+
+ +
+
+initialize_audit_logs(**kwargs)
+
+ +
+
+labels
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+notes
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+property
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+property_id
+
+ +
+
+propertyauditlog_view
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+propertyviewlabel_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+tax_lot_states()
+

Return a list of TaxLotStates associated with this PropertyView and Cycle

+
+
Returns:
+

list of TaxLotStates

+
+
+
+ +
+
+tax_lot_views()
+

Return a list of TaxLotViews that are associated with this PropertyView and Cycle

+
+
Returns:
+

list of TaxLotViews

+
+
+
+ +
+
+taxlotproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.properties.PropertyViewLabel(id, propertyview, statuslabel, goal)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+goal
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+goal_id
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+propertyview
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+propertyview_id
+
+ +
+
+statuslabel
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+statuslabel_id
+
+ +
+ +
+
+seed.models.properties.post_save_property(sender, instance, created, **kwargs)
+
+ +
+
+seed.models.properties.post_save_property_state(sender, **kwargs)
+

Generate UbidModels for a PropertyState if the ubid field is present

+
+ +
+
+seed.models.properties.post_save_property_view(sender, **kwargs)
+

When changing/saving the PropertyView, go ahead and touch the Property (if linked) so that the +record receives an updated datetime

+
+ +
+
+seed.models.properties.pre_delete_state(sender, **kwargs)
+
+ +
+
+seed.models.properties.set_default_access_level_instance(sender, instance, **kwargs)
+

If ALI not set, put this Property as the root.

+
+ +
+
+seed.models.properties.sync_latitude_longitude_and_long_lat(sender, instance, **kwargs)
+
+ +
+
+

TaxLots

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.models.tax_lots.TaxLot(id, organization, access_level_instance, created, updated)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+access_level_instance
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+access_level_instance_id
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+views
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+class seed.models.tax_lots.TaxLotAuditLog(id, organization, parent1, parent2, parent_state1, parent_state2, state, view, name, description, import_filename, record_type, created)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+description
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_record_type_display(*, field=<django.db.models.fields.IntegerField: record_type>)
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_filename
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+name
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+parent1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent1_id
+
+ +
+
+parent2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent2_id
+
+ +
+
+parent_state1
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state1_id
+
+ +
+
+parent_state2
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+parent_state2_id
+
+ +
+
+record_type
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+taxlotauditlog_parent1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotauditlog_parent2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+view
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+view_id
+
+ +
+ +
+
+class seed.models.tax_lots.TaxLotState(id, import_file, organization, data_state, merge_state, raw_access_level_instance, raw_access_level_instance_error, custom_id_1, jurisdiction_tax_lot_id, block_number, district, address_line_1, address_line_2, normalized_address, city, state, postal_code, number_properties, extra_data, derived_data, hash_object, latitude, longitude, long_lat, centroid, bounding_box, taxlot_footprint, ubid, geocoding_confidence, created, updated)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+address_line_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+address_line_2
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+block_number
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+bounding_box
+
+ +
+
+centroid
+
+ +
+
+city
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+classmethod coparent(state_id)
+

Return the coparent of the TaxLotState. This will query the TaxLotAuditLog table to +determine if there is a coparent and return it if it is found. The state_id needs to be +the base ID of when the original record was imported

+
+
Parameters:
+

state_id – integer, state id to find coparent.

+
+
Returns:
+

dict

+
+
+
+ +
+
+created
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+custom_id_1
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+data_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+derived_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+district
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+extra_data
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+geocoding_confidence
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+get_data_state_display(*, field=<django.db.models.fields.IntegerField: data_state>)
+
+ +
+
+get_merge_state_display(*, field=<django.db.models.fields.IntegerField: merge_state>)
+
+ +
+
+get_next_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=True, **kwargs)
+
+ +
+
+get_next_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=True, **kwargs)
+
+ +
+
+get_previous_by_created(*, field=<django.db.models.fields.DateTimeField: created>, is_next=False, **kwargs)
+
+ +
+
+get_previous_by_updated(*, field=<django.db.models.fields.DateTimeField: updated>, is_next=False, **kwargs)
+
+ +
+
+hash_object
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+history()
+

Return the history of the taxlot state by parsing through the auditlog. Returns only the ids +of the parent states and some descriptions.

+
+
+

main

+
+

/ / parent1 parent2

+
+

In the records, parent2 is most recent, so make sure to navigate parent two first since we +are returning the data in reverse over (that is most recent changes first)

+
+
Returns:
+

list, history as a list, and the main record

+
+
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+import_file
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+import_file_id
+
+ +
+
+jurisdiction_tax_lot_id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+latitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+long_lat
+
+ +
+
+longitude
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+classmethod merge_relationships(merged_state, state1, state2)
+

Stub to implement if merging TaxLotState relationships is needed

+
+ +
+
+merge_state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+normalized_address
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+number_properties
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+organization
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+organization_id
+
+ +
+
+postal_code
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+promote(cycle)
+

Promote the TaxLotState to the view table for the given cycle

+
+
Args:

cycle: Cycle to assign the view

+
+
Returns:

The resulting TaxLotView (note that it is not returning the +TaxLotState)

+
+
+
+ +
+
+raw_access_level_instance
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+raw_access_level_instance_error
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+raw_access_level_instance_id
+
+ +
+
+save(*args, **kwargs)
+

Save the current instance. Override this in a subclass if you want to +control the saving process.

+

The ‘force_insert’ and ‘force_update’ parameters can be used to insist +that the “save” must be an SQL insert or update (or equivalent for +non-SQL backends), respectively. Normally, they should not be set.

+
+ +
+
+state
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+taxlot_footprint
+
+ +
+
+taxlotauditlog_parent_state1
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotauditlog_parent_state2
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotauditlog_state
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotview_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+to_dict(fields=None, include_related_data=True)
+

Returns a dict version of the TaxLotState, either with all fields +or masked to just those requested.

+
+ +
+
+ubid
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+ubidmodel_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+updated
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+ +
+
+class seed.models.tax_lots.TaxLotView(id, taxlot, state, cycle)
+

Bases: Model

+
+
+exception DoesNotExist
+

Bases: ObjectDoesNotExist

+
+ +
+
+exception MultipleObjectsReturned
+

Bases: MultipleObjectsReturned

+
+ +
+
+cycle
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+cycle_id
+
+ +
+
+id
+

A wrapper for a deferred-loading field. When the value is read from this +object the first time, the query is executed.

+
+ +
+
+property import_filename
+

Get the import file name form the audit logs

+
+ +
+
+initialize_audit_logs(**kwargs)
+
+ +
+
+labels
+

Accessor to the related objects manager on the forward and reverse sides of +a many-to-many relation.

+

In the example:

+
class Pizza(Model):
+    toppings = ManyToManyField(Topping, related_name='pizzas')
+
+
+

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor +instances.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+notes
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+objects = <django.db.models.manager.Manager object>
+
+ +
+
+property_states()
+

Return a list of PropertyStates associated with this TaxLotView and Cycle

+
+
Returns:
+

list of PropertyStates

+
+
+
+ +
+
+property_views()
+

Return a list of PropertyViews that are associated with this TaxLotView and Cycle

+
+
Returns:
+

list of PropertyViews

+
+
+
+ +
+
+state
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+state_id
+
+ +
+
+taxlot
+

Accessor to the related object on the forward side of a many-to-one or +one-to-one (via ForwardOneToOneDescriptor subclass) relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Child.parent is a ForwardManyToOneDescriptor instance.

+
+ +
+
+taxlot_id
+
+ +
+
+taxlotauditlog_view
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+
+taxlotproperty_set
+

Accessor to the related objects manager on the reverse side of a +many-to-one relation.

+

In the example:

+
class Child(Model):
+    parent = ForeignKey(Parent, related_name='children')
+
+
+

Parent.children is a ReverseManyToOneDescriptor instance.

+

Most of the implementation is delegated to a dynamically defined manager +class built by create_forward_many_to_many_manager() defined below.

+
+ +
+ +
+
+seed.models.tax_lots.post_save_taxlot_state(sender, **kwargs)
+

Generate UbidModels for a TaxLotState if the ubid field is present

+
+ +
+
+seed.models.tax_lots.post_save_taxlot_view(sender, **kwargs)
+

When changing/saving the TaxLotView, go ahead and touch the TaxLot (if linked) so that the record +receives an updated datetime

+
+ +
+
+seed.models.tax_lots.set_default_access_level_instance(sender, instance, **kwargs)
+

If ALI not set, put this TaxLot as the root.

+
+ +
+
+seed.models.tax_lots.sync_latitude_longitude_and_long_lat(sender, instance, **kwargs)
+
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.public.html b/docs/code_documentation/3.2.0/modules/seed.public.html new file mode 100644 index 00000000..561694ef --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.public.html @@ -0,0 +1,159 @@ + + + + + + + Public Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Public Package

+
+

Submodules

+
+
+

Models

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.serializers.html b/docs/code_documentation/3.2.0/modules/seed.serializers.html new file mode 100644 index 00000000..15a4cbf4 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.serializers.html @@ -0,0 +1,254 @@ + + + + + + + Serializers Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Serializers Package

+
+

Submodules

+
+
+

Serializers

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.serializers.celery.CeleryDatetimeSerializer(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)
+

Bases: JSONEncoder

+
+
+default(obj)
+

Implement this method in a subclass such that it returns +a serializable object for o, or calls the base implementation +(to raise a TypeError).

+

For example, to support arbitrary iterators, you could +implement default like this:

+
def default(self, o):
+    try:
+        iterable = iter(o)
+    except TypeError:
+        pass
+    else:
+        return list(iterable)
+    # Let the base class default method raise the TypeError
+    return JSONEncoder.default(self, o)
+
+
+
+ +
+
+static seed_decoder(obj)
+
+ +
+
+static seed_dumps(obj)
+
+ +
+
+static seed_loads(obj)
+
+ +
+ +
+
+

Labels

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.serializers.labels.LabelSerializer(*args, **kwargs)
+

Bases: ModelSerializer

+
+
+class Meta
+

Bases: object

+
+
+extra_kwargs = {'super_organization': {'write_only': True}}
+
+ +
+
+fields = ('id', 'name', 'color', 'organization_id', 'super_organization', 'is_applied', 'show_in_list')
+
+ +
+
+model
+

alias of StatusLabel

+
+ +
+ +
+
+get_is_applied(obj)
+
+ +
+
+to_representation(instance)
+

Object instance -> Dict of primitive datatypes.

+
+ +
+ +
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.templatetags.html b/docs/code_documentation/3.2.0/modules/seed.templatetags.html new file mode 100644 index 00000000..1b6c5bcb --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.templatetags.html @@ -0,0 +1,277 @@ + + + + + + + Templatetags Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Templatetags Package

+
+

Submodules

+
+
+

Breadcrumbs

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+

breadcrumbs.py, https://bitbucket.org/Mathiasdm/django-simple-breadcrumbs/

+
+
+class seed.templatetags.breadcrumbs.BreadcrumbNode(variables, render_func=<function create_crumb>)
+

Bases: Node

+
+
+render(context)
+

Return the node rendered as a string.

+
+ +
+ +
+
+class seed.templatetags.breadcrumbs.UrlBreadcrumbNode(title, url_node, render_func=<function create_crumb>)
+

Bases: Node

+
+
+render(context)
+

Return the node rendered as a string.

+
+ +
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb(parser, token)
+

Section author: Andriy Drozdyuk

+

Renders the breadcrumb.

+

Example:

+
{% breadcrumb "Title of breadcrumb" url_var %}
+{% breadcrumb context_var  url_var %}
+{% breadcrumb "Just the title" %}
+{% breadcrumb just_context_var %}
+
+
+

Parameters:

+
First parameter is the title of the crumb
+Second (optional) parameter is the url variable to link to, produced by url tag, i.e.:
+    {% url "person_detail" object.id as person_url %}
+    then:
+    {% breadcrumb person.name person_url %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb_root(parser, token)
+

Section author: Andriy Drozdyuk

+

Renders the breadcrumb.

+

Examples:

+
{% breadcrumb "Title of breadcrumb" url_var %}
+{% breadcrumb context_var  url_var %}
+{% breadcrumb "Just the title" %}
+{% breadcrumb just_context_var %}
+
+
+

Parameters:

+
First parameter is the title of the crumb,
+Second (optional) parameter is the url variable to link to, produced by url tag, i.e.:
+    {% url "person_detail/" object.id as person_url %}
+    then:
+    {% breadcrumb person.name person_url %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb_url(parser, token)
+

Same as breadcrumb but instead of url context variable takes in all the +arguments URL tag takes.

+
{% breadcrumb "Title of breadcrumb" person_detail person.id %}
+{% breadcrumb person.name person_detail person.id %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.breadcrumb_url_root(parser, token)
+

Same as breadcrumb but instead of url context variable takes in all the +arguments URL tag takes.

+
{% breadcrumb "Title of breadcrumb" person_detail person.id %}
+{% breadcrumb person.name person_detail person.id %}
+
+
+
+ +
+
+seed.templatetags.breadcrumbs.create_crumb(title, url=None)
+

Helper function

+
+ +
+
+seed.templatetags.breadcrumbs.create_crumb_first(title, url=None)
+

Helper function

+
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.test_helpers.factory.html b/docs/code_documentation/3.2.0/modules/seed.test_helpers.factory.html new file mode 100644 index 00000000..8ba7006e --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.test_helpers.factory.html @@ -0,0 +1,298 @@ + + + + + + + Test Helper Factor Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Test Helper Factor Package

+
+

Subpackages

+ +
+
+

Submodules

+
+
+

Helpers

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.test_helpers.factory.helpers.DjangoFunctionalFactory
+

Bases: object

+
+
+classmethod invalid_test_cc_number()
+
+ +
+
+classmethod rand_bool()
+
+ +
+
+classmethod rand_city()
+
+ +
+
+classmethod rand_city_suffix()
+
+ +
+
+classmethod rand_currency(start=0, end=100)
+
+ +
+
+classmethod rand_date(start_year=1900, end_year=2011)
+
+ +
+
+classmethod rand_domain()
+
+ +
+
+classmethod rand_email()
+
+ +
+
+classmethod rand_float(start=0, end=100)
+
+ +
+
+classmethod rand_int(start=0, end=100)
+
+ +
+
+classmethod rand_name()
+
+ +
+
+classmethod rand_phone()
+
+ +
+
+classmethod rand_plant_name()
+
+ +
+
+classmethod rand_str(length=None)
+
+ +
+
+classmethod rand_street_address()
+
+ +
+
+classmethod rand_street_suffix()
+
+ +
+
+classmethod test_cc_number(valid=True)
+
+ +
+
+classmethod valid_test_cc_number()
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.test_helpers.factory.lib.html b/docs/code_documentation/3.2.0/modules/seed.test_helpers.factory.lib.html new file mode 100644 index 00000000..202816f6 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.test_helpers.factory.lib.html @@ -0,0 +1,189 @@ + + + + + + + Test Helper Factory Lib Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.test_helpers.html b/docs/code_documentation/3.2.0/modules/seed.test_helpers.html new file mode 100644 index 00000000..c2c9c12a --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.test_helpers.html @@ -0,0 +1,229 @@ + + + + + + + Test Helpers Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.tests.functional.html b/docs/code_documentation/3.2.0/modules/seed.tests.functional.html new file mode 100644 index 00000000..f3b869d6 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.tests.functional.html @@ -0,0 +1,194 @@ + + + + + + + Tests (Functional) Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.tests.html b/docs/code_documentation/3.2.0/modules/seed.tests.html new file mode 100644 index 00000000..fb80b707 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.tests.html @@ -0,0 +1,970 @@ + + + + + + + Tests Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tests Package

+
+

Submodules

+ +
+
+

Admin Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.test_admin_views.AdminViewsTest(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_add_org()
+

Happy path test for creating a new org.

+
+ +
+
+test_add_org_dupe()
+

Trying to create an org with a dupe name fails.

+
+ +
+
+test_add_owner_existing_org_to_non_root()
+
+ +
+
+test_add_user_existing_org()
+

Test creating a new user, adding them to an existing org +in the process.

+
+ +
+
+test_add_user_new_org()
+

Create a new user and a new org at the same time.

+
+ +
+
+test_add_user_no_org()
+

Should not be able to create a new user without either +selecting or creating an org at the same time.

+
+ +
+
+test_signup_process()
+

Simulates the entire new user signup process, from initial +account creation by an admin to receiving the signup email +to confirming the account and setting a password.

+
+ +
+
+test_signup_process_force_lowercase_email()
+

Simulates the signup and login forcing login username to lowercase

+
+ +
+ +
+
+

Decorators

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.test_decorators.ClassDecoratorTests(methodName='runTest')
+

Bases: TestCase

+
+
+test_ajax_request_class_dict()
+
+ +
+
+test_ajax_request_class_dict_status_error()
+
+ +
+
+test_ajax_request_class_dict_status_false()
+
+ +
+
+test_ajax_request_class_format_type()
+
+ +
+
+test_require_organization_id_class_no_org_id()
+
+ +
+
+test_require_organization_id_class_org_id()
+
+ +
+
+test_require_organization_id_class_org_id_not_int()
+
+ +
+ +
+
+class seed.tests.test_decorators.RequireOrganizationIDTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_require_organization_id_fail_no_key()
+
+ +
+
+test_require_organization_id_fail_not_numeric()
+
+ +
+
+test_require_organization_id_success_integer()
+
+ +
+
+test_require_organization_id_success_string()
+
+ +
+ +
+
+class seed.tests.test_decorators.TestDecorators(methodName='runTest')
+

Bases: TestCase

+

Tests for locking tasks and reporting progress.

+
+
+locked = 1
+
+ +
+
+pk = 34
+
+ +
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_get_prog_key()
+

We format our cache key properly.

+
+ +
+
+test_increment_cache()
+

Sum our progress by increments properly.

+
+ +
+
+test_locking()
+

Make sure we indicate we’re locked if and only if we’re inside the function.

+
+ +
+
+test_locking_w_exception()
+

Make sure we release our lock if we have had an exception.

+
+ +
+
+test_progress()
+

When a task finishes, it increments the progress counter properly.

+
+ +
+
+unlocked = 0
+
+ +
+ +
+
+exception seed.tests.test_decorators.TestError
+

Bases: Exception

+
+ +
+
+

Exporters

+
+
+

Models

+
+
+

Tasks

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.test_tasks.TestTasks(methodName='runTest')
+

Bases: TestCase

+

Tests for dealing with SEED related tasks.

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_delete_organization()
+
+ +
+
+test_rehash_query_or_structure()
+
+ +
+ +
+
+

Views

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.test_views.DatasetPermissionsTests(methodName='runTest')
+

Bases: AccessLevelBaseTestCase

+
+
+setUp()
+

SUPERUSER

+
+ +
+
+test_dataset_count()
+
+ +
+
+test_dataset_create()
+
+ +
+
+test_dataset_destroy()
+
+ +
+
+test_dataset_list()
+
+ +
+
+test_dataset_retrieve()
+
+ +
+
+test_dataset_update()
+
+ +
+ +
+
+class seed.tests.test_views.GetDatasetsViewsTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_delete_dataset()
+
+ +
+
+test_get_dataset()
+
+ +
+
+test_get_datasets()
+
+ +
+
+test_get_datasets_count()
+
+ +
+
+test_get_datasets_count_invalid()
+
+ +
+
+test_update_dataset()
+
+ +
+ +
+
+class seed.tests.test_views.ImportFileViewsTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_delete_file()
+
+ +
+
+test_get_import_file()
+
+ +
+
+test_get_matching_and_geocoding_results()
+
+ +
+ +
+
+class seed.tests.test_views.InventoryViewTests(methodName='runTest')
+

Bases: AssertDictSubsetMixin, DeleteModelsTestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_get_cycles()
+
+ +
+
+test_get_properties()
+
+ +
+
+test_get_properties_cycle_id()
+
+ +
+
+test_get_properties_empty_page()
+
+ +
+
+test_get_properties_page_not_an_integer()
+
+ +
+
+test_get_properties_pint_fields()
+
+ +
+
+test_get_properties_profile_id()
+
+ +
+
+test_get_properties_property_extra_data()
+
+ +
+
+test_get_properties_select_all()
+
+ +
+
+test_get_properties_taxlot_extra_data()
+
+ +
+
+test_get_properties_with_taxlots()
+
+ +
+
+test_get_properties_with_taxlots_with_footprints()
+
+ +
+
+test_get_properties_wrong_query_params()
+
+ +
+
+test_get_property()
+
+ +
+
+test_get_property_columns()
+
+ +
+
+test_get_property_multiple_taxlots()
+
+ +
+
+test_get_taxlot()
+
+ +
+
+test_get_taxlot_columns()
+
+ +
+
+test_get_taxlots()
+
+ +
+
+test_get_taxlots_empty_page()
+
+ +
+
+test_get_taxlots_extra_data()
+
+ +
+
+test_get_taxlots_multiple_taxlots()
+
+ +
+
+test_get_taxlots_no_cycle_id()
+
+ +
+
+test_get_taxlots_page_not_an_integer()
+
+ +
+
+test_get_taxlots_profile_id()
+
+ +
+
+test_postoffice()
+
+ +
+
+test_update_pint_fields_with_modified_display_settings()
+
+ +
+ +
+
+class seed.tests.test_views.MainViewTests(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_home()
+
+ +
+ +
+
+class seed.tests.test_views.TestMCMViews(methodName='runTest')
+

Bases: TestCase

+
+
+assert_expected_mappings(actual, expected)
+

For each k,v pair of form column_name: [dest_col, confidence] +in actual, assert that expected contains the same column_name +and dest_col mapping.

+
+ +
+
+expected_mappings = {'address': ['owner_address', 70], 'building id': ['Building air leakage', 64], 'name': ['Name of Audit Certification Holder', 47], 'year built': ['year_built', 50]}
+
+ +
+
+raw_columns_expected = {'raw_columns': ['name', 'address', 'year built', 'building id'], 'status': 'success'}
+
+ +
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+test_create_dataset()
+

tests the create_dataset view, allows duplicate dataset names

+
+ +
+
+test_get_column_mapping_suggestions()
+
+ +
+
+test_get_column_mapping_suggestions_pm_file()
+
+ +
+
+test_get_column_mapping_suggestions_with_columns()
+
+ +
+
+test_get_raw_column_names()
+

Good case for get_raw_column_names.

+
+ +
+
+test_progress()
+

Make sure we retrieve data from cache properly.

+
+ +
+
+test_save_column_mappings()
+
+ +
+
+test_save_column_mappings_idempotent()
+

We need to make successive calls to save_column_mappings.

+
+ +
+ +
+
+

Tests

+
+
+

Utils

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.tests.util.AccessLevelBaseTestCase(methodName='runTest')
+

Bases: TestCase

+

Base Test Case Class to handle Access Levels +Creates a root owner user, a root member user, +and a child member user +Useful for testing “setup” API endpoints +as well as “data” endpoints +Provides methods for logging in as different +users +Sets up the factories

+
+
+login_as_child_member()
+

Login to client as Child-Level member user

+
+ +
+
+login_as_root_member()
+

Login to client as Root-Level member user

+
+ +
+
+login_as_root_owner()
+

Login to client as Root-Level owner user

+
+ +
+
+setUp()
+

SUPERUSER

+
+ +
+ +
+
+class seed.tests.util.AssertDictSubsetMixin
+

Bases: object

+
+
+assertDictContainsSubset(subset, dictionary)
+

Checks whether dictionary is a superset of subset

+

This is a necessary polyfill b/c assertDictContainsSubset was deprecated +and I believe it’s much more readable compared to the implementation below

+
+ +
+ +
+
+class seed.tests.util.DataMappingBaseTestCase(methodName='runTest')
+

Bases: DeleteModelsTestCase

+

Base Test Case Class to handle data import

+
+
+create_import_file(user, org, cycle, source_type=0, data_state=1)
+
+ +
+
+set_up(import_file_source_type, user_name='test_user@demo.com', user_password='test_pass')
+
+ +
+ +
+
+class seed.tests.util.DeleteModelsTestCase(methodName='runTest')
+

Bases: TestCase

+
+
+setUp()
+

Hook method for setting up the test fixture before exercising it.

+
+ +
+
+tearDown()
+

Hook method for deconstructing the test fixture after testing it.

+
+ +
+ +
+
+class seed.tests.util.FakeClient
+

Bases: object

+

An extremely light-weight test client.

+
+
+get(view_func, data, headers=None, **kwargs)
+
+ +
+
+post(view_func, data, headers=None, **kwargs)
+
+ +
+ +
+
+class seed.tests.util.FakeRequest(data=None, headers=None, user=None, method='POST', **kwargs)
+

Bases: object

+

A simple request stub.

+
+
+GET: Dict[str, Any] = {}
+
+ +
+
+META = {'REMOTE_ADDR': '127.0.0.1'}
+
+ +
+
+POST: Dict[str, Any] = {}
+
+ +
+
+body = None
+
+ +
+
+path = 'fake_login_path'
+
+ +
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.urls.html b/docs/code_documentation/3.2.0/modules/seed.urls.html new file mode 100644 index 00000000..3ea43632 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.urls.html @@ -0,0 +1,161 @@ + + + + + + + URLs Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

URLs Package

+
+

Submodules

+
+
+

Accounts

+
+
+

APIs

+
+
+

Main

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.utils.html b/docs/code_documentation/3.2.0/modules/seed.utils.html new file mode 100644 index 00000000..f093ac5d --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.utils.html @@ -0,0 +1,569 @@ + + + + + + + Utilities Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Utilities Package

+
+

Submodules

+
+
+

APIs

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+class seed.utils.api.APIBypassCSRFMiddleware(get_response)
+

Bases: object

+

This middleware turns off CSRF protection for API clients.

+

It must come before CsrfViewMiddleware in settings.MIDDLEWARE.

+
+ +
+
+class seed.utils.api.OrgCreateMixin
+

Bases: OrgMixin

+

Mixin to add organization when creating model instance

+
+
+perform_create(serializer)
+

Override to add org

+
+ +
+ +
+
+class seed.utils.api.OrgCreateUpdateMixin
+

Bases: OrgCreateMixin, OrgUpdateMixin

+

Mixin to add organization when creating/updating model instance

+
+ +
+
+class seed.utils.api.OrgMixin
+

Bases: object

+

Provides get_organization and get_parent_org method

+
+
+get_organization(request, return_obj=False)
+

Get org from query param or request.user.

+
+
Parameters:
+
    +
  • request – request object.

  • +
  • return_obj – bool. Set to True if obj vs pk is desired.

  • +
+
+
Returns:
+

int representing a valid organization pk or organization object.

+
+
+
+ +
+
+get_parent_org(request)
+

Gets parent organization of org from query param or request. +:param request: Request object. +:return: organization object.

+
+ +
+ +
+
+class seed.utils.api.OrgQuerySetMixin
+

Bases: OrgMixin

+

Mixin proving a get_queryset method that filters on organization.

+

In order to use this mixin you must specify the model attributes on the +View[Set] class. By default, it assumes there is an organization field +on the model. You can override this by setting the orgfilter attribute +to the appropriate fieldname. This also allows nested fields e.g. +foreign_key.organization +By default this retrieves organization from query string param OR the +default_organization or first returned organization of the logged in user. +You can force it to return the appropriate “parent” organization by setting +the force_parent attribute to True.

+
+
+get_queryset()
+

get_queryset filtered on organization

+
+ +
+ +
+
+class seed.utils.api.OrgUpdateMixin
+

Bases: OrgMixin

+

Mixin to add organization when updating model instance

+
+
+perform_update(serializer)
+

Override to add org

+
+ +
+ +
+
+class seed.utils.api.OrgValidateMixin
+

Bases: object

+

Mixin to provide a validate() method organization to ensure users belongs +to the same org as the instance referenced by a foreign key..

+

You must set org_validators on the Serializer that uses this Mixin. +This is a list of OrgValidator named tuples (where key is the key +on request data representing the foreign key, and field the foreign key +that represents the organization on the corresponding model.

+

my_validator = OrgValidator(key=’foreign_key, field=’organization_id’)

+

..example:

+
+
+
class MySerializer(OrgValidateMixin, serializers.ModelSerializer):
+
foreign_key= serializers.PrimaryKeyRelatedField(

query_set=MyModel.objects.all()

+
+
+

) +org_validators = [my_validator]

+
+
+
+

This ensures request.user belongs to the org MyModel.organization

+

You can traverse foreign key relationships by using a double underscore +in validator.field

+

In the example above setting validator field to be ‘property__org_id’ +is equivalent to MyModel.property.org_id

+

If you use this Mixin and write a validate method, you must call super +to ensure validation takes place.

+
+
+validate(data)
+

Object level validation.

+

Checks for self.org_validators on Serializers and +ensures users belongs to org corresponding to the foreign key +being set.

+
+ +
+
+validate_org(instance, user, validator)
+

Raise error if orgs do not match.

+
+
Parameters:
+
    +
  • instance (model instance) – value in request.data.get(key) to check against

  • +
  • validator – validator to user

  • +
+
+
Param:
+

org_id of user, from get_org_id(request)

+
+
Type:
+

OrgValidator named tuple

+
+
+
+ +
+ +
+
+class seed.utils.api.OrgValidator(key, field)
+

Bases: tuple

+
+
+field
+

Alias for field number 1

+
+ +
+
+key
+

Alias for field number 0

+
+ +
+ +
+
+class seed.utils.api.ProfileIdMixin
+

Bases: object

+

Provides methods to get the columns to show based on a profile ID

+
+
+get_show_columns(org_id, profile_id)
+

Get list of columns from the profile_id. The result will be in the form of

+
+
show_columns = {

‘fields’: [‘field_1’, ‘field_2’, …] +‘extra_data’: [‘extra_data_field_1’, ‘extra_data_field_2’, …]

+
+
+

}

+
+
Parameters:
+
    +
  • org_id – str, id of organization

  • +
  • profile_id – str, id of profile to retrieve

  • +
+
+
Returns:
+

dist of lists

+
+
+
+ +
+ +
+
+seed.utils.api.api_endpoint(fn)
+

Decorator function to mark a view as allowed to authenticate via API key.

+

Decorator must be used before login_required or has_perm to set +request.user for those decorators.

+
+ +
+
+seed.utils.api.api_endpoint_class(fn)
+

Decorator function to mark a view as allowed to authenticate via API key.

+

Decorator must be used before login_required or has_perm to set +request.user for those decorators.

+
+ +
+
+seed.utils.api.clean_api_regex(url)
+

Given a django-style url regex pattern, strip it down to a human-readable +url.

+

TODO: If pks ever appear in the url, this will need to account for that.

+
+ +
+
+seed.utils.api.drf_api_endpoint(fn)
+

Decorator to register a Django Rest Framework view with the list of API +endpoints. Marks it with is_api_endpoint = True as well as appending it +to the global endpoints list.

+
+ +
+
+seed.utils.api.format_api_docstring(docstring)
+

Cleans up a python method docstring for human consumption.

+
+ +
+
+seed.utils.api.get_all_urls(urllist, prefix='')
+

Recursive generator that traverses entire tree of URLs, starting with +urllist, yielding a tuple of (url_pattern, view_function) for each +one.

+
+ +
+
+seed.utils.api.get_api_endpoints()
+

Examines all views and returns those with is_api_endpoint set +to true (done by the @api_endpoint decorator).

+
+ +
+
+seed.utils.api.get_api_request_user(request)
+

Determines if this is an API request and returns the corresponding user if so.

+
+ +
+
+seed.utils.api.get_org_id_from_validator(instance, field)
+

For querysets Django enables you to do things like:

+

note double underscore. However you can’t do:

+

This presents an issue as getattr only works 1 level deep:

+
+

getattr(obj, ‘org.id’) does not work either.

+
+

This can be worked around using rgetattr (above). +This functions mimics getattr(obj, ‘org__id’) by +splitting field on __ and calling rgetattr on the result.

+
+ +
+
+seed.utils.api.rgetattr(obj, lst)
+

This enables recursive getattr look ups. +given obj, [‘a’, ‘b’, ‘c’] as params it will look up: +obj.a, a.b, b.c returning b.c unless one of the previous +values was None, in which case it returns None immediately.

+
+
Parameters:
+
    +
  • obj (object) – initial object to examine

  • +
  • lst (list) – list of successive attributes to look up

  • +
+
+
+
+ +
+
+

Buildings

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.utils.buildings.get_source_type(import_file, source_type='')
+

Used for converting ImportFile source_type into an int.

+
+ +
+
+

Organizations

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.utils.organizations.create_organization(user=None, org_name='test_org', *args, **kwargs)
+

Helper script to create a user/org relationship from scratch. This is heavily used and +creates the default labels, columns, and data quality rules when a new organization is created

+
+
Parameters:
+
    +
  • user – user inst.

  • +
  • org_name – str, name of Organization we’d like to create.

  • +
  • kwargs ((optional)) – ‘role’, int; ‘status’, str.

  • +
+
+
+
+ +
+
+seed.utils.organizations.create_suborganization(user, current_org, suborg_name='', user_role=10)
+
+ +
+
+seed.utils.organizations.default_pm_mappings()
+
+ +
+
+seed.utils.organizations.set_default_2fa_method(org)
+
+ +
+
+

Time

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.utils.time.convert_datestr(datestr, make_tz_aware=False)
+

Converts dates like 12/31/2010 into datetime objects. Dates are returned in UTC time

+

TODO: reconcile this with seed/lib/mcm/cleaners.py#L85-L85

+
+
Parameters:
+
    +
  • datestr – string, value to convert

  • +
  • make_tz_aware – bool, if set to true, then will convert the timezone into UTC time

  • +
+
+
Returns:
+

datetime or None

+
+
+
+ +
+
+seed.utils.time.convert_to_js_timestamp(timestamp)
+

converts a django/python datetime object to milliseconds since epoch

+
+ +
+
+seed.utils.time.parse_datetime(maybe_datetime)
+

Process a datetime value that may be None, timestamp, strftime.

+
+ +
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/modules/seed.views.html b/docs/code_documentation/3.2.0/modules/seed.views.html new file mode 100644 index 00000000..701bacb8 --- /dev/null +++ b/docs/code_documentation/3.2.0/modules/seed.views.html @@ -0,0 +1,228 @@ + + + + + + + Views Package — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +
+

Views Package

+
+

Submodules

+
+
+

Accounts

+
+
+

APIs

+
+
+

Main

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+seed.views.main.angular_js_tests(request)
+

Jasmine JS unit test code covering AngularJS unit tests

+
+ +
+
+seed.views.main.celery_queue(self, request, *args, **kwargs)
+

Returns the number of running and queued celery tasks. This action can only be performed by superusers

+

Returns:

+
{
+    'active': {'total': n, 'tasks': []}, // Tasks that are currently being executed
+    'reserved': {'total': n, 'tasks': []}, // Tasks waiting to be executed
+    'scheduled': {'total': n, 'tasks': []}, // Tasks reserved by the worker when they have an eta or countdown
+    'maxConcurrency': The maximum number of active tasks
+}
+
+
+
+ +
+
+seed.views.main.error404(request, exception)
+
+ +
+
+seed.views.main.error410(request)
+
+ +
+
+seed.views.main.error500(request)
+
+ +
+
+seed.views.main.health_check(request)
+

Perform a health check without requiring authentication

+
+ +
+
+seed.views.main.home(request)
+

the main view for the app +Sets in the context for the django template:

+
+ +
+
+seed.views.main.version(self, request, *args, **kwargs)
+

Returns the SEED version and current git sha

+
+ +
+
+

Meters

+
+
+

Module contents

+

SEED Platform (TM), Copyright (c) Alliance for Sustainable Energy, LLC, and other contributors. +See also https://github.com/SEED-platform/seed/blob/main/LICENSE.md

+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/objects.inv b/docs/code_documentation/3.2.0/objects.inv new file mode 100644 index 00000000..25aec6c2 Binary files /dev/null and b/docs/code_documentation/3.2.0/objects.inv differ diff --git a/docs/code_documentation/3.2.0/postgres_upgrade.html b/docs/code_documentation/3.2.0/postgres_upgrade.html new file mode 100644 index 00000000..93b3be81 --- /dev/null +++ b/docs/code_documentation/3.2.0/postgres_upgrade.html @@ -0,0 +1,162 @@ + + + + + + + Upgrade a SEED database from Postgres 12 to Postgres 16 — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ +
+

Upgrade a SEED database from Postgres 12 to Postgres 16

+
+

Assumptions

+
    +
  • This process assumes that you’re currently using Postgres 12.7 with TimescaleDB 2.3.0 from timescale/timescaledb-postgis:2.3.0-pg12 or timescale/timescaledb-postgis:latest-pg12

  • +
  • This also assumes that you have a directory in the host filesystem, e.g. ~/share, that is bind mounted to /share in your existing database container

  • +
+
    +
  1. Create a dump of the current database

  2. +
+
docker exec seed_postgres pg_dump -d seed -U seeduser -Fc -f /share/seed-pg12.dump
+
+
+
    +
  1. Create a temporary Postgres 13 container using the Docker image timescale/timescaledb-ha:pg13.14-ts2.14.2-oss

  2. +
+
docker run --rm --name=seed-pg13 -e POSTGRES_DB=seed -e POSTGRES_USER=seeduser -e POSTGRES_PASSWORD=password -v ~/share:/share timescale/timescaledb-ha:pg13.14-ts2.14.2-oss
+
+
+

Once the container has finished initializing, open a separate shell

+
docker exec -it seed-pg13 bash
+psql -d seed -U seeduser -c "CREATE EXTENSION postgis;"
+psql -d seed -U seeduser -c "DROP EXTENSION timescaledb;"
+psql -d seed -U seeduser -c "CREATE EXTENSION timescaledb WITH VERSION '2.3.0';"
+psql -d seed -U seeduser -c "SELECT timescaledb_pre_restore();"
+pg_restore -d seed -U seeduser /share/seed-pg12.dump
+psql -d seed -U seeduser -c "SELECT timescaledb_post_restore();"
+psql -d seed -U seeduser -c "ALTER EXTENSION timescaledb UPDATE;"
+pg_dump -d seed -U seeduser -Fc -f /share/seed-pg13.dump
+
+
+
    +
  1. Start the new, permanent Postgres 16 container using the Docker image timescale/timescaledb-ha:pg16.2-ts2.14.2-oss

  2. +
+
docker run -d --name=seed-pg16 -e POSTGRES_DB=seed -e POSTGRES_USER=seeduser -e POSTGRES_PASSWORD=password -v ~/share:/share timescale/timescaledb-ha:pg16.2-ts2.14.2-oss
+
+
+

Once the container has finished initializing, open a separate shell

+
docker exec -it seed-pg16 bash
+psql -d seed -U seeduser -c "CREATE EXTENSION postgis;"
+psql -d seed -U seeduser -c "SELECT timescaledb_pre_restore();"
+pg_restore -d seed -U seeduser /share/seed-pg13.dump
+psql -d seed -U seeduser -c "SELECT timescaledb_post_restore();"
+pg_dump -d seed -U seeduser -Fc -f /share/seed-pg16.dump
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/py-modindex.html b/docs/code_documentation/3.2.0/py-modindex.html new file mode 100644 index 00000000..3194aedd --- /dev/null +++ b/docs/code_documentation/3.2.0/py-modindex.html @@ -0,0 +1,408 @@ + + + + + + Python Module Index — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ c | + s +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ c
+ config +
    + config.template_context +
    + config.tests +
    + config.utils +
    + config.views +
    + config.wsgi +
 
+ s
+ seed +
    + seed.data_importer +
    + seed.data_importer.managers +
    + seed.data_importer.utils +
    + seed.decorators +
    + seed.landing +
    + seed.landing.forms +
    + seed.landing.management +
    + seed.landing.management.commands +
    + seed.landing.models +
    + seed.landing.tests +
    + seed.landing.urls +
    + seed.landing.views +
    + seed.lib +
    + seed.lib.mappings +
    + seed.lib.mappings.mapper +
    + seed.lib.mappings.mapping_columns +
    + seed.lib.merging +
    + seed.lib.merging.merging +
    + seed.management +
    + seed.models +
    + seed.models.auditlog +
    + seed.models.columns +
    + seed.models.cycles +
    + seed.models.data_quality +
    + seed.models.models +
    + seed.models.properties +
    + seed.models.tax_lots +
    + seed.public +
    + seed.search +
    + seed.serializers +
    + seed.serializers.celery +
    + seed.serializers.labels +
    + seed.tasks +
    + seed.templatetags.breadcrumbs +
    + seed.test_helpers +
    + seed.test_helpers.factory.helpers +
    + seed.tests.test_admin_views +
    + seed.tests.test_decorators +
    + seed.tests.test_tasks +
    + seed.tests.test_views +
    + seed.tests.util +
    + seed.token_generators +
    + seed.utils +
    + seed.utils.api +
    + seed.utils.buildings +
    + seed.utils.organizations +
    + seed.utils.time +
    + seed.views +
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/search.html b/docs/code_documentation/3.2.0/search.html new file mode 100644 index 00000000..9a672915 --- /dev/null +++ b/docs/code_documentation/3.2.0/search.html @@ -0,0 +1,133 @@ + + + + + + Search — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/searchindex.js b/docs/code_documentation/3.2.0/searchindex.js new file mode 100644 index 00000000..200cdcf9 --- /dev/null +++ b/docs/code_documentation/3.2.0/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api", "aws", "data_model", "data_quality", "deployment", "developer_resources", "docker", "faq", "getting_started", "help", "index", "kubernetes_deployment", "license", "linux", "mapping", "matching", "migrations", "modules", "modules/config", "modules/seed", "modules/seed.cleansing", "modules/seed.data", "modules/seed.data_importer", "modules/seed.features", "modules/seed.landing", "modules/seed.landing.management", "modules/seed.landing.management.commands", "modules/seed.lib", "modules/seed.lib.mappings", "modules/seed.lib.merging", "modules/seed.management", "modules/seed.managers", "modules/seed.managers.tests", "modules/seed.mappings", "modules/seed.models", "modules/seed.public", "modules/seed.serializers", "modules/seed.templatetags", "modules/seed.test_helpers", "modules/seed.test_helpers.factory", "modules/seed.test_helpers.factory.lib", "modules/seed.tests", "modules/seed.tests.functional", "modules/seed.urls", "modules/seed.utils", "modules/seed.views", "postgres_upgrade", "setup_docker", "setup_osx", "translation"], "filenames": ["api.rst", "aws.rst", "data_model.rst", "data_quality.rst", "deployment.rst", "developer_resources.rst", "docker.rst", "faq.rst", "getting_started.rst", "help.rst", "index.rst", "kubernetes_deployment.rst", "license.rst", "linux.rst", "mapping.rst", "matching.rst", "migrations.rst", "modules.rst", "modules/config.rst", "modules/seed.rst", "modules/seed.cleansing.rst", "modules/seed.data.rst", "modules/seed.data_importer.rst", "modules/seed.features.rst", "modules/seed.landing.rst", "modules/seed.landing.management.rst", "modules/seed.landing.management.commands.rst", "modules/seed.lib.rst", "modules/seed.lib.mappings.rst", "modules/seed.lib.merging.rst", "modules/seed.management.rst", "modules/seed.managers.rst", "modules/seed.managers.tests.rst", "modules/seed.mappings.rst", "modules/seed.models.rst", "modules/seed.public.rst", "modules/seed.serializers.rst", "modules/seed.templatetags.rst", "modules/seed.test_helpers.rst", "modules/seed.test_helpers.factory.rst", "modules/seed.test_helpers.factory.lib.rst", "modules/seed.tests.rst", "modules/seed.tests.functional.rst", "modules/seed.urls.rst", "modules/seed.utils.rst", "modules/seed.views.rst", "postgres_upgrade.rst", "setup_docker.rst", "setup_osx.rst", "translation.rst"], "titles": ["API", "AWS Setup", "Data Model", "Data Quality", "Deployment Guide", "Developer Resources", "Docker Deployment on AWS", "Frequently Asked Questions", "Getting Started", "Help", "Standard Energy Efficiency Data (SEED) Platform", "Kubernetes Deployment Guide with Helm", "License", "General Linux Setup", "Mapping", "Matching", "Migrations", "Modules", "Configuration", "SEED Package", "Data Quality Package", "Data Package", "Data Importer Package", "Features Package", "Landing Package", "seed.landing.management package", "Landing Management Package", "Library Packages", "seed.lib.mappings package", "seed.lib.merging package", "Management Package", "Managers Package", "Manager Tests Package", "Mapping Package", "Models", "Public Package", "Serializers Package", "Templatetags Package", "Test Helpers Package", "Test Helper Factor Package", "Test Helper Factory Lib Package", "Tests Package", "Tests (Functional) Package", "URLs Package", "Utilities Package", "Views Package", "Upgrade a SEED database from Postgres 12 to Postgres 16", "Installation using Docker", "Installation on OSX", "Translating SEED"], "terms": {"i": [0, 1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 13, 14, 16, 19, 20, 22, 24, 28, 34, 37, 41, 44, 46, 47, 48, 49], "handl": [0, 2, 4, 5, 16, 24, 28, 41], "via": [0, 5, 15, 18, 20, 24, 34, 44], "an": [0, 1, 2, 3, 5, 6, 7, 10, 11, 13, 14, 15, 16, 18, 19, 24, 34, 41, 44, 45, 47, 48, 49], "encod": 0, "author": [0, 19, 24, 28, 29, 37], "token": [0, 11, 17, 24, 37, 49], "set": [0, 1, 2, 4, 6, 10, 11, 13, 14, 15, 16, 18, 19, 20, 24, 28, 29, 34, 41, 44, 45, 47, 48], "http": [0, 4, 5, 6, 9, 11, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "header": [0, 5, 14, 19, 24, 41, 49], "To": [0, 1, 2, 3, 4, 5, 11, 47, 48], "request": [0, 2, 9, 11, 13, 14, 18, 19, 24, 34, 41, 44, 45], "go": [0, 5, 34, 47], "app": [0, 1, 5, 7, 10, 11, 13, 22, 45, 48], "profil": [0, 1, 5, 6, 13, 14, 44, 48], "develop": [0, 4, 7, 10, 18, 48], "click": [0, 2, 3], "get": [0, 1, 2, 5, 6, 10, 11, 13, 15, 19, 20, 24, 28, 34, 41, 44, 48, 49], "new": [0, 2, 11, 15, 16, 19, 20, 22, 29, 34, 41, 44, 46, 48, 49], "kei": [0, 2, 4, 5, 6, 8, 11, 16, 19, 20, 24, 28, 29, 34, 41, 44, 49], "everi": [0, 1, 2, 5, 13, 34], "your": [0, 1, 4, 5, 6, 7, 11, 13, 16, 46, 47, 48], "usernam": [0, 1, 5, 11, 13, 24, 41, 47, 48], "email": [0, 5, 6, 7, 11, 13, 19, 24, 34, 41], "all": [0, 2, 5, 7, 11, 12, 13, 15, 16, 19, 20, 22, 24, 34, 37, 44, 48, 49], "lowercas": [0, 14, 41], "basic": [0, 49], "auth": [0, 4, 24], "The": [0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 19, 20, 24, 28, 34, 44, 45, 47, 48, 49], "sent": [0, 7], "form": [0, 2, 12, 17, 34, 41, 44], "credenti": [0, 11], "where": [0, 2, 3, 5, 9, 15, 20, 22, 44, 48, 49], "base64": 0, "join": [0, 9, 17], "singl": [0, 16, 19, 34, 48], "colon": 0, "us": [0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19, 20, 22, 24, 28, 34, 41, 44, 46, 48, 49], "python": [0, 4, 7, 8, 9, 10, 19, 34, 44], "librari": [0, 7, 10, 17], "import": [0, 3, 4, 5, 7, 10, 15, 16, 17, 20, 28, 34, 41, 47], "result": [0, 2, 5, 15, 16, 20, 28, 34, 44], "seed": [0, 1, 4, 5, 6, 11, 12, 13, 14, 15, 16, 17, 18, 20, 22, 24, 27, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "platform": [0, 1, 4, 5, 6, 11, 12, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "org": [0, 5, 6, 7, 9, 11, 13, 16, 19, 22, 24, 37, 41, 44, 47, 48], "version": [0, 4, 5, 6, 7, 11, 28, 34, 45, 46, 47, 48], "user_email": 0, "api_kei": [0, 24, 48], "print": [0, 5], "json": [0, 1, 2, 5, 11, 13, 14, 17, 19, 28, 49], "curl": [0, 1, 6, 13], "pass": [0, 5, 6, 13, 19, 34, 36, 47], "follow": [0, 1, 2, 4, 5, 6, 11, 12, 13, 15, 16, 34, 47, 48], "u": [0, 5, 6, 7, 10, 11, 12, 13, 22, 34, 46], "If": [0, 1, 2, 4, 5, 6, 7, 11, 15, 16, 19, 20, 24, 28, 34, 44, 47, 48, 49], "fail": [0, 5, 6, 16, 41, 47], "": [0, 1, 2, 5, 6, 7, 9, 10, 12, 13, 15, 18, 19, 20, 22, 24, 34, 41, 47, 48, 49], "statu": [0, 19, 41, 44], "code": [0, 5, 9, 11, 12, 16, 19, 34, 45, 47, 48], "302": 0, "redirect": 0, "user": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 15, 16, 19, 24, 34, 41, 44, 47, 49], "login": [0, 5, 8, 11, 13, 24, 41, 47], "mani": [0, 2, 13, 20, 24, 34, 49], "requir": [0, 1, 5, 6, 7, 10, 11, 12, 13, 16, 20, 24, 45, 48, 49], "paramet": [0, 16, 19, 20, 24, 28, 29, 34, 37, 44, 47], "queri": [0, 5, 16, 19, 20, 24, 34, 44], "string": [0, 16, 19, 20, 22, 24, 28, 34, 37, 44, 49], "url": [0, 5, 10, 11, 13, 16, 17, 19, 37, 44], "A": [0, 1, 5, 12, 13, 14, 15, 20, 24, 34, 41, 48], "frequent": [0, 10], "includ": [0, 1, 5, 12, 13, 15, 16, 20, 22, 29, 34, 47], "organization_id": [0, 2, 5, 16, 19, 20, 34, 36, 44], "you": [0, 1, 4, 5, 7, 9, 11, 13, 16, 18, 34, 36, 44, 46, 47, 48, 49], "belong": [0, 2, 44], "For": [0, 1, 2, 5, 6, 10, 11, 15, 18, 34, 36, 41, 44, 47, 48], "exampl": [0, 1, 2, 5, 6, 9, 15, 16, 18, 19, 20, 24, 28, 34, 36, 37, 44, 47, 48, 49], "v2": [0, 11], "organ": [0, 1, 5, 7, 9, 10, 11, 13, 15, 16, 17, 19, 20, 22, 34, 48], "12": [0, 2, 5, 44, 49], "Or": [0, 15], "d": [0, 5, 6, 44, 46, 48], "6": [0, 5, 34], "role": [0, 2, 44, 48], "viewer": 0, "update_rol": 0, "param": [0, 19, 20, 34, 44], "post": [0, 19, 24, 41, 48], "data": [0, 1, 4, 5, 7, 9, 11, 12, 13, 14, 15, 16, 17, 24, 28, 29, 34, 41, 44, 49], "dump": [0, 10, 46, 48], "from": [0, 1, 2, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 19, 20, 22, 24, 28, 29, 34, 41, 44, 47, 48, 49], "object": [0, 5, 7, 14, 16, 19, 20, 22, 24, 28, 34, 36, 37, 39, 41, 44], "specifi": [0, 5, 14, 15, 20, 44, 47], "each": [0, 2, 5, 11, 15, 16, 22, 29, 41, 44], "document": [0, 1, 2, 6, 9, 10, 12, 13, 14, 16], "In": [0, 1, 2, 5, 13, 16, 20, 22, 24, 34, 44, 47, 48], "case": [0, 2, 3, 5, 15, 16, 28, 34, 41, 44, 48], "error": [0, 4, 5, 16, 19, 20, 44, 47], "most": [0, 2, 3, 5, 6, 15, 20, 24, 34], "return": [0, 2, 5, 16, 19, 20, 22, 24, 28, 29, 34, 36, 37, 44, 45], "thi": [0, 1, 2, 3, 4, 5, 6, 9, 11, 12, 13, 14, 15, 16, 18, 19, 20, 22, 24, 28, 29, 34, 36, 41, 44, 45, 46, 47, 48, 49], "instead": [0, 2, 5, 34, 37, 48], "expect": [0, 5, 13, 16, 22, 41], "messag": [0, 4, 5, 24, 48], "explan": 0, "here": [0, 2, 5, 7, 11, 13, 15, 18, 22, 47], "list": [0, 2, 5, 6, 9, 11, 12, 15, 19, 20, 28, 29, 34, 36, 44], "interact": 0, "ar": [0, 1, 2, 3, 4, 5, 7, 11, 12, 13, 14, 15, 16, 19, 20, 22, 24, 28, 34, 44, 45, 47, 48, 49], "avail": [0, 1, 7, 9, 10, 13, 28, 49], "access": [0, 1, 5, 7, 10, 11, 13, 15, 41, 48], "menu": 0, "item": [0, 5, 11, 16, 28], "left": [0, 29], "navig": [0, 34, 48], "pane": 0, "within": [0, 1, 5, 13, 15, 19, 48], "account": [0, 4, 11, 15, 17, 22, 24, 41, 44], "instanc": [0, 1, 2, 4, 6, 13, 15, 19, 20, 22, 24, 29, 34, 36, 44, 48], "view": [0, 10, 11, 14, 15, 17, 34, 44], "non": [0, 2, 8, 13, 34], "without": [0, 12, 15, 16, 41, 45], "swagger": 0, "server": [0, 1, 4, 5, 6, 8, 11, 14, 18], "provid": [1, 5, 6, 7, 10, 12, 13, 19, 22, 41, 44, 48, 49], "prefer": [1, 2, 6, 13, 16, 20, 22], "host": [1, 6, 7, 13, 16, 46, 48], "django": [1, 2, 4, 6, 7, 8, 10, 11, 16, 18, 19, 20, 24, 34, 37, 44, 45, 47, 49], "project": [1, 4, 5, 6, 13, 18, 19], "excel": [1, 6, 13], "place": [1, 6, 13, 34, 44, 49], "gener": [1, 4, 6, 9, 10, 11, 17, 44, 48], "understand": [1, 6, 13], "layout": [1, 6, 13, 49], "ubuntu": [1, 5, 6, 8, 13], "18": [1, 5, 6, 13], "04": [1, 6, 13], "lt": 1, "These": [1, 2, 11, 14, 15, 34, 48], "instruct": [1, 8, 10, 11, 13, 47], "have": [1, 2, 3, 4, 5, 6, 7, 11, 13, 15, 16, 18, 19, 22, 34, 41, 45, 46, 47, 48, 49], "been": [1, 2, 5, 15, 19, 20, 34, 48], "updat": [1, 2, 5, 6, 7, 13, 15, 16, 20, 24, 25, 29, 34, 44, 46, 48, 49], "It": [1, 2, 6, 9, 11, 18, 34, 44, 47, 49], "recommend": [1, 4, 5, 9, 13, 48], "docker": [1, 4, 5, 8, 10, 11, 13, 46], "base": [1, 2, 5, 7, 10, 13, 19, 20, 22, 24, 28, 29, 34, 36, 37, 39, 41, 44, 47, 48, 49], "deploy": [1, 5, 10, 15, 18], "sudo": [1, 6, 13, 16, 48], "apt": [1, 6, 13, 16], "upgrad": [1, 6, 13, 16, 48], "instal": [1, 4, 5, 8, 11, 13, 16, 19, 49], "y": [1, 6], "libpq": [1, 13], "dev": [1, 11, 13, 47, 48], "pip": [1, 13, 16, 48], "libatla": [1, 13], "gfortran": [1, 13], "build": [1, 2, 7, 8, 9, 10, 13, 15, 17, 19, 20, 34, 41, 48], "essenti": [1, 13], "g": [1, 2, 4, 5, 9, 11, 13, 16, 34, 44, 46, 48, 49], "npm": [1, 5, 8, 13, 16], "libxml2": [1, 13], "libxslt1": [1, 13], "git": [1, 6, 13, 45, 48], "mercuri": [1, 13], "libssl": [1, 13], "libffi": [1, 13], "uwsgi": [1, 13, 48], "core": [1, 13, 16, 19], "plugin": [1, 13], "postgresql": [1, 2, 4, 7, 8, 10, 16], "redi": [1, 8, 13, 16, 20], "abov": [1, 2, 5, 6, 12, 13, 15, 20, 44], "command": [1, 5, 6, 11, 13, 16, 18, 34, 47, 48], "quick": [1, 8, 11, 13], "okai": [1, 6], "local": [1, 4, 5, 6, 13, 16, 48, 49], "more": [1, 2, 4, 5, 11, 13, 15, 16, 41, 49], "perman": [1, 46], "scalabl": 1, "solut": 1, "elasticach": [1, 13], "9": [1, 2, 5, 11, 13], "4": [1, 2, 5, 6, 12, 13, 15, 20, 34, 48], "support": [1, 4, 13, 16, 19, 36], "type": [1, 2, 11, 13, 20, 22, 29, 34, 44], "contrib": [1, 4, 5, 7, 13, 16, 24, 48], "can": [1, 2, 3, 4, 5, 7, 9, 10, 11, 13, 14, 15, 16, 19, 22, 24, 28, 34, 44, 45, 47, 48, 49], "rd": [1, 13], "se": [1, 6], "clone": [1, 6, 13, 48], "repositori": [1, 5, 6, 9, 13, 16, 48], "github": [1, 5, 6, 9, 11, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "com": [1, 5, 6, 9, 11, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 48], "enter": [1, 2, 11, 13], "repo": [1, 11, 13], "cd": [1, 5, 6, 13, 48], "r": [1, 5, 13, 16, 48], "txt": [1, 13, 16, 48], "j": [1, 5, 45, 48, 49], "copi": [1, 5, 13, 16, 19, 34, 48, 49], "local_untrack": [1, 4, 5, 7, 16, 47, 48], "py": [1, 4, 5, 7, 11, 16, 19, 24, 37, 44, 47, 48], "dist": [1, 13, 44, 48], "file": [1, 2, 4, 5, 6, 7, 11, 13, 14, 16, 20, 24, 28, 34, 47, 48, 49], "config": [1, 5, 11, 13, 16, 18, 47, 48], "directori": [1, 5, 6, 11, 13, 16, 46, 47, 48], "add": [1, 4, 5, 6, 13, 14, 16, 20, 24, 28, 44, 47, 48, 49], "password": [1, 5, 11, 13, 16, 19, 24, 41, 46, 47, 48], "port": [1, 13, 16, 47, 48], "point": [1, 2, 5, 13, 14, 15, 22, 24, 34, 47, 48], "manual": [1, 5, 10, 13, 14, 15, 16, 48, 49], "infrastructur": [1, 13], "default": [1, 2, 3, 5, 6, 11, 13, 16, 19, 20, 34, 36, 44, 47, 48], "engin": [1, 6, 13, 16, 24, 48], "db": [1, 5, 6, 11, 13, 16, 20, 24, 34, 48], "backend": [1, 4, 13, 16, 34, 48], "postgresql_psycopg2": [1, 13], "name": [1, 2, 5, 6, 7, 11, 12, 13, 16, 18, 19, 20, 24, 28, 29, 34, 36, 37, 41, 44, 46, 47, 48], "arbitrari": [1, 2, 13, 36], "ani": [1, 2, 3, 4, 5, 6, 12, 13, 14, 15, 16, 18, 20, 22, 28, 29, 34, 41, 47, 48, 49], "valid": [1, 6, 7, 10, 13, 19, 20, 24, 34, 39, 44], "long": [1, 2, 13, 16, 28], "exist": [1, 2, 4, 5, 6, 10, 13, 16, 19, 20, 28, 29, 34, 41, 46, 47, 48], "creat": [1, 2, 4, 5, 6, 11, 14, 15, 16, 19, 20, 22, 24, 28, 34, 41, 44, 46, 47, 48, 49], "postgr": [1, 2, 5, 6, 11, 13, 16, 47, 48], "psql": [1, 5, 13, 46, 48], "shell": [1, 5, 7, 16, 46, 47, 48], "line": [1, 2, 5, 11, 16, 34, 48, 49], "createdb": [1, 13, 48], "tabl": [1, 5, 13, 16, 28, 34, 48], "migrat": [1, 8, 10, 13, 20], "manag": [1, 4, 7, 10, 13, 14, 16, 17, 19, 20, 24, 28, 34, 47, 48, 49], "syncdb": 1, "superus": [1, 5, 13, 41, 45, 48], "system": [1, 2, 5, 11, 13, 15, 48], "create_default_us": [1, 5, 11, 13, 48], "demo": [1, 5, 41, 48], "demo123": [1, 48], "must": [1, 5, 11, 12, 13, 14, 15, 16, 34, 44, 47, 48], "ti": [1, 13, 34], "visit": [1, 9, 13, 48], "admin": [1, 6, 8, 11, 13, 17, 19, 24], "parent": [1, 10, 13, 19, 20, 24, 29, 34, 44], "them": [1, 5, 13, 16, 41, 49], "reli": [1, 13], "both": [1, 2, 5, 7, 10, 13, 15, 19, 20, 34, 48], "should": [1, 2, 5, 11, 13, 15, 16, 18, 22, 34, 41, 47, 48, 49], "celery_broker_url": [1, 13, 16, 48], "ntmprk": 1, "0001": 1, "usw2": 1, "amazonaw": [1, 6, 11], "6379": [1, 13, 16, 48], "1": [1, 2, 4, 5, 6, 8, 11, 12, 13, 15, 20, 22, 34, 41, 44, 47], "django_redi": [1, 13, 16, 48], "rediscach": [1, 13, 16, 48], "locat": [1, 5, 13, 16, 20, 48], "save": [1, 5, 7, 10, 13, 14, 20, 22, 24, 29, 34, 48], "match": [1, 5, 10, 11, 13, 16, 19, 20, 22, 28, 44], "qualiti": [1, 7, 10, 13, 17, 44], "check": [1, 3, 13, 16, 19, 20, 28, 34, 41, 44, 45, 49], "etc": [1, 2, 5, 6, 13, 14, 15, 19, 47, 49], "connect": [1, 9, 11, 13, 15, 16, 47], "queue": [1, 13, 16], "start": [1, 2, 5, 10, 11, 13, 24, 34, 39, 44, 46, 47], "l": [1, 6, 13, 48], "info": [1, 5, 11, 13, 34, 48], "c": [1, 5, 6, 12, 13, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 48], "2": [1, 2, 5, 6, 8, 11, 12, 13, 15, 20, 34, 46, 49], "max": [1, 5, 11, 13, 20, 48], "per": [1, 13, 15, 19, 20, 48, 49], "child": [1, 2, 13, 20, 24, 34, 41, 48], "1000": [1, 13, 20, 48], "eb": [1, 13, 48], "django_celery_beat": [1, 5, 13, 48], "schedul": [1, 13, 19, 45, 48], "databaseschedul": [1, 13, 48], "below": [2, 5, 6, 11, 16, 20, 22, 24, 28, 34, 41, 47, 48, 49], "out": [2, 5, 6, 7, 9, 12, 13, 20, 48, 49], "state": [2, 5, 12, 20, 29, 34], "need": [2, 5, 7, 9, 11, 13, 14, 15, 16, 19, 22, 34, 41, 44, 47, 48, 49], "our": [2, 9, 13, 29, 41], "primari": [2, 19, 20], "tree": [2, 44, 49], "structur": [2, 20, 28], "node": [2, 11, 37, 48], "tip": 2, "referenc": [2, 44], "take": [2, 11, 16, 28, 34, 37, 44], "ha": [2, 5, 13, 14, 15, 19, 20, 34, 46, 47], "load": [2, 13, 20, 24, 34], "csv": [2, 28], "contain": [2, 6, 8, 9, 11, 12, 16, 18, 24, 34, 41, 46, 49], "inform": [2, 4, 5, 7, 9, 10, 11, 14, 34], "about": [2, 5, 34], "one": [2, 3, 4, 5, 7, 11, 15, 16, 18, 20, 24, 28, 34, 44, 49], "first": [2, 5, 6, 11, 15, 16, 19, 20, 24, 28, 34, 37, 44, 47, 48], "bs0": 2, "At": [2, 4, 14, 15, 48, 49], "time": [2, 5, 6, 15, 16, 17, 20, 24, 34, 41, 47, 48, 49], "link": [2, 11, 16, 34, 37], "cb0": 2, "also": [2, 5, 9, 11, 12, 13, 15, 16, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 46, 47, 48], "relat": [2, 5, 16, 20, 24, 34, 41], "repres": [2, 5, 15, 19, 44], "databas": [2, 4, 6, 7, 8, 10, 14, 16, 20, 22, 29, 34, 47], "foreign": [2, 16, 44], "come": [2, 11, 20, 44], "fruition": 2, "sai": [2, 15], "bs1": 2, "wa": [2, 5, 15, 20, 22, 28, 34, 41, 44], "occur": [2, 5, 14, 15, 16], "bs2": 2, "merg": [2, 5, 10, 14, 16, 17, 34], "togeth": [2, 34], "given": [2, 3, 5, 15, 19, 22, 28, 34, 44], "record": [2, 3, 5, 14, 15, 19, 34], "b3": 2, "snapshot": [2, 15], "becaus": [2, 16, 19, 20, 49], "newer": [2, 5, 6, 13], "two": [2, 4, 5, 11, 15, 16, 22, 28, 34], "perspect": 2, "By": [2, 13, 34, 44, 48], "recent": [2, 15, 34], "allow": [2, 15, 18, 41, 44], "evolv": 2, "over": [2, 15, 34, 48, 49], "canon": [2, 29, 34, 49], "site": [2, 5, 7, 11, 34], "eui": [2, 16, 20, 34], "valu": [2, 4, 11, 13, 15, 20, 22, 24, 28, 34, 44, 47, 48, 49], "75": 2, "some": [2, 5, 7, 11, 15, 16, 34, 47, 48, 49], "chang": [2, 5, 15, 16, 20, 34, 47, 48, 49], "caus": [2, 12, 16, 49], "80": [2, 11, 13], "submit": [2, 5, 9], "linkag": 2, "other": [2, 4, 5, 7, 9, 10, 12, 13, 15, 16, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 48, 49], "order": [2, 5, 11, 14, 15, 16, 44, 47, 49], "keep": [2, 16], "track": [2, 49], "addit": [2, 5, 14, 15, 16], "seed_buildingsnapshot_children": 2, "would": [2, 13, 15, 19, 28], "throughout": [2, 34], "applic": [2, 5, 7, 9, 10, 11, 15, 18], "search_build": 2, "endpoint": [2, 5, 10, 28, 41, 44], "search": [2, 10, 17], "activ": [2, 7, 10, 17, 24, 45, 48], "search_mapping_result": 2, "regardless": [2, 34], "whether": [2, 3, 12, 14, 19, 28, 41], "dure": [2, 3, 5, 15, 19], "map": [2, 5, 10, 16, 17, 19, 22, 29, 34, 41, 49], "preview": [2, 15], "section": [2, 7, 11, 37, 48], "illustr": 2, "purpos": [2, 5, 12, 34], "let": [2, 36], "suppos": 2, "bs3": 2, "bs4": 2, "And": 2, "correspond": [2, 14, 44], "look": [2, 6, 11, 16, 44, 48, 49], "like": [2, 5, 6, 11, 16, 36, 44, 47, 48, 49], "process": [2, 5, 14, 15, 19, 24, 28, 34, 41, 44, 46, 48, 49], "raw": [2, 28, 34], "b0": 2, "c0": 2, "id1": 2, "11": [2, 5, 8], "id2": 2, "id3": 2, "13": [2, 5, 46], "id4": 2, "14": [2, 5, 46], "15": [2, 5], "sinc": [2, 5, 13, 15, 16, 34, 44, 48], "choos": [2, 15, 47, 49], "move": [2, 5, 13, 34], "onli": [2, 6, 15, 19, 20, 34, 41, 44, 45, 48], "deactiv": 2, "secondari": 2, "true": [2, 4, 5, 13, 19, 20, 22, 24, 28, 34, 36, 39, 44], "bs5": 2, "cb1": 2, "decid": [2, 13, 14, 28], "fals": [2, 5, 13, 18, 19, 20, 24, 28, 29, 34, 36, 44], "after": [2, 3, 4, 5, 6, 11, 15, 16, 19, 24, 34, 41, 47], "bs6": 2, "even": [2, 12, 15, 22, 48], "though": [2, 15, 22, 48], "normal": [2, 5, 15, 16, 22, 28, 34, 48], "its": [2, 11, 12, 15], "anytim": 2, "unmatch": 2, "leaf": 2, "conceptu": 2, "sometim": 2, "devil": 2, "detail": [2, 6, 15], "ad": [2, 15, 20, 22, 24, 28, 41], "least": [2, 15, 49], "consid": [2, 15, 22], "simpl": [2, 6, 11, 13, 15, 20, 34, 37, 41], "properti": [2, 3, 5, 6, 15, 16, 17, 19, 20, 22, 24, 28, 44], "id": [2, 5, 11, 16, 19, 20, 22, 24, 34, 36, 37, 41, 44, 48], "year": [2, 15, 20, 34, 41], "end": [2, 7, 10, 14, 34, 39], "floor": [2, 34], "area": [2, 20, 34], "address": [2, 5, 13, 16, 19, 20, 34, 41], "releas": [2, 6, 10, 11, 16, 34, 41], "date": [2, 20, 34, 44], "499045": 2, "2000": 2, "1234": [2, 5], "fake": [2, 16], "st": 2, "thing": [2, 44, 48], "upload": [2, 7, 10, 14], "see": [2, 4, 5, 7, 11, 13, 16, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45, 47, 49], "success": [2, 11, 19, 41, 44], "dialog": 2, "73700": 2, "modifi": [2, 11, 16, 34], "timestamp": [2, 44], "Then": [2, 15, 48], "lot": [2, 15, 20, 34], "empti": [2, 5, 11, 34], "source_typ": [2, 34, 41, 44], "0": [2, 4, 5, 7, 8, 13, 20, 28, 34, 39, 41, 44, 46, 47], "column": [2, 10, 14, 16, 17, 28, 29, 44], "which": [2, 5, 11, 13, 15, 16, 22, 24, 28, 34, 44, 47, 48, 49], "content": [2, 6, 17, 41], "extra_data_sourc": 2, "popul": [2, 5], "e": [2, 4, 5, 11, 13, 16, 28, 34, 37, 44, 46, 47, 48, 49], "owner_postal_code_source_id": 2, "interest": [2, 34], "import_file_id": [2, 34], "refer": [2, 15, 16, 34], "data_importer_importfil": 2, "befor": [2, 6, 11, 15, 16, 20, 24, 41, 44, 47, 48], "hit": [2, 11], "continu": 2, "button": [2, 3, 49], "second": [2, 37], "73701": 2, "screen": [2, 16], "pm_property_id": [2, 20, 34], "year_end": [2, 20, 34], "gross_floor_area": [2, 20, 34], "address_line_1": [2, 20, 34], "release_d": [2, 20, 34], "That": [2, 15], "now": [2, 11, 19, 28, 48, 49], "same": [2, 5, 7, 10, 11, 15, 16, 28, 34, 37, 41, 44, 48], "next": [2, 15, 28], "2001": 2, "As": [2, 15, 49], "73702": 2, "pattern": [2, 44], "similarli": 2, "73703": 2, "appear": [2, 5, 44, 47], "howev": [2, 4, 5, 12, 16, 20, 44], "abl": [2, 11, 41], "make": [2, 5, 6, 7, 11, 15, 16, 18, 34, 41, 47, 48, 49], "confirm": [2, 41], "73704": 2, "ident": 2, "term": 2, "except": [2, 20, 24, 34, 36, 41, 45], "differ": [2, 5, 9, 11, 13, 15, 20, 22, 28, 29, 41, 47, 48, 49], "confid": [2, 5, 28, 34, 41], "canonical_building_id": 2, "null": 2, "last_modified_by_id": 2, "landing_seedus": [2, 48], "address_line_1_source_id": 2, "gross_floor_area_source_id": 2, "pm_property_id_source_id": 2, "release_date_source_id": 2, "year_ending_source_id": 2, "summar": 2, "5": [2, 5, 8, 12, 20, 34], "were": [2, 5, 15, 16, 22, 34], "twice": [2, 15], "row": [2, 3, 16, 20], "step": [2, 5, 11, 13, 15, 16, 24, 48, 49], "20505": 2, "There": [2, 5, 11, 16, 49], "still": [2, 5, 48], "orgs_organ": 2, "filter": [2, 5, 19, 44], "get_build": 2, "membership": 2, "sourc": [2, 5, 7, 9, 10, 12, 16, 34, 47, 48, 49], "extend": [2, 19], "note": [2, 4, 6, 10, 13, 16, 19, 24, 34, 44, 47, 48, 49], "made": [2, 28], "input": 2, "none": [2, 5, 11, 19, 20, 24, 28, 34, 36, 37, 39, 41, 44], "itself": [2, 5], "so": [2, 5, 7, 14, 15, 16, 22, 28, 34, 44, 47, 49], "block": [2, 11, 34, 48], "number": [2, 5, 11, 15, 16, 19, 20, 34, 44, 45, 48], "block_number_source_id": 2, "unlik": [2, 11], "who": [2, 48], "block_numb": [2, 34], "nevertheless": 2, "year_built": [2, 20, 34, 41], "those": [2, 11, 15, 28, 34, 44], "street": 2, "usual": [2, 18, 48], "cannot": [2, 20, 34], "serv": 2, "storag": [2, 13, 16, 20, 24], "an_unknown_field": 2, "something_els": [2, 19], "some_buildingsnapshot_id": 2, "another_buildingsnapshot_id": 2, "truncat": 2, "too": [2, 49], "255": 2, "charact": 2, "jurisdiction_tax_lot_id": [2, 20, 34], "custom_id_1": [2, 20, 34], "ubid": [2, 34], "lot_numb": [2, 34], "district": [2, 34], "owner": [2, 12, 13, 15, 34, 41, 48], "owner_email": [2, 34], "owner_telephon": [2, 34], "owner_address": [2, 34, 41], "owner_city_st": [2, 34], "owner_postal_cod": [2, 34], "property_nam": [2, 34], "address_line_2": [2, 34], "citi": [2, 34], "postal_cod": [2, 34], "state_provinc": 2, "building_certif": [2, 34], "No": [2, 16], "store": [2, 5, 11, 20, 24, 34, 47], "run": [3, 4, 5, 6, 8, 11, 15, 16, 19, 45, 46, 49], "pair": [3, 10, 15, 16, 20, 41], "taxlot": [3, 5, 15, 16, 17, 19, 20, 49], "demand": 3, "select": [3, 5, 9, 11, 15, 24, 28, 41, 46], "inventori": [3, 29, 34], "page": [3, 4, 5, 10, 15, 19, 41, 48], "action": [3, 4, 5, 11, 15, 45], "defin": [3, 5, 14, 20, 24, 28, 34], "rule": [3, 15, 17, 20, 44], "broken": 3, "satisfi": 3, "notabl": 3, "when": [3, 5, 10, 11, 13, 14, 16, 19, 20, 24, 34, 41, 44, 45, 47, 48], "label": [3, 5, 15, 17, 20, 34, 44], "appli": [3, 5, 14, 20], "elabor": 3, "attach": [3, 48], "break": [3, 47], "doe": [3, 4, 5, 7, 10, 20, 29, 44, 48], "happen": [3, 10, 14, 15, 16], "due": [3, 5, 13, 47], "perform": [3, 4, 5, 7, 10, 16, 19, 45], "reason": [3, 15], "intend": [4, 48], "linux": [4, 6, 10, 47], "cloud": [4, 11], "aw": [4, 10, 48], "hardwar": 4, "offici": 4, "window": [4, 5, 8, 11], "product": [4, 5, 6, 12, 18, 47], "desir": [4, 5, 11, 13, 44, 48], "setup": [4, 5, 10, 19, 24, 41, 48], "prerequisit": [4, 8], "depend": [4, 5, 8, 11, 16], "javascript": [4, 5, 7, 8, 10], "configur": [4, 5, 8, 10, 16, 17, 20, 47], "cach": [4, 16, 19, 20, 34, 41, 48], "broker": [4, 48], "celeri": [4, 5, 16, 20, 36, 45, 47, 48], "background": 4, "task": [4, 17, 20, 22, 45, 48], "worker": [4, 45, 48], "initi": [4, 5, 15, 20, 24, 28, 41, 44, 46, 48], "web": [4, 5, 6, 7, 10, 14, 47], "environ": [4, 5, 11, 47, 48], "variabl": [4, 5, 11, 18, 37, 47, 48], "mail": 4, "servic": [4, 6, 11, 12, 16, 49], "deploi": [4, 5, 11, 16], "kubernet": [4, 10], "helm": [4, 10], "cluster": 4, "resourc": [4, 10], "through": [4, 5, 11, 12, 34, 49], "variou": [4, 5, 9, 16], "custom": [4, 5, 6, 16, 18, 20, 22, 28, 34], "webserv": [4, 47], "issu": [4, 5, 9, 10, 13, 16, 44, 47], "enabl": [4, 5, 9, 11, 20, 44, 48], "up": [4, 5, 11, 13, 15, 16, 20, 24, 41, 44, 47, 48, 49], "io": [4, 5, 6], "raven_config": 4, "sentry_js_dsn": [4, 11], "frontend": 4, "moment": [4, 13], "sentry_sdk": 4, "integr": [4, 10], "djangointegr": 4, "celeryintegr": 4, "init": [4, 48], "dsn": [4, 11], "ingest": 4, "job": 4, "traces_sample_r": 4, "captur": [4, 5, 15], "100": [4, 11, 20, 39], "transact": 4, "we": [4, 5, 11, 13, 14, 19, 34, 41, 44, 49], "adjust": [4, 49], "wish": 4, "associ": [4, 15, 20, 34], "assum": [4, 11, 24, 44, 46, 48], "mai": [4, 12, 15, 16, 34, 44, 47, 48], "send": [4, 11, 13, 19, 20, 24], "pii": 4, "send_default_pii": 4, "job_id": 4, "3": [5, 11, 12, 13, 15, 20, 34, 46, 47, 48], "beta": 5, "22": 5, "21": [5, 11], "20": 5, "19": 5, "17": 5, "16": [5, 13], "10": [5, 11, 13, 20, 44, 47], "7": [5, 46], "osx": [5, 8], "translat": [5, 10], "philosophi": 5, "style": [5, 44], "don": [5, 47], "t": [5, 15, 16, 34, 44, 47, 48], "crazi": 5, "indirect": [5, 12], "interpol": 5, "precommit": 5, "format": [5, 11, 16, 19, 20, 28, 34, 41, 49], "static": [5, 13, 16, 20, 34, 36], "verifi": [5, 6, 13, 49], "syntax": 5, "call": [5, 11, 14, 20, 24, 28, 34, 36, 41, 44, 48], "tox": 5, "begin": 5, "codebas": [5, 22], "benefit": [5, 7, 10], "elimin": 5, "accident": [5, 15], "mistak": 5, "prevent": [5, 15], "bug": 5, "well": [5, 7, 10, 16, 41, 44], "better": [5, 48, 49], "experi": 5, "exhaust": 5, "annot": 5, "function": [5, 7, 10, 11, 17, 19, 34, 37, 41, 44], "refactor": 5, "might": [5, 15, 18], "benefici": 5, "ambigu": [5, 15], "determin": [5, 34, 44], "ton": 5, "effort": 5, "built": [5, 20, 24, 34, 41], "collect": 5, "dict": [5, 19, 20, 28, 29, 34, 36, 41], "tupl": [5, 28, 34, 44], "capit": 5, "modul": [5, 10, 18, 41], "typeddict": 5, "notrequir": 5, "typing_extens": 5, "packag": [5, 8, 10, 11, 13, 17], "option": [5, 13, 19, 24, 34, 37, 44], "dictionari": [5, 20, 29, 34, 41], "common": [5, 6, 11], "gotcha": 5, "try": [5, 15, 28, 36, 41, 47], "class": [5, 19, 20, 22, 24, 28, 34, 36, 37, 39, 41, 44], "method": [5, 7, 10, 16, 19, 20, 22, 24, 28, 34, 36, 41, 44], "__future__": 5, "re": [5, 11, 15, 41, 46, 48, 49], "warn": [5, 20], "runtim": 5, "sure": [5, 6, 7, 11, 16, 34, 41, 47, 48], "wast": 5, "pleas": [5, 9], "checker": 5, "feel": 5, "free": 5, "throw": 5, "ignor": [5, 15, 34], "problemat": 5, "top": [5, 24, 34, 49], "ci": 5, "current": [5, 19, 20, 34, 45, 46, 49], "mypi": 5, "own": [5, 13, 15], "extens": [5, 16, 34, 46, 48], "vscode": 5, "pylanc": 5, "microsoft": 5, "pyright": 5, "typecheck": 5, "complic": 5, "mix": 5, "extra": [5, 29, 34], "propertyst": [5, 16, 17, 20, 29, 34], "taxlotst": [5, 16, 17, 20, 29, 34], "model": [5, 7, 10, 14, 16, 17, 29, 36, 44], "yet": 5, "database_column": [5, 34], "copar": [5, 34], "sql": [5, 34], "keep_field": 5, "makemigr": 5, "script": [5, 6, 16, 44, 48, 49], "new_db_field": 5, "def": [5, 19, 36], "forward": [5, 11, 20, 24, 34], "schema_editor": 5, "get_model": 5, "column_nam": [5, 16, 34, 41], "geocoding_confid": [5, 34], "table_nam": [5, 16, 20, 34], "display_nam": [5, 20, 34], "geocod": [5, 16, 34, 48], "column_descript": [5, 34], "data_typ": [5, 20, 34], "is_extra_data": [5, 16, 34], "count": [5, 34], "elif": 5, "col": [5, 28], "els": [5, 36], "than": [5, 11, 12, 15, 20, 28, 49], "0090_auto_20180425_1154": 5, "oper": 5, "runpython": 5, "unit": [5, 12, 16, 17, 20, 22, 34, 45], "fix": [5, 16], "failur": 5, "test_mapping_data": [5, 17], "test_kei": 5, "test_column": 5, "test_column_retrieve_schema": 5, "test_column_retrieve_db_field": 5, "workflow": [5, 9, 28], "toggl": 5, "mainten": 5, "mode": [5, 47, 48], "displai": [5, 15, 16, 34, 47], "api": [5, 7, 8, 9, 10, 14, 16, 17, 19, 24, 28, 41, 49], "exec": [5, 11, 16, 46, 47], "seed_web": [5, 47], "sh": [5, 6, 16, 48, 49], "off": [5, 44, 47], "angular": [5, 49], "delimit": 5, "thu": 5, "renam": [5, 34], "interpolateprovid": 5, "startsymbol": 5, "endsymbol": 5, "eas": [5, 11], "automat": [5, 15, 16, 49], "readthedoc": 5, "en": 5, "latest": [5, 11, 15, 46], "html": [5, 11, 13, 49], "xmlhttprequest": 5, "cooki": [5, 6, 24], "x": [5, 6], "csrftoken": 5, "seed_app": 5, "statehelperprovid": 5, "urlrouterprovid": 5, "locationprovid": 5, "home": [5, 6, 34, 45], "templateurl": 5, "static_url": [5, 13], "control": [5, 16, 34, 49], "profile_control": 5, "resolv": [5, 6, 15], "auth_payload": 5, "auth_servic": 5, "q": [5, 13, 19], "user_servic": 5, "var": [5, 48], "get_organ": [5, 44], "is_author": 5, "requires_superus": 5, "user_profile_payload": 5, "get_user_profil": 5, "found": [5, 11, 15, 34, 48], "doc": [5, 11, 48], "djangoproject": 5, "topic": [5, 9], "standard": [5, 7, 12, 18], "logger": 5, "level": [5, 15, 18, 20, 41, 44], "describ": [5, 14, 15, 34, 47], "sever": [5, 16, 20], "debug": [5, 13], "low": [5, 16, 20, 34], "minor": 5, "problem": [5, 9], "major": [5, 49], "critic": 5, "written": [5, 7, 10, 12, 19], "do": [5, 11, 15, 16, 19, 28, 34, 44, 47, 48, 49], "hardcod": 5, "goal": [5, 15, 20, 34], "dynam": [5, 20, 24, 34], "espm": 5, "blob": [5, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "lib": [5, 10, 16, 17, 19, 38, 39, 44, 48], "pm": [5, 22, 28, 34], "brief": 5, "descript": [5, 18, 20, 34], "how": [5, 9, 10, 49], "drop": [5, 46], "distribut": [5, 12], "part": [5, 16, 28], "third": [5, 11, 13], "last": [5, 15], "span": 5, "multipl": [5, 7, 10, 15, 16, 34], "createus": [5, 13, 48], "seedus": [5, 9, 11, 13, 16, 17, 24, 46, 48], "IF": [5, 12], "NOT": [5, 12], "postgi": [5, 8, 13, 16, 46], "timescaledb": [5, 8, 13, 16, 46], "testorg": 5, "timescaledb_pre_restor": [5, 46], "previou": [5, 44], "pg_restor": [5, 46], "backup": [5, 6, 16, 24, 47], "prod": [5, 11, 13], "prod_20191203_000002": 5, "installed_vers": 5, "being": [5, 15, 19, 24, 44, 45, 47, 48], "default_vers": 5, "pg_available_extens": 5, "timescaledb_post_restor": [5, 46], "disabl": 5, "celerybeat": 5, "salesforc": [5, 19], "domain": [5, 19], "dev1": 5, "salesforce_en": 5, "periodictask": 5, "name__startswith": 5, "salesforce_sync_org": 5, "update_chang": 5, "jasmin": [5, 45], "angular_js_test": [5, 45], "vcr": 5, "cassett": 5, "reus": 5, "respons": [5, 6, 10, 19, 24], "unless": [5, 44, 47], "want": [5, 11, 16, 24, 34, 47, 48], "refresh": 5, "isn": 5, "anyth": [5, 7], "logic": [5, 34], "mapquest": [5, 8, 16], "work": [5, 6, 7, 10, 11, 12, 13, 16, 44, 47, 48], "ll": [5, 47, 49], "small": [5, 19], "testing_mapquest_api_kei": 5, "actual": [5, 15, 41], "just": [5, 11, 15, 24, 34, 37, 47, 48, 49], "delet": [5, 16, 20, 22, 34], "old": [5, 6, 15, 16, 34], "ones": [5, 16, 22], "vcr_cassett": 5, "hidden": 5, "push": [5, 49], "coverag": 5, "report": [5, 9, 34, 41], "under": [5, 48, 49], "83": 5, "eslint": 5, "scss": 5, "stylelint": 5, "prettier": 5, "lint": 5, "older": [5, 16, 47], "websit": [5, 9, 11, 13, 48, 49], "rm": [5, 6, 16, 46], "rf": [5, 16], "htmlout": 5, "sphinx": 5, "b": [5, 15, 28, 41, 44], "code_document": 5, "new_vers": 5, "developer_resourc": 5, "md": [5, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "outsid": 5, "nation": [5, 7, 10, 12], "lab": 5, "review": [5, 9, 49], "fill": [5, 6, 9, 34, 49], "agreement": 5, "fork": 5, "otherwis": [5, 6, 12], "ensur": [5, 11, 20, 24, 34, 44], "ticket": 5, "assign": [5, 19, 34], "board": 5, "progress": [5, 19, 20, 41, 49], "tracker": 5, "branch": [5, 19], "hotfix": 5, "appropri": [5, 6, 44, 47], "convent": 5, "issue_id": 5, "short": [5, 6, 24], "write": [5, 15, 44], "upon": [5, 16], "complet": [5, 15, 16], "pull": [5, 11, 49], "pr": [5, 16], "against": [5, 19, 20, 44], "auto": [5, 10, 49], "featur": [5, 9, 10, 15, 17, 19, 24, 49], "donotpublish": 5, "present": [5, 34, 44], "enhanc": 5, "improv": [5, 7, 10], "publish": [5, 11], "onc": [5, 11, 13, 14, 15, 19, 46, 47, 49], "approv": [5, 12], "readi": [5, 11, 13, 48], "prepar": [5, 16], "prep": 5, "root": [5, 11, 16, 34, 41, 48], "alwai": [5, 15, 34], "rst": 5, "draft": 5, "changelog": 5, "cleanup": [5, 22, 34], "spell": 5, "correct": [5, 11, 16, 19, 34], "letter": 5, "miss": [5, 20, 34], "ui": [5, 11, 14, 34, 49], "lokalis": [5, 49], "main": [5, 9, 11, 14, 17, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 48], "hub": 5, "seedplatform": [5, 6, 11], "amazon": [6, 11, 13], "m5ad": 6, "xlarg": 6, "launch": [6, 11], "remov": [6, 11, 16, 20, 28, 34, 47], "containerd": 6, "runc": 6, "commun": [6, 9, 16], "edit": [6, 15, 48], "transport": 6, "ca": 6, "certif": [6, 34, 41], "gnupg": 6, "agent": 6, "softwar": [6, 7, 10, 12], "fssl": 6, "download": [6, 11, 48], "gpg": 6, "deb": 6, "arch": 6, "amd64": 6, "lsb_releas": 6, "stabl": 6, "ce": 6, "cli": [6, 49], "group": [6, 7, 10, 15, 24], "groupadd": 6, "usermod": 6, "ag": [6, 16], "newgrp": 6, "dn": [6, 13], "correctli": [6, 20, 34], "ip": 6, "v6": 6, "getent": 6, "tutum": 6, "dnsutil": 6, "nslookup": 6, "west": [6, 11], "compos": [6, 16, 47], "25": 6, "unam": 6, "m": 6, "o": [6, 36], "usr": [6, 13, 16, 48], "bin": [6, 13, 16, 48], "chmod": 6, "checkout": [6, 16, 48], "export": [6, 13, 17, 19, 48], "postgres_us": [6, 11, 46], "postgres_db": [6, 11, 46], "postgres_password": [6, 11, 46], "gdeus3fasd1askj89qkaldjfx": 6, "postgres_port": [6, 11], "5432": [6, 11, 13, 16, 48], "secret_kei": [6, 11], "96": 6, "7jg": 6, "_": 6, "z9c9qwwu2": 6, "w": 6, "hb3r322yf3lz": 6, "ekw": 6, "ly": 6, "until": [6, 11, 47], "restor": [6, 10, 48], "seed_admin_us": [6, 11], "seed_admin_password": [6, 11], "7febwal38": 6, "k3jlfa92lakj8ih4": 6, "seed_admin_org": [6, 11], "aws_access_key_id": [6, 11], "aws_access_kei": 6, "aws_secret_access_kei": [6, 11], "aws_secret_kei": 6, "aws_ses_region_nam": [6, 11], "aws_ses_region_endpoint": [6, 11], "server_email": [6, 11], "durat": 6, "cookie_expir": [6, 11], "1209600": [6, 11], "persist": [6, 15, 34], "volum": [6, 11, 22, 47], "seed_pgdata": [6, 47], "seed_media": [6, 47], "mkdir": [6, 48], "p": [6, 13, 48], "path": [6, 19, 24, 34, 41, 48], "dir": 6, "wai": [6, 11, 12, 13, 48, 49], "swarm": 6, "stack": 6, "implement": [6, 7, 10, 20, 24, 34, 36, 41], "simpli": [6, 16, 20], "yml": [6, 11, 16, 47, 49], "filenam": [6, 34], "bash": [6, 11, 46], "replac": [6, 11, 13, 16, 18, 48], "energi": [7, 9, 12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "effici": [7, 12, 34], "help": [7, 10, 16, 47, 48], "easili": [7, 10, 16, 19, 28], "larg": [7, 10, 11], "combin": [7, 10, 15, 18, 48], "clean": [7, 10, 16, 34, 44], "share": [7, 10, 16, 19, 46], "easi": [7, 10, 11, 13, 48], "flexibl": [7, 10], "cost": [7, 10], "effect": [7, 10, 16], "demonstr": [7, 10], "econom": [7, 10], "environment": [7, 10], "program": [7, 10, 12, 15], "target": [7, 10, 15, 48], "invest": [7, 10], "angularj": [7, 10, 45], "bootstrap": [7, 10, 48], "front": [7, 10], "back": [7, 10, 14, 48], "browser": [7, 10, 48, 49], "interfac": [7, 10, 11], "full": [7, 10, 22, 34], "renew": [7, 10], "laboratori": [7, 10, 12], "fund": [7, 10], "depart": [7, 10, 12], "newdomain": 7, "staticfiles_storag": [7, 16], "comment": [7, 34, 48], "redeploi": 7, "recollect": 7, "compress": 7, "nodej": [8, 13], "nativ": [8, 11, 16, 49], "tutori": 9, "learn": 9, "forum": 9, "announc": 9, "question": [9, 10, 34], "buildingenergytool": 9, "inquiri": 9, "specif": [9, 12, 13, 15, 20, 22, 34], "tool": [9, 11, 49], "desk": 9, "relev": 9, "buildingdata": 9, "gov": [9, 28, 29], "open": [9, 16, 46, 47, 48], "compon": 9, "client": [9, 14, 41, 44], "dataset": [9, 41], "encourag": 9, "seeddevelop": 9, "guid": 10, "monitor": [10, 11], "authent": [10, 13, 44, 45], "payload": 10, "children": [10, 20, 24, 34], "v": [10, 41, 44, 46], "what": [10, 11, 13, 34, 47, 48], "realli": [10, 15], "buildingsnapshot": 10, "canonicalbuild": 10, "_source_id": 10, "field": [10, 15, 16, 19, 20, 24, 28, 29, 34, 36, 44, 48], "extra_data": [10, 20, 34, 44], "possibl": [10, 12, 15, 22, 29], "loss": [10, 12], "why": 10, "depth": 10, "land": [10, 17, 19], "public": [10, 17, 34], "serial": [10, 17, 44], "test": [10, 13, 16, 17, 19, 22, 31, 45, 48], "util": [10, 16, 17, 24], "nginx": [10, 13], "log": [10, 19, 34, 41, 44, 47, 48, 49], "bede": [10, 17], "complianc": 10, "reset": [10, 19, 20, 24, 47], "contribut": 10, "best": [10, 15], "practic": 10, "licens": [10, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "ask": 10, "index": [10, 13], "robust": 11, "orchestr": 11, "further": 11, "choic": 11, "slightli": 11, "provis": 11, "googl": [11, 49], "gcp": 11, "azur": 11, "ak": 11, "userguid": 11, "cliv2": 11, "insert": [11, 34, 47], "secret": [11, 47, 48], "region": [11, 13], "east": [11, 13, 34], "output": [11, 47], "mac": [11, 47, 48], "homebrew": [11, 48], "brew": [11, 16, 48, 49], "did": [11, 20], "properli": [11, 41], "pod": 11, "replicaset": 11, "unfamiliar": 11, "gui": 11, "One": 11, "dashboard": 11, "parti": [11, 12, 13], "octant": 11, "eksctl": 11, "elast": 11, "disregard": 11, "eksct": 11, "termin": [11, 48], "adequ": 11, "permiss": [11, 12, 24], "bracket": 11, "m5": 11, "min": [11, 20, 28], "tag": [11, 37, 49], "env": [11, 47, 48], "persistentvolum": 11, "media": [11, 24, 47], "access_key_id": 11, "secret_access_kei": 11, "django_settings_modul": [11, 13, 48], "super": [11, 44, 47, 48], "yaml": [11, 19], "bsyncr": 11, "analysi": [11, 15], "bsyncr_server_port": 11, "5000": [11, 16], "bsyncr_server_host": 11, "sentri": 11, "sentry_raven_dsn": 11, "self": [11, 19, 24, 28, 34, 36, 44, 45], "registr": 11, "secur": 11, "google_recaptcha_site_kei": 11, "recaptcha": 11, "google_recaptcha_secret_kei": 11, "imag": [11, 46, 47], "noaa": 11, "noaa_token": 11, "context": [11, 17, 37, 45], "onlin": 11, "status": 11, "extern": 11, "ingress": 11, "someth": [11, 47, 48], "loadbalanc": 11, "154": 11, "227": 11, "my": [11, 13, 48], "uniqu": [11, 16, 34], "32291": 11, "tcp": 11, "dedeploi": 11, "find": [11, 15, 20, 34, 48], "talk": 11, "kubeconfig": 11, "yourself": [11, 47, 48], "seedorg": [11, 48], "badpass": [11, 13, 48], "restart": [11, 13, 16, 24, 47, 48], "rollout": 11, "copyright": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "2017": 12, "2024": [12, 20], "allianc": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "sustain": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "llc": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "contributor": [12, 18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "right": [12, 29, 49], "reserv": [12, 45], "redistribut": 12, "binari": 12, "modif": [12, 19], "permit": 12, "condit": [12, 20, 34], "met": 12, "retain": [12, 34], "notic": 12, "disclaim": 12, "reproduc": 12, "materi": 12, "neither": 12, "holder": [12, 41], "nor": 12, "endors": 12, "promot": [12, 34], "deriv": [12, 34], "prior": 12, "claus": 12, "trademark": 12, "confusingli": 12, "similar": [12, 13, 34], "design": 12, "govern": 12, "employe": 12, "respect": [12, 34], "BY": 12, "THE": 12, "AND": 12, "AS": 12, "express": [12, 49], "OR": [12, 44], "impli": 12, "warranti": 12, "BUT": 12, "limit": 12, "TO": [12, 13, 48], "OF": 12, "merchant": 12, "fit": 12, "FOR": 12, "particular": [12, 14, 15, 24, 34], "IN": 12, "NO": 12, "event": [12, 15, 34], "shall": 12, "THEIR": 12, "BE": 12, "liabl": 12, "direct": 12, "incident": 12, "special": [12, 16, 34], "exemplari": 12, "consequenti": 12, "damag": 12, "procur": 12, "substitut": 12, "good": [12, 41], "profit": 12, "busi": 12, "interrupt": 12, "ON": [12, 13, 48], "theori": 12, "liabil": 12, "contract": 12, "strict": 12, "tort": 12, "neglig": 12, "aris": 12, "advis": 12, "SUCH": 12, "2014": 12, "regent": 12, "univers": 12, "california": 12, "lawrenc": 12, "berkelei": 12, "subject": [12, 24], "receipt": 12, "dept": 12, "thereof": 12, "while": [13, 15, 47], "bare": 13, "bone": 13, "counterpart": 13, "desktop": [13, 47], "ppa": [13, 16], "timescal": [13, 16, 46, 48], "python3": [13, 48], "gdal": 13, "seeddb": [13, 16, 48], "seedpass": [13, 16, 48], "prompt": [13, 48], "tune": [13, 16], "su": [13, 48], "grant": [13, 48], "privileg": [13, 48], "alter": [13, 46, 48], "createrol": 13, "exit": [13, 48], "pip3": [13, 16], "gi": [13, 16, 48], "localhost": [13, 16, 48], "could": [13, 16, 18, 28, 36, 47, 48], "mysql": 13, "dbshell": 13, "127": [13, 16, 41, 47, 48], "lbnl": 13, "Of": [13, 48], "cours": [13, 48], "somewher": [13, 48], "8000": [13, 48], "runserv": [13, 18, 48], "sit": 13, "behind": [13, 16], "dj": 13, "collectstat": 13, "lock": [13, 19, 41], "node_modul": 13, "openlay": 13, "ext": 13, "static_root": 13, "collected_stat": 13, "dedic": 13, "receiv": [13, 34, 41], "bashrc": [13, 48], "overrid": [13, 22, 34, 44], "sentry_dsn": 13, "xyz": 13, "getsentri": 13, "123": 13, "only_http": 13, "email_backend": 13, "django_s": 13, "sesbackend": 13, "consol": [13, 49], "quickstart": 13, "sandbox": 13, "sender": [13, 34], "recipi": 13, "notif": 13, "sn": 13, "notifi": 13, "bounc": 13, "dkim": 13, "spf": 13, "put": [13, 34, 48, 49], "compat": [13, 20], "gmail": 13, "emailbackend": 13, "domain_urlconf": 13, "down": [14, 44, 47], "overview": 14, "batch": 14, "invok": 14, "save_raw_data": 14, "done": [14, 19, 44, 48, 49], "know": [14, 15], "portfolio": [14, 22, 28], "metadata": 14, "data_import": [14, 22], "dataimportbackend": 14, "upload_complet": 14, "attribut": [14, 29, 44], "importfil": [14, 22, 44], "subsequ": [14, 15], "exactli": 14, "space": [14, 24, 34], "uppercas": 14, "relationship": [15, 34, 44], "between": [15, 24, 47, 48], "tax": [15, 20, 34], "thei": [15, 20, 28, 34, 45, 48], "criteria": 15, "customiz": 15, "high": [15, 20, 34], "identifi": [15, 16, 20], "represent": [15, 19], "discard": 15, "phone": 15, "shouldn": [15, 16], "much": [15, 41, 48], "whenev": 15, "execut": [15, 20, 24, 34, 45], "few": [15, 49], "unrel": 15, "scope": 15, "scenario": [15, 34], "exclud": [15, 19, 20, 22, 34], "overlap": 15, "prioriti": [15, 29, 34], "final": [15, 16, 28], "give": [15, 48], "protect": [15, 44], "period": [15, 34], "meter": [15, 16, 17, 22, 34], "mean": 15, "aggreg": 15, "altern": 15, "themselv": [15, 49], "mention": 15, "earlier": 15, "assumpt": 15, "avoid": [15, 48, 49], "unresolv": 15, "situat": [15, 47], "wouldn": 15, "cross": 15, "alreadi": [15, 16, 34, 48], "individu": 15, "explicit": 15, "trigger": [15, 47], "explicitli": 15, "chosen": 15, "incom": 15, "whole": [15, 18, 49], "round": 15, "origin": [15, 34], "establish": 15, "reestablish": 15, "commit": [15, 49], "affect": 15, "difficult": 15, "revers": [15, 20, 24, 34], "tri": 15, "unmerg": 15, "unlink": 15, "intervent": 15, "accomplish": 15, "veri": [15, 16, 34], "fact": 15, "lead": 15, "carri": 15, "consider": [15, 22], "taken": [15, 19, 22], "entri": [15, 19], "anoth": [15, 18], "oppos": 15, "amongst": 15, "duplic": [15, 16, 28, 34, 41, 48, 49], "flag": 15, "doesn": [15, 47], "bit": 16, "celery_result_backend": 16, "celery_task_default_queu": 16, "celery_task_queu": 16, "exchang": 16, "routing_kei": 16, "notat": 16, "protocol": 16, "censu": 16, "tract": 16, "disadvantag": 16, "around": [16, 44], "minut": 16, "across": [16, 19, 34], "gaug": 16, "impact": 16, "deprec": [16, 41], "often": 16, "aros": 16, "upsert": 16, "typic": [16, 20, 34], "seed_column": 16, "300": 16, "kbtu": [16, 20], "ft2": 16, "units_pint": [16, 34], "complex": 16, "column_id": [16, 34], "seed_columnmapping_": 16, "constraint": 16, "seed_columnmapping_column_raw": 16, "old_id": 16, "seed_columnmapping_column_map": 16, "encount": [16, 19], "0118_match_merge_link_all_org": 16, "reorder": 16, "118": 16, "recogn": 16, "cycl": [16, 17, 41], "fulli": [16, 24], "superperm": 16, "whole_org_match_merge_link": 16, "insid": [16, 41, 47], "seri": 16, "tap": [16, 49], "timescaledb_mov": 16, "awhil": 16, "recalcul": 16, "pars": [16, 19, 34], "bldg": [16, 34], "cast": [16, 34], "bytestr": 16, "On": 16, "indic": [16, 41], "postgres_container_id": 16, "operationalerror": 16, "bower": 16, "vendor": 16, "css": 16, "default_file_storag": 16, "filesystemstorag": 16, "sign": 16, "submodul": [17, 25, 38], "templat": [17, 34, 45, 48], "sentry_j": [17, 18], "session_kei": [17, 18], "de_camel_cas": [17, 18], "robots_txt": [17, 18], "wsgi": [17, 19], "inherit": 17, "comparisonerror": [17, 20], "dataqualitycheck": [17, 20], "dataqualitytypecasterror": [17, 20], "unitmismatcherror": [17, 20], "format_pint_viol": [17, 20], "notdeletedmanag": [17, 22], "kbtu_thermal_conversion_factor": [17, 22], "kgal_water_conversion_factor": [17, 22], "usage_point_id": [17, 22], "subpackag": [17, 41], "customcreateuserform": [17, 24], "loginform": [17, 24], "userlogintest": [17, 24], "customloginview": [17, 24], "account_activation_s": [17, 24], "create_account": [17, 24], "landing_pag": [17, 24], "password_reset": [17, 24], "password_reset_complet": [17, 24], "password_reset_confirm": [17, 24], "password_reset_don": [17, 24], "password_set": [17, 24], "signup": [17, 19, 24, 41], "mapper": [17, 19], "create_column_regex": [17, 28], "get_pm_map": [17, 28], "mapping_column": 17, "mappingcolumn": [17, 28], "sort_dupl": [17, 28], "mapping_data": 17, "test_mapp": 17, "test_mapping_column": 17, "get_attrs_with_map": [17, 29], "get_propertystate_attr": [17, 29], "get_state_attr": [17, 29], "get_state_to_state_tupl": [17, 29], "get_taxlotstate_attr": [17, 29], "merge_st": [17, 29, 34], "seed_map": [17, 19], "auditlog": 17, "columncasterror": [17, 34], "validate_model": [17, 34], "statuslabel": [17, 20, 34, 36], "propertyauditlog": [17, 34], "propertyview": [17, 20, 34], "propertyviewlabel": [17, 34], "post_save_properti": [17, 34], "post_save_property_st": [17, 34], "post_save_property_view": [17, 34], "pre_delete_st": [17, 34], "set_default_access_level_inst": [17, 34], "sync_latitude_longitude_and_long_lat": [17, 34], "taxlotauditlog": [17, 34], "taxlotview": [17, 20, 34], "post_save_taxlot_st": [17, 34], "post_save_taxlot_view": [17, 34], "templatetag": [17, 19], "helper": [17, 19, 28, 37, 41, 44], "decor": [17, 44], "drfendpointmixin": [17, 19], "ajax_request": [17, 19], "ajax_request_class": [17, 19], "decorator_to_mixin": [17, 19], "get_prog_kei": [17, 19], "lock_and_track": [17, 19], "require_organization_id": [17, 19], "require_organization_id_class": [17, 19], "require_organization_membership": [17, 19], "factori": [17, 38, 39, 41], "build_shared_buildings_org": [17, 19], "create_inventory_queryset": [17, 19], "get_inventory_fieldnam": [17, 19], "get_orgs_w_public_field": [17, 19], "inventory_search_filter_sort": [17, 19], "parse_bodi": [17, 19], "process_search_param": [17, 19], "search_inventori": [17, 19], "search_properti": [17, 19], "search_taxlot": [17, 19], "delete_organ": [17, 19], "invite_new_user_to_se": [17, 19], "send_salesforce_error_log": [17, 19], "signuptokengener": [17, 19], "celerydatetimeseri": [17, 36], "labelseri": [17, 36], "adminviewstest": [17, 19, 41], "classdecoratortest": [17, 19, 41], "requireorganizationidtest": [17, 19, 41], "testdecor": [17, 19, 41], "testerror": [17, 19, 41], "testtask": [17, 19, 41], "datasetpermissionstest": [17, 19, 41], "getdatasetsviewstest": [17, 19, 41], "importfileviewstest": [17, 19, 41], "inventoryviewtest": [17, 19, 41], "mainviewtest": [17, 19, 41], "testmcmview": [17, 19, 41], "accesslevelbasetestcas": [17, 19, 41], "assertdictsubsetmixin": [17, 19, 41], "datamappingbasetestcas": [17, 19, 41], "deletemodelstestcas": [17, 19, 41], "fakecli": [17, 19, 41], "fakerequest": [17, 19, 41], "apibypasscsrfmiddlewar": [17, 44], "orgcreatemixin": [17, 44], "orgcreateupdatemixin": [17, 44], "orgmixin": [17, 44], "orgquerysetmixin": [17, 44], "orgupdatemixin": [17, 44], "orgvalidatemixin": [17, 44], "orgvalid": [17, 44], "profileidmixin": [17, 44], "api_endpoint": [17, 44], "api_endpoint_class": [17, 44], "clean_api_regex": [17, 44], "drf_api_endpoint": [17, 44], "format_api_docstr": [17, 44], "get_all_url": [17, 44], "get_api_endpoint": [17, 44], "get_api_request_us": [17, 44], "get_org_id_from_valid": [17, 44], "rgetattr": [17, 44], "get_source_typ": [17, 44], "create_organ": [17, 44], "create_suborgan": [17, 44], "default_pm_map": [17, 44], "set_default_2fa_method": [17, 44], "convert_datestr": [17, 44], "convert_to_js_timestamp": [17, 44], "parse_datetim": [17, 44], "tm": [18, 19, 20, 22, 24, 27, 28, 29, 30, 34, 35, 36, 37, 38, 39, 41, 44, 45], "template_context": 18, "expos": 18, "runfcgi": 18, "discov": 18, "wsgi_appl": 18, "sens": 18, "later": [18, 24, 28, 47], "deleg": [18, 20, 24, 34], "introduc": 18, "middlewar": [18, 44], "framework": [18, 44], "breadcrumb": 19, "breadcrumbnod": [19, 37], "render": [19, 24, 37, 49], "urlbreadcrumbnod": [19, 37], "breadcrumb_root": [19, 37], "breadcrumb_url": [19, 37], "breadcrumb_url_root": [19, 37], "create_crumb": [19, 37], "create_crumb_first": [19, 37], "factor": [19, 22, 38], "chomski": [19, 38, 39], "djangofunctionalfactori": [19, 38, 39], "invalid_test_cc_numb": [19, 38, 39], "rand_bool": [19, 38, 39], "rand_citi": [19, 38, 39], "rand_city_suffix": [19, 38, 39], "rand_curr": [19, 38, 39], "rand_dat": [19, 38, 39], "rand_domain": [19, 38, 39], "rand_email": [19, 38, 39], "rand_float": [19, 38, 39], "rand_int": [19, 38, 39], "rand_nam": [19, 38, 39], "rand_phon": [19, 38, 39], "rand_plant_nam": [19, 38, 39], "rand_str": [19, 38, 39], "rand_street_address": [19, 38, 39], "rand_street_suffix": [19, 38, 39], "test_cc_numb": [19, 38, 39], "valid_test_cc_numb": [19, 38, 39], "test_add_org": [19, 41], "test_add_org_dup": [19, 41], "test_add_owner_existing_org_to_non_root": [19, 41], "test_add_user_existing_org": [19, 41], "test_add_user_new_org": [19, 41], "test_add_user_no_org": [19, 41], "test_signup_process": [19, 41], "test_signup_process_force_lowercase_email": [19, 41], "test_ajax_request_class_dict": [19, 41], "test_ajax_request_class_dict_status_error": [19, 41], "test_ajax_request_class_dict_status_fals": [19, 41], "test_ajax_request_class_format_typ": [19, 41], "test_require_organization_id_class_no_org_id": [19, 41], "test_require_organization_id_class_org_id": [19, 41], "test_require_organization_id_class_org_id_not_int": [19, 41], "test_require_organization_id_fail_no_kei": [19, 41], "test_require_organization_id_fail_not_numer": [19, 41], "test_require_organization_id_success_integ": [19, 41], "test_require_organization_id_success_str": [19, 41], "pk": [19, 41, 44], "test_get_prog_kei": [19, 41], "test_increment_cach": [19, 41], "test_lock": [19, 41], "test_locking_w_except": [19, 41], "test_progress": [19, 41], "unlock": [19, 41], "test_delete_organ": [19, 41], "test_rehash_query_or_structur": [19, 41], "test_dataset_count": [19, 41], "test_dataset_cr": [19, 41], "test_dataset_destroi": [19, 41], "test_dataset_list": [19, 41], "test_dataset_retriev": [19, 41], "test_dataset_upd": [19, 41], "test_delete_dataset": [19, 41], "test_get_dataset": [19, 41], "test_get_datasets_count": [19, 41], "test_get_datasets_count_invalid": [19, 41], "test_update_dataset": [19, 41], "test_delete_fil": [19, 41], "test_get_import_fil": [19, 41], "test_get_matching_and_geocoding_result": [19, 41], "test_get_cycl": [19, 41], "test_get_properti": [19, 41], "test_get_properties_cycle_id": [19, 41], "test_get_properties_empty_pag": [19, 41], "test_get_properties_page_not_an_integ": [19, 41], "test_get_properties_pint_field": [19, 41], "test_get_properties_profile_id": [19, 41], "test_get_properties_property_extra_data": [19, 41], "test_get_properties_select_al": [19, 41], "test_get_properties_taxlot_extra_data": [19, 41], "test_get_properties_with_taxlot": [19, 41], "test_get_properties_with_taxlots_with_footprint": [19, 41], "test_get_properties_wrong_query_param": [19, 41], "test_get_property_column": [19, 41], "test_get_property_multiple_taxlot": [19, 41], "test_get_taxlot": [19, 41], "test_get_taxlot_column": [19, 41], "test_get_taxlots_empty_pag": [19, 41], "test_get_taxlots_extra_data": [19, 41], "test_get_taxlots_multiple_taxlot": [19, 41], "test_get_taxlots_no_cycle_id": [19, 41], "test_get_taxlots_page_not_an_integ": [19, 41], "test_get_taxlots_profile_id": [19, 41], "test_postoffic": [19, 41], "test_update_pint_fields_with_modified_display_set": [19, 41], "test_hom": [19, 41], "assert_expected_map": [19, 41], "expected_map": [19, 41], "raw_columns_expect": [19, 41], "test_create_dataset": [19, 41], "test_get_column_mapping_suggest": [19, 41], "test_get_column_mapping_suggestions_pm_fil": [19, 41], "test_get_column_mapping_suggestions_with_column": [19, 41], "test_get_raw_column_nam": [19, 41], "test_save_column_map": [19, 41], "test_save_column_mappings_idempot": [19, 41], "login_as_child_memb": [19, 41], "login_as_root_memb": [19, 41], "login_as_root_own": [19, 41], "assertdictcontainssubset": [19, 41], "create_import_fil": [19, 41], "set_up": [19, 41], "teardown": [19, 41], "meta": [19, 24, 36, 41], "bodi": [19, 41], "alia": [19, 24, 36, 44, 48], "mixin": [19, 44], "func": 19, "annoi": 19, "slash": 19, "serializ": [19, 36], "http_accept": 19, "my_view": 19, "news_titl": 19, "titl": [19, 37], "convert": [19, 44], "loginrequiredmixin": 19, "login_requir": [19, 44], "myview": 19, "someview": 19, "some_decor": 19, "func_nam": 19, "import_file_pk": 19, "fn": [19, 44], "arg": [19, 20, 22, 24, 34, 36, 44, 45], "kwarg": [19, 20, 22, 24, 34, 36, 41, 44, 45], "executor": 19, "int": [19, 28, 34, 44], "pertain": [19, 22], "sibl": 19, "inventory_typ": [19, 34, 49], "order_bi": 19, "other_org": 19, "cycle_id": [19, 34], "queryset": [19, 20, 22, 44], "inst": [19, 29, 34, 44], "str": [19, 34, 41, 44], "publicli": 19, "sort": [19, 28], "tax_lot_id": [19, 20], "sort_revers": 19, "bool": [19, 20, 28, 34, 44], "asc": 19, "dsc": 19, "pagin": 19, "number_per_pag": 19, "show_shared_build": [19, 24], "global": [19, 44, 48], "other_search_param": 19, "project_id": 19, "is_api_request": 19, "intern": 19, "boolean": [19, 20, 28, 34], "fieldnam": [19, 20, 44], "unicod": [19, 20], "org_pk": 19, "delete_organization_build": 19, "email_address": 19, "user_pk": 19, "first_nam": [19, 24], "invit": 19, "newli": 19, "default_token_gener": 19, "new_us": 19, "noth": 19, "sync": [19, 24], "aleck": 19, "landgraf": 19, "token_gener": 19, "master": [19, 24], "expir": 19, "three": 19, "dai": 19, "strategi": 19, "mechan": 19, "check_token": 19, "token_expir": 19, "make_token": 19, "data_qu": 20, "doesnotexist": [20, 24, 34], "objectdoesnotexist": [20, 24, 34], "multipleobjectsreturn": [20, 24, 34], "required_field": [20, 24], "add_goal_rule_label": 20, "add_invalid_geometry_entry_provid": 20, "row_id": 20, "add_result_comparison_error": 20, "rule_check": 20, "add_result_dimension_error": 20, "add_result_is_nul": 20, "add_result_max_error": 20, "rule_max": 20, "add_result_min_error": 20, "rule_min": 20, "add_result_missing_and_non": 20, "add_result_missing_req": 20, "add_result_range_error": 20, "add_result_string_error": 20, "add_result_type_error": 20, "add_rul": 20, "add_rule_if_new": 20, "cache_kei": 20, "check_data": 20, "record_typ": [20, 34], "check_data_cross_cycl": 20, "goal_id": [20, 34], "state_pair": 20, "goalnot": 20, "passed_check": 20, "baselin": 20, "get_fieldnam": 20, "get_valu": 20, "property_obj": 20, "cycle_kei": 20, "wrapper": [20, 24, 34], "defer": [20, 24, 34], "read": [20, 22, 24, 34], "init_result": 20, "initialize_cach": 20, "chunk": 20, "random": 20, "initialize_rul": 20, "accessor": [20, 24, 34], "side": [20, 24, 34, 49], "forwardonetoonedescriptor": [20, 24, 34], "subclass": [20, 22, 24, 34, 36], "foreignkei": [20, 24, 34], "related_nam": [20, 24, 34], "forwardmanytoonedescriptor": [20, 24, 34], "prune_result": 20, "remove_all_rul": 20, "remove_status_label": 20, "label_class": 20, "linked_id": 20, "rang": 20, "either": [20, 34, 41, 44, 47, 48, 49], "reset_all_rul": 20, "reiniti": 20, "reset_default_rul": 20, "reset_result": 20, "classmethod": [20, 24, 34, 39], "retriev": [20, 34, 41, 44], "previous": 20, "backward": 20, "obj": [20, 36, 44], "retrieve_result_by_address": 20, "retrieve_result_by_tax_lot_id": 20, "jurisdict": [20, 34], "reversemanytoonedescriptor": [20, 24, 34], "create_forward_many_to_many_manag": [20, 24, 34], "save_to_cach": 20, "rememb": 20, "update_status_label": 20, "add_to_result": 20, "default_rul": 20, "not_nul": 20, "rule_typ": 20, "conditioned_floor_area": [20, 34], "7000000": 20, "ft": 20, "energy_scor": [20, 34], "generation_d": [20, 34], "20241231": 20, "18890101": 20, "occupied_floor_area": [20, 34], "recent_sale_d": [20, 34], "site_eui": [20, 34], "site_eui_weather_norm": [20, 34], "source_eui": [20, 34], "source_eui_weather_norm": [20, 34], "1700": 20, "cross_cycl": 20, "40": 20, "1000000": 20, "rule_exclud": 20, "rule_includ": 20, "rule_not_nul": 20, "rule_rang": 20, "rule_requir": 20, "rule_type_custom": 20, "rule_type_default": 20, "severity_error": 20, "severity_valid": 20, "severity_warn": 20, "type_area": 20, "type_d": 20, "type_eui": 20, "type_numb": 20, "type_str": 20, "type_year": 20, "data_quality_check": 20, "data_quality_check_id": 20, "for_derived_column": 20, "format_str": 20, "get_data_type_displai": 20, "integerfield": [20, 34], "get_rule_type_displai": 20, "get_severity_displai": 20, "maximum_valid": 20, "greater": [20, 28, 48], "maximum": [20, 45], "minimum_valid": 20, "less": 20, "minimum": 20, "status_label": 20, "status_label_id": 20, "str_to_data_typ": 20, "therefor": 20, "definit": 20, "variant": 20, "text_match": 20, "valid_text": 20, "text": 20, "regex": [20, 28, 44], "source_valu": 20, "pint": 20, "violat": [20, 34], "human": [20, 44], "readabl": [20, 41, 44], "quantiti": 20, "formatted_valu": 20, "formatted_min": 20, "formatted_max": 20, "get_al": 22, "filesystem": [22, 46], "get_queryset": [22, 44], "behavior": 22, "use_for_related_field": 22, "countri": 22, "thermal": 22, "convers": 22, "nrel": [22, 28], "deduc": 22, "regard": 22, "align": 22, "thermal_conversion_assumpt": 22, "enum": 22, "concept": 22, "sole": 22, "irrespect": 22, "coutri": 22, "water": [22, 34], "www": 22, "kylesconvert": 22, "kilogallon": 22, "raw_source_id": 22, "extract": 22, "usag": 22, "greenbutton": 22, "uri": 22, "eula": [24, 25], "usercreationform": 24, "widget": 24, "emailinput": 24, "base_field": 24, "password1": 24, "charfield": [24, 34], "password2": 24, "emailfield": 24, "declared_field": 24, "auto_id": 24, "id_": 24, "prefix": [24, 44], "error_class": 24, "errorlist": 24, "label_suffix": 24, "empty_permit": 24, "field_ord": 24, "use_required_attribut": 24, "abstractbaseus": 24, "permissionsmixin": 24, "abstract": 24, "compliant": [24, 34], "username_field": 24, "analysis_set": 24, "columnmapping_set": 24, "cycle_set": 24, "date_join": 24, "deactivate_us": 24, "default_building_detail_custom_column": 24, "default_custom_column": 24, "default_organ": [24, 44], "default_organization_id": 24, "email_us": 24, "from_email": 24, "emaildevice_set": 24, "generate_kei": 24, "adapt": 24, "tastypi": 24, "toastdriven": 24, "l47": 24, "get_absolute_url": 24, "get_full_nam": 24, "plu": 24, "last_nam": 24, "get_next_by_date_join": 24, "datetimefield": [24, 34], "is_next": [24, 34], "get_previous_by_date_join": 24, "get_short_nam": 24, "greenassessmentpropertyauditlog_set": 24, "pizza": [24, 34], "manytomanyfield": [24, 34], "manytomanydescriptor": [24, 34], "importrecord_set": 24, "is_staff": 24, "logentry_set": 24, "modified_import_record": 24, "usermanag": 24, "organizationuser_set": 24, "phonedevice_set": 24, "postofficeemail_set": 24, "postofficeemailtemplate_set": 24, "process_header_request": 24, "prompt_2fa": 24, "staticdevice_set": 24, "totpdevice_set": 24, "user_permiss": 24, "methodnam": [24, 41], "runtest": [24, 41], "testcas": [24, 41], "hook": [24, 34, 41], "fixtur": [24, 41], "exercis": [24, 41], "test_simple_login": 24, "happi": [24, 41], "loginview": 24, "dispatch": 24, "rout": 24, "argument": [24, 37], "httprequest": 24, "reach": 24, "wizard": 24, "handle_2fa_prompt": 24, "handle_auth": 24, "handle_token": 24, "devic": 24, "challeng": 24, "uidb64": 24, "dan": [28, 29], "gunter": [28, 29], "dkgunter": [28, 29], "lbl": [28, 29, 48], "raw_column": [28, 41], "sanit": 28, "raw_data": 28, "resolve_dupl": 28, "xlsx": 28, "attempt": 28, "from_field": 28, "nichola": 28, "dest_column": 28, "previous_map": 28, "map_arg": 28, "default_map": 28, "threshold": 28, "probabilist": 28, "unknown": 28, "mainli": 28, "build_column_map": 28, "add_map": 28, "potenti": 28, "preced": 28, "apply_threshold": 28, "suggest": 28, "meet": 28, "forc": [28, 34, 41, 44], "separ": [28, 36, 46, 47], "equal": 28, "final_map": 28, "downstream": 28, "raw_column_1": 28, "db_column_1": 28, "raw_column_2": 28, "first_suggested_map": 28, "grab": 28, "dup_map_field": 28, "highest": 28, "win": 28, "battl": 28, "set_initial_mapping_cmp": 28, "initial_mapping_cmp": 28, "hash": [28, 34], "detect": 28, "cmp": 28, "data_set_build": 29, "attr": 29, "state_list": 29, "merged_st": [29, 34], "state1": [29, 34], "state2": [29, 34], "ignore_merge_protect": 29, "favor": [29, 34], "column_exclude_field": 34, "bounding_box": 34, "centroid": 34, "data_st": [34, 41], "derived_data": 34, "import_fil": [34, 44], "long_lat": 34, "raw_access_level_instance_error": 34, "raw_access_level_instance_id": 34, "hash_object": 34, "normalized_address": 34, "source_eui_modeled_orig": 34, "site_eui_orig": 34, "occupied_floor_area_orig": 34, "site_eui_weather_normalized_orig": 34, "site_eui_modeled_orig": 34, "source_eui_orig": 34, "gross_floor_area_orig": 34, "conditioned_floor_area_orig": 34, "source_eui_weather_normalized_orig": 34, "column_merge_favor_exist": 34, "column_merge_favor_new": 34, "column_merge_protect": 34, "pm_parent_property_id": 34, "jurisdiction_property_id": 34, "audit": [34, 41], "audit_template_building_id": 34, "postal": 34, "latitud": 34, "longitud": 34, "footprint": 34, "property_footprint": 34, "geometri": 34, "taxlot_footprint": 34, "datetim": [34, 44], "gross": 34, "use_descript": 34, "star": 34, "score": 34, "integ": 34, "property_not": 34, "property_typ": 34, "telephon": 34, "building_count": 34, "sale": 34, "occupi": 34, "home_energy_score_id": 34, "weather": 34, "site_eui_model": 34, "source_eui_model": 34, "alert": 34, "energy_alert": 34, "space_alert": 34, "number_properti": 34, "egrid": 34, "subregion": 34, "egrid_subregion_cod": 34, "total": [34, 45], "ghg": 34, "emiss": 34, "total_ghg_emiss": 34, "margin": 34, "total_marginal_ghg_emiss": 34, "intens": 34, "total_ghg_emissions_intens": 34, "ghg_intens": 34, "total_marginal_ghg_emissions_intens": 34, "zone": 34, "property_timezon": 34, "water_us": 34, "indoor": 34, "indoor_water_us": 34, "outdoor": 34, "outdoor_water_us": 34, "wui": 34, "indoor_wui": 34, "data_type_pars": 34, "callabl": 34, "lambda": 34, "fromisoformat": 34, "float": 34, "db_type": 34, "excluded_column_return_field": 34, "excluded_mapping_field": 34, "geocoded_address": 34, "geocoded_postal_cod": 34, "geocoded_side_of_street": 34, "geocoded_countri": 34, "geocoded_st": 34, "geocoded_counti": 34, "geocoded_c": 34, "geocoded_neighborhood": 34, "excluded_rename_from_field": 34, "excluded_rename_to_field": 34, "internal_type_to_data_typ": 34, "booleanfield": 34, "datefield": 34, "floatfield": 34, "doubl": [34, 44], "jsonfield": 34, "pointfield": 34, "polygonfield": 34, "textfield": 34, "pinned_column": 34, "quantity_unit_column": 34, "shared_field_typ": 34, "shared_non": 34, "shared_publ": 34, "unmappable_property_field": 34, "unmappable_taxlot_field": 34, "account_name_column": 34, "actual_emission_column": 34, "actual_energy_column": 34, "benchmark_id_column": 34, "cast_column_valu": 34, "column_data_typ": 34, "allow_non": 34, "rais": [34, 36, 44], "castexcept": 34, "wide": 34, "clean_field": 34, "validationerror": 34, "non_field_error": 34, "column_list_profil": 34, "columnlistprofilecolumn_set": 34, "comstock_map": 34, "contact_email_column": 34, "contact_name_column": 34, "create_map": 34, "arrai": 34, "columnmap": 34, "create_mappings_from_fil": 34, "absolut": 34, "data_admin_account_name_column": 34, "data_admin_email_column": 34, "data_admin_name_column": 34, "dataviewparameter_set": 34, "delete_al": 34, "invalid": 34, "irrevers": 34, "column_map": 34, "derived_column": 34, "restaur": 34, "onetoonefield": 34, "derived_column_id": 34, "derivedcolumn_set": 34, "derivedcolumnparameter_set": 34, "geocoding_ord": 34, "get_merge_protection_displai": 34, "merge_protect": 34, "get_next_by_cr": 34, "get_next_by_modifi": 34, "get_previous_by_cr": 34, "get_previous_by_modifi": 34, "get_shared_field_type_displai": 34, "goal_area_column": 34, "goal_eui_column1": 34, "goal_eui_column2": 34, "goal_eui_column3": 34, "is_excluded_from_hash": 34, "is_matching_criteria": 34, "is_option_for_reports_x_axi": 34, "is_option_for_reports_y_axi": 34, "is_upd": 34, "mapped_map": 34, "raw_map": 34, "recognize_empti": 34, "rename_column": 34, "new_column_nam": 34, "vice": 34, "versa": 34, "overwrit": [34, 47], "retrieve_al": 34, "org_id": [34, 44], "liter": 34, "only_us": 34, "include_rel": 34, "exclude_deriv": 34, "grid": 34, "retrieve_all_by_tupl": 34, "retrieve_db_field_name_for_hash_comparison": 34, "independ": 34, "md5": 34, "quickli": 34, "superset": [34, 41], "retrieve_db_field_table_and_names_from_db_t": 34, "retrieve_db_field": 34, "retrieve_db_fields_from_db_t": 34, "retrieve_db_typ": 34, "field_nam": 34, "field_name_2": 34, "data_type_2": 34, "retrieve_mapping_column": 34, "retrieve_prior": 34, "data_007": 34, "data_008": 34, "salesforce_column": 34, "force_insert": 34, "force_upd": 34, "insist": 34, "equival": [34, 44], "save_column_nam": 34, "model_obj": 34, "ever": [34, 44], "seen": [34, 47], "target_emission_column": 34, "target_energy_column": 34, "unit_id": 34, "x_axis_column": 34, "analysispropertyview_set": 34, "dataview_set": 34, "event_set": 34, "get_next_by_end": 34, "get_next_by_start": 34, "get_or_create_default": 34, "get_previous_by_end": 34, "get_previous_by_start": 34, "goal_baseline_cycl": 34, "goal_current_cycl": 34, "importfile_set": 34, "propertyview_set": 34, "taxlotproperty_set": 34, "taxlotview_set": 34, "user_id": 34, "color": [34, 36], "super_organ": [34, 36], "show_in_list": [34, 36], "timestampedmodel": 34, "blue_choic": 34, "blue": 34, "color_choic": 34, "red": 34, "light": [34, 41], "green": [34, 48], "white": 34, "orang": 34, "grai": 34, "default_label": 34, "residenti": 34, "exempt": 34, "ownership": 34, "gray_choic": 34, "green_choic": 34, "light_blue_choic": 34, "orange_choic": 34, "red_choic": 34, "white_choic": 34, "and_filter_group": 34, "compliance_label": 34, "exclude_filter_group": 34, "get_color_displai": 34, "django_extens": 34, "creationdatetimefield": 34, "modificationdatetimefield": 34, "indication_label": 34, "or_filter_group": 34, "propertyviewlabel_set": 34, "rule_set": 34, "super_organization_id": 34, "to_dict": 34, "violation_label": 34, "measur": 34, "decim": 34, "unit_typ": 34, "column_set": 34, "get_unit_type_displai": 34, "unit_nam": 34, "overtim": 34, "remain": [34, 48, 49], "unchang": 34, "access_level_inst": 34, "access_level_instance_id": 34, "copy_met": 34, "source_property_id": 34, "source_persist": 34, "aren": 34, "bulk": 34, "reassign": 34, "data_logg": 34, "element": [34, 49], "get_next_by_upd": 34, "get_previous_by_upd": 34, "goalnote_set": 34, "historical_not": 34, "reverseonetoonedescriptor": 34, "inventory_docu": 34, "parent_properti": 34, "parent_property_id": 34, "property_set": 34, "parent1": 34, "parent2": 34, "parent_state1": 34, "parent_state2": 34, "import_filenam": 34, "get_record_type_displai": 34, "parent1_id": 34, "parent2_id": 34, "parent_state1_id": 34, "parent_state2_id": 34, "propertyauditlog_parent1": 34, "propertyauditlog_parent2": 34, "state_id": 34, "view_id": 34, "pytz": 34, "timezon": [34, 44], "all_timezon": 34, "alaska": 34, "aleutian": 34, "arizona": 34, "central": 34, "indiana": 34, "eastern": 34, "hawaii": 34, "stark": 34, "michigan": 34, "mountain": 34, "pacif": 34, "samoa": 34, "analysispropertyview": 34, "building_fil": 34, "get_data_state_displai": 34, "get_merge_state_displai": 34, "get_source_type_displai": 34, "histori": 34, "measure_set": 34, "merge_relationship": 34, "property_id": 34, "propertyauditlog_st": 34, "propertymeasure_set": 34, "raw_access_level_inst": 34, "simul": [34, 41], "include_related_data": 34, "mask": 34, "ubidmodel_set": 34, "world": 34, "characterist": 34, "gapauditlog_view": 34, "greenassessmentproperty_set": 34, "initialize_audit_log": 34, "propertyauditlog_view": 34, "tax_lot_st": 34, "tax_lot_view": 34, "propertyview_id": 34, "statuslabel_id": 34, "ubidmodel": 34, "ahead": 34, "touch": 34, "ali": 34, "tax_lot": 34, "taxlotauditlog_parent1": 34, "taxlotauditlog_parent2": 34, "stub": [34, 41], "taxlotauditlog_parent_state1": 34, "taxlotauditlog_parent_state2": 34, "taxlotauditlog_st": 34, "property_st": 34, "property_view": 34, "taxlot_id": 34, "taxlotauditlog_view": 34, "skipkei": 36, "ensure_ascii": 36, "check_circular": 36, "allow_nan": 36, "sort_kei": 36, "indent": 36, "jsonencod": 36, "typeerror": 36, "iter": 36, "seed_decod": 36, "seed_dump": 36, "seed_load": 36, "modelseri": [36, 44], "extra_kwarg": 36, "write_onli": 36, "is_appli": 36, "get_is_appli": 36, "to_represent": 36, "primit": 36, "datatyp": 36, "bitbucket": 37, "mathiasdm": 37, "render_func": 37, "url_nod": 37, "parser": 37, "andrii": 37, "drozdyuk": 37, "url_var": 37, "context_var": 37, "just_context_var": 37, "crumb": 37, "produc": 37, "person_detail": 37, "person_url": 37, "person": 37, "test_help": 39, "start_year": 39, "1900": 39, "end_year": 39, "2011": 39, "length": 39, "test_admin_view": 41, "dupe": 41, "entir": [41, 44], "creation": 41, "test_decor": 41, "34": 41, "sum": 41, "increment": 41, "had": 41, "finish": [41, 46, 47], "counter": 41, "test_task": 41, "deal": 41, "test_view": 41, "k": 41, "dest_col": 41, "assert": 41, "70": 41, "air": 41, "leakag": 41, "64": 41, "47": 41, "50": 41, "create_dataset": 41, "get_raw_column_nam": 41, "save_column_map": 41, "member": 41, "subset": 41, "necessari": [41, 47], "polyfil": 41, "believ": 41, "compar": [41, 49], "import_file_source_typ": 41, "user_nam": 41, "test_us": 41, "user_password": 41, "test_pass": 41, "deconstruct": 41, "extrem": 41, "weight": 41, "view_func": 41, "remote_addr": 41, "fake_login_path": 41, "get_respons": 44, "turn": 44, "csrf": 44, "csrfviewmiddlewar": 44, "perform_cr": 44, "get_parent_org": 44, "return_obj": 44, "prove": 44, "orgfilt": 44, "nest": 44, "foreign_kei": 44, "force_par": 44, "perform_upd": 44, "org_valid": 44, "my_valid": 44, "myseri": 44, "primarykeyrelatedfield": 44, "query_set": 44, "mymodel": 44, "travers": 44, "underscor": 44, "property__org_id": 44, "validate_org": 44, "get_org_id": 44, "show": [44, 48], "get_show_column": 44, "profile_id": 44, "show_column": 44, "field_1": 44, "field_2": 44, "extra_data_field_1": 44, "extra_data_field_2": 44, "mark": 44, "has_perm": 44, "strip": 44, "todo": 44, "regist": [44, 48], "rest": 44, "is_api_endpoint": 44, "append": 44, "docstr": 44, "consumpt": 44, "urllist": 44, "recurs": 44, "yield": 44, "url_pattern": 44, "view_funct": 44, "examin": [44, 48], "getattr": 44, "deep": 44, "mimic": 44, "org__id": 44, "split": 44, "__": 44, "lst": 44, "immedi": 44, "org_nam": 44, "test_org": 44, "scratch": 44, "heavili": 44, "current_org": 44, "suborg_nam": 44, "user_rol": 44, "datestr": 44, "make_tz_awar": 44, "31": 44, "2010": 44, "utc": 44, "reconcil": 44, "mcm": 44, "cleaner": 44, "l85": 44, "millisecond": 44, "epoch": 44, "maybe_datetim": 44, "strftime": 44, "cover": 45, "celery_queu": 45, "queu": 45, "n": 45, "wait": [45, 47], "eta": 45, "countdown": 45, "maxconcurr": 45, "error404": 45, "error410": 45, "error500": 45, "health_check": 45, "health": 45, "sha": 45, "pg12": 46, "bind": 46, "mount": [46, 47], "seed_postgr": 46, "pg_dump": 46, "fc": 46, "f": [46, 47], "temporari": 46, "pg13": 46, "ts2": 46, "oss": 46, "WITH": [46, 48], "pg16": 46, "toolbox": 47, "concours": 47, "6038": 47, "Be": 47, "patient": 47, "successfulli": 47, "coupl": 47, "everyth": 47, "converg": 47, "overridden": 47, "forget": 47, "live": 47, "reload": 47, "docker_dev": 47, "probabl": [47, 49], "unfortun": 47, "seed_db_volum": 47, "seed_media_volum": 47, "folder": [47, 48], "switch": [47, 48], "seed_pgdata_prod": 47, "nocaptur": 47, "stdout": 47, "worth": 47, "_log": 47, "pdb": 47, "remot": 47, "remote_pdb": 47, "set_trac": 47, "breakpoint": 47, "remotepdb": 47, "session": 47, "41653": 47, "netcat": 47, "nc": 47, "machin": 48, "skip": 48, "virtualenv": 48, "conda": 48, "succe": 48, "forg": 48, "crfsuit": 48, "macport": 48, "graphviz": 48, "pyenv": 48, "although": 48, "easiest": 48, "pollut": 48, "easier": 48, "postgresql94": 48, "opt": 48, "defaultdb": 48, "chown": 48, "initdb": 48, "stop": 48, "alias": 48, "postactiv": 48, "pg_start": 48, "pg_ctl": 48, "pg_stop": 48, "launchag": 48, "whoami": 48, "postgis2": 48, "becom": 48, "remaind": 48, "maintain": 48, "compil": 48, "gcc": 48, "clang": 48, "cmake": 48, "openssl": 48, "dopenssl_root_dir": 48, "conf": 48, "uncom": [48, 49], "shared_preload_librari": 48, "config_fil": 48, "virtualenvwrapp": 48, "workon": 48, "cc": 48, "cp": 48, "favorit": 48, "editor": 48, "plan_purchas": 48, "business_edit": 48, "business_edition_fre": 48, "me": 48, "consum": 48, "directli": 48, "deadbeef": 48, "hard": 48, "statement": 48, "encapsul": 48, "stand": 48, "alon": 48, "foreground": 48, "seem": 48, "lokalise2": 49, "get_python_transl": 49, "get_angular_transl": 49, "usemissingtranslationhandlerlog": 49, "untransl": 49, "lokal": 49, "tl": 49, "dr": 49, "english": 49, "littl": 49, "care": 49, "held": 49, "languag": 49, "mo": 49, "suppli": 49, "sniff": 49, "accept": 49, "swap": 49, "dom": 49, "wherev": 49, "wrinkl": 49, "plural": 49, "flow": 49, "visibl": 49, "smooth": 49, "nice": 49, "speaker": 49, "screenshot": 49, "clarifi": 49, "phrase": 49, "placehold": 49, "fairli": 49, "straightforward": 49, "profession": 49, "mostli": 49, "visual": 49, "ok": 49, "french": 49, "german": 49, "wordi": 49, "rel": 49, "expand": 49, "oddli": 49, "err": 49, "clever": 49, "aim": 49, "compet": 49, "h2": 49, "include_shared_taxlot": 49, "include_shar": 49}, "objects": {"config": [[18, 0, 0, "-", "template_context"], [18, 0, 0, "-", "tests"], [18, 0, 0, "-", "utils"], [18, 0, 0, "-", "views"], [18, 0, 0, "-", "wsgi"]], "config.template_context": [[18, 1, 1, "", "sentry_js"], [18, 1, 1, "", "session_key"]], "config.utils": [[18, 1, 1, "", "de_camel_case"]], "config.views": [[18, 1, 1, "", "robots_txt"]], "": [[19, 0, 0, "-", "seed"]], "seed": [[22, 0, 0, "-", "data_importer"], [19, 0, 0, "-", "decorators"], [24, 0, 0, "-", "landing"], [27, 0, 0, "-", "lib"], [30, 0, 0, "-", "management"], [34, 0, 0, "-", "models"], [35, 0, 0, "-", "public"], [19, 0, 0, "-", "search"], [36, 0, 0, "-", "serializers"], [19, 0, 0, "-", "tasks"], [38, 0, 0, "-", "test_helpers"], [19, 0, 0, "-", "token_generators"], [19, 0, 0, "-", "utils"], [45, 0, 0, "-", "views"]], "seed.data_importer": [[22, 0, 0, "-", "managers"], [22, 0, 0, "-", "utils"]], "seed.data_importer.managers": [[22, 2, 1, "", "NotDeletedManager"]], "seed.data_importer.managers.NotDeletedManager": [[22, 3, 1, "", "get_all"], [22, 3, 1, "", "get_queryset"], [22, 4, 1, "", "use_for_related_fields"]], "seed.data_importer.utils": [[22, 1, 1, "", "kbtu_thermal_conversion_factors"], [22, 1, 1, "", "kgal_water_conversion_factors"], [22, 1, 1, "", "usage_point_id"]], "seed.decorators": [[19, 4, 1, "", "DRFEndpointMixin"], [19, 1, 1, "", "ajax_request"], [19, 1, 1, "", "ajax_request_class"], [19, 1, 1, "", "decorator_to_mixin"], [19, 1, 1, "", "get_prog_key"], [19, 1, 1, "", "lock_and_track"], [19, 1, 1, "", "require_organization_id"], [19, 1, 1, "", "require_organization_id_class"], [19, 1, 1, "", "require_organization_membership"]], "seed.landing": [[24, 0, 0, "-", "forms"], [25, 0, 0, "-", "management"], [24, 0, 0, "-", "models"], [24, 0, 0, "-", "tests"], [24, 0, 0, "-", "urls"], [24, 0, 0, "-", "views"]], "seed.landing.forms": [[24, 2, 1, "", "CustomCreateUserForm"], [24, 2, 1, "", "LoginForm"]], "seed.landing.forms.CustomCreateUserForm": [[24, 2, 1, "", "Meta"], [24, 4, 1, "", "base_fields"], [24, 4, 1, "", "declared_fields"], [24, 5, 1, "", "media"]], "seed.landing.forms.CustomCreateUserForm.Meta": [[24, 4, 1, "", "fields"], [24, 4, 1, "", "model"], [24, 4, 1, "", "widgets"]], "seed.landing.forms.LoginForm": [[24, 4, 1, "", "base_fields"], [24, 4, 1, "", "declared_fields"], [24, 5, 1, "", "media"]], "seed.landing.management": [[26, 0, 0, "-", "commands"]], "seed.landing.models": [[24, 2, 1, "", "SEEDUser"]], "seed.landing.models.SEEDUser": [[24, 6, 1, "", "DoesNotExist"], [24, 6, 1, "", "MultipleObjectsReturned"], [24, 4, 1, "", "REQUIRED_FIELDS"], [24, 4, 1, "", "USERNAME_FIELD"], [24, 4, 1, "", "analysis_set"], [24, 4, 1, "", "api_key"], [24, 4, 1, "", "columnmapping_set"], [24, 4, 1, "", "cycle_set"], [24, 4, 1, "", "date_joined"], [24, 3, 1, "", "deactivate_user"], [24, 4, 1, "", "default_building_detail_custom_columns"], [24, 4, 1, "", "default_custom_columns"], [24, 4, 1, "", "default_organization"], [24, 4, 1, "", "default_organization_id"], [24, 4, 1, "", "email"], [24, 3, 1, "", "email_user"], [24, 4, 1, "", "emaildevice_set"], [24, 4, 1, "", "first_name"], [24, 3, 1, "", "generate_key"], [24, 3, 1, "", "get_absolute_url"], [24, 3, 1, "", "get_full_name"], [24, 3, 1, "", "get_next_by_date_joined"], [24, 3, 1, "", "get_previous_by_date_joined"], [24, 3, 1, "", "get_short_name"], [24, 4, 1, "", "greenassessmentpropertyauditlog_set"], [24, 4, 1, "", "groups"], [24, 4, 1, "", "id"], [24, 4, 1, "", "importrecord_set"], [24, 4, 1, "", "is_staff"], [24, 4, 1, "", "last_name"], [24, 4, 1, "", "logentry_set"], [24, 4, 1, "", "modified_import_records"], [24, 4, 1, "", "notes"], [24, 4, 1, "", "objects"], [24, 4, 1, "", "organizationuser_set"], [24, 4, 1, "", "orgs"], [24, 4, 1, "", "phonedevice_set"], [24, 4, 1, "", "postofficeemail_set"], [24, 4, 1, "", "postofficeemailtemplate_set"], [24, 3, 1, "", "process_header_request"], [24, 4, 1, "", "prompt_2fa"], [24, 3, 1, "", "save"], [24, 4, 1, "", "show_shared_buildings"], [24, 4, 1, "", "staticdevice_set"], [24, 4, 1, "", "totpdevice_set"], [24, 4, 1, "", "user_permissions"], [24, 4, 1, "", "username"]], "seed.landing.tests": [[24, 2, 1, "", "UserLoginTest"]], "seed.landing.tests.UserLoginTest": [[24, 3, 1, "", "setUp"], [24, 3, 1, "", "test_simple_login"]], "seed.landing.views": [[24, 2, 1, "", "CustomLoginView"], [24, 1, 1, "", "account_activation_sent"], [24, 1, 1, "", "activate"], [24, 1, 1, "", "create_account"], [24, 1, 1, "", "landing_page"], [24, 1, 1, "", "password_reset"], [24, 1, 1, "", "password_reset_complete"], [24, 1, 1, "", "password_reset_confirm"], [24, 1, 1, "", "password_reset_done"], [24, 1, 1, "", "password_set"], [24, 1, 1, "", "signup"]], "seed.landing.views.CustomLoginView": [[24, 3, 1, "", "dispatch"], [24, 3, 1, "", "get"], [24, 3, 1, "", "handle_2fa_prompt"], [24, 3, 1, "", "handle_auth"], [24, 3, 1, "", "handle_token"], [24, 3, 1, "", "post"]], "seed.lib": [[28, 0, 0, "-", "mappings"], [29, 0, 0, "-", "merging"]], "seed.lib.mappings": [[28, 0, 0, "-", "mapper"], [28, 0, 0, "-", "mapping_columns"]], "seed.lib.mappings.mapper": [[28, 1, 1, "", "create_column_regexes"], [28, 1, 1, "", "get_pm_mapping"]], "seed.lib.mappings.mapping_columns": [[28, 2, 1, "", "MappingColumns"], [28, 1, 1, "", "sort_duplicates"]], "seed.lib.mappings.mapping_columns.MappingColumns": [[28, 3, 1, "", "add_mappings"], [28, 3, 1, "", "apply_threshold"], [28, 5, 1, "", "duplicates"], [28, 5, 1, "", "final_mappings"], [28, 3, 1, "", "first_suggested_mapping"], [28, 3, 1, "", "resolve_duplicate"], [28, 3, 1, "", "set_initial_mapping_cmp"]], "seed.lib.merging": [[29, 0, 0, "-", "merging"]], "seed.lib.merging.merging": [[29, 1, 1, "", "get_attrs_with_mapping"], [29, 1, 1, "", "get_propertystate_attrs"], [29, 1, 1, "", "get_state_attrs"], [29, 1, 1, "", "get_state_to_state_tuple"], [29, 1, 1, "", "get_taxlotstate_attrs"], [29, 1, 1, "", "merge_state"]], "seed.models": [[34, 0, 0, "-", "auditlog"], [34, 0, 0, "-", "columns"], [34, 0, 0, "-", "cycles"], [20, 0, 0, "-", "data_quality"], [34, 0, 0, "-", "models"], [34, 0, 0, "-", "properties"], [34, 0, 0, "-", "tax_lots"]], "seed.models.columns": [[34, 2, 1, "", "Column"], [34, 6, 1, "", "ColumnCastError"], [34, 1, 1, "", "validate_model"]], "seed.models.columns.Column": [[34, 4, 1, "", "COLUMN_EXCLUDE_FIELDS"], [34, 4, 1, "", "COLUMN_MERGE_FAVOR_EXISTING"], [34, 4, 1, "", "COLUMN_MERGE_FAVOR_NEW"], [34, 4, 1, "", "COLUMN_MERGE_PROTECTION"], [34, 4, 1, "", "DATABASE_COLUMNS"], [34, 4, 1, "", "DATA_TYPE_PARSERS"], [34, 4, 1, "", "DB_TYPES"], [34, 6, 1, "", "DoesNotExist"], [34, 4, 1, "", "EXCLUDED_COLUMN_RETURN_FIELDS"], [34, 4, 1, "", "EXCLUDED_MAPPING_FIELDS"], [34, 4, 1, "", "EXCLUDED_RENAME_FROM_FIELDS"], [34, 4, 1, "", "EXCLUDED_RENAME_TO_FIELDS"], [34, 4, 1, "", "INTERNAL_TYPE_TO_DATA_TYPE"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "PINNED_COLUMNS"], [34, 4, 1, "", "QUANTITY_UNIT_COLUMNS"], [34, 4, 1, "", "SHARED_FIELD_TYPES"], [34, 4, 1, "", "SHARED_NONE"], [34, 4, 1, "", "SHARED_PUBLIC"], [34, 4, 1, "", "UNMAPPABLE_PROPERTY_FIELDS"], [34, 4, 1, "", "UNMAPPABLE_TAXLOT_FIELDS"], [34, 4, 1, "", "account_name_column"], [34, 4, 1, "", "actual_emission_column"], [34, 4, 1, "", "actual_energy_column"], [34, 4, 1, "", "benchmark_id_column"], [34, 3, 1, "", "cast"], [34, 3, 1, "", "cast_column_value"], [34, 3, 1, "", "clean"], [34, 4, 1, "", "column_description"], [34, 4, 1, "", "column_list_profiles"], [34, 4, 1, "", "column_name"], [34, 4, 1, "", "columnlistprofilecolumn_set"], [34, 4, 1, "", "comstock_mapping"], [34, 4, 1, "", "contact_email_column"], [34, 4, 1, "", "contact_name_column"], [34, 3, 1, "", "create_mappings"], [34, 3, 1, "", "create_mappings_from_file"], [34, 4, 1, "", "created"], [34, 4, 1, "", "data_admin_account_name_column"], [34, 4, 1, "", "data_admin_email_column"], [34, 4, 1, "", "data_admin_name_column"], [34, 4, 1, "", "data_type"], [34, 4, 1, "", "dataviewparameter_set"], [34, 3, 1, "", "delete_all"], [34, 4, 1, "", "derived_column"], [34, 4, 1, "", "derived_column_id"], [34, 4, 1, "", "derivedcolumn_set"], [34, 4, 1, "", "derivedcolumnparameter_set"], [34, 4, 1, "", "display_name"], [34, 4, 1, "", "geocoding_order"], [34, 3, 1, "", "get_merge_protection_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_modified"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_modified"], [34, 3, 1, "", "get_shared_field_type_display"], [34, 4, 1, "", "goal_area_columns"], [34, 4, 1, "", "goal_eui_column1s"], [34, 4, 1, "", "goal_eui_column2s"], [34, 4, 1, "", "goal_eui_column3s"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_file"], [34, 4, 1, "", "import_file_id"], [34, 4, 1, "", "is_excluded_from_hash"], [34, 4, 1, "", "is_extra_data"], [34, 4, 1, "", "is_matching_criteria"], [34, 4, 1, "", "is_option_for_reports_x_axis"], [34, 4, 1, "", "is_option_for_reports_y_axis"], [34, 4, 1, "", "is_updating"], [34, 4, 1, "", "mapped_mappings"], [34, 4, 1, "", "merge_protection"], [34, 4, 1, "", "modified"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "raw_mappings"], [34, 4, 1, "", "recognize_empty"], [34, 3, 1, "", "rename_column"], [34, 3, 1, "", "retrieve_all"], [34, 3, 1, "", "retrieve_all_by_tuple"], [34, 3, 1, "", "retrieve_db_field_name_for_hash_comparison"], [34, 3, 1, "", "retrieve_db_field_table_and_names_from_db_tables"], [34, 3, 1, "", "retrieve_db_fields"], [34, 3, 1, "", "retrieve_db_fields_from_db_tables"], [34, 3, 1, "", "retrieve_db_types"], [34, 3, 1, "", "retrieve_mapping_columns"], [34, 3, 1, "", "retrieve_priorities"], [34, 4, 1, "", "salesforce_column"], [34, 3, 1, "", "save"], [34, 3, 1, "", "save_column_names"], [34, 4, 1, "", "shared_field_type"], [34, 4, 1, "", "table_name"], [34, 4, 1, "", "target_emission_column"], [34, 4, 1, "", "target_energy_column"], [34, 4, 1, "", "unit"], [34, 4, 1, "", "unit_id"], [34, 4, 1, "", "units_pint"], [34, 4, 1, "", "x_axis_columns"]], "seed.models.cycles": [[34, 2, 1, "", "Cycle"]], "seed.models.cycles.Cycle": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "analysispropertyview_set"], [34, 4, 1, "", "created"], [34, 4, 1, "", "cycles"], [34, 4, 1, "", "dataview_set"], [34, 4, 1, "", "end"], [34, 4, 1, "", "event_set"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_end"], [34, 3, 1, "", "get_next_by_start"], [34, 3, 1, "", "get_or_create_default"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_end"], [34, 3, 1, "", "get_previous_by_start"], [34, 4, 1, "", "goal_baseline_cycles"], [34, 4, 1, "", "goal_current_cycles"], [34, 4, 1, "", "id"], [34, 4, 1, "", "importfile_set"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "propertyview_set"], [34, 4, 1, "", "start"], [34, 4, 1, "", "taxlotproperty_set"], [34, 4, 1, "", "taxlotview_set"], [34, 4, 1, "", "user"], [34, 4, 1, "", "user_id"]], "seed.models.data_quality": [[20, 6, 1, "", "ComparisonError"], [20, 2, 1, "", "DataQualityCheck"], [20, 6, 1, "", "DataQualityTypeCastError"], [20, 2, 1, "", "Rule"], [20, 6, 1, "", "UnitMismatchError"], [20, 1, 1, "", "format_pint_violation"]], "seed.models.data_quality.DataQualityCheck": [[20, 6, 1, "", "DoesNotExist"], [20, 6, 1, "", "MultipleObjectsReturned"], [20, 4, 1, "", "REQUIRED_FIELDS"], [20, 3, 1, "", "add_goal_rule_labels"], [20, 3, 1, "", "add_invalid_geometry_entry_provided"], [20, 3, 1, "", "add_result_comparison_error"], [20, 3, 1, "", "add_result_dimension_error"], [20, 3, 1, "", "add_result_is_null"], [20, 3, 1, "", "add_result_max_error"], [20, 3, 1, "", "add_result_min_error"], [20, 3, 1, "", "add_result_missing_and_none"], [20, 3, 1, "", "add_result_missing_req"], [20, 3, 1, "", "add_result_range_error"], [20, 3, 1, "", "add_result_string_error"], [20, 3, 1, "", "add_result_type_error"], [20, 3, 1, "", "add_rule"], [20, 3, 1, "", "add_rule_if_new"], [20, 3, 1, "", "cache_key"], [20, 3, 1, "", "check_data"], [20, 3, 1, "", "check_data_cross_cycle"], [20, 3, 1, "", "get_fieldnames"], [20, 3, 1, "", "get_value"], [20, 4, 1, "", "id"], [20, 3, 1, "", "init_result"], [20, 3, 1, "", "initialize_cache"], [20, 3, 1, "", "initialize_rules"], [20, 4, 1, "", "name"], [20, 4, 1, "", "objects"], [20, 4, 1, "", "organization"], [20, 4, 1, "", "organization_id"], [20, 3, 1, "", "prune_results"], [20, 3, 1, "", "remove_all_rules"], [20, 3, 1, "", "remove_status_label"], [20, 3, 1, "", "reset_all_rules"], [20, 3, 1, "", "reset_default_rules"], [20, 3, 1, "", "reset_results"], [20, 3, 1, "", "retrieve"], [20, 3, 1, "", "retrieve_result_by_address"], [20, 3, 1, "", "retrieve_result_by_tax_lot_id"], [20, 4, 1, "", "rules"], [20, 3, 1, "", "save_to_cache"], [20, 3, 1, "", "update_status_label"]], "seed.models.data_quality.Rule": [[20, 4, 1, "", "DATA_TYPES"], [20, 4, 1, "", "DEFAULT_RULES"], [20, 6, 1, "", "DoesNotExist"], [20, 6, 1, "", "MultipleObjectsReturned"], [20, 4, 1, "", "RULE_EXCLUDE"], [20, 4, 1, "", "RULE_INCLUDE"], [20, 4, 1, "", "RULE_NOT_NULL"], [20, 4, 1, "", "RULE_RANGE"], [20, 4, 1, "", "RULE_REQUIRED"], [20, 4, 1, "", "RULE_TYPE"], [20, 4, 1, "", "RULE_TYPE_CUSTOM"], [20, 4, 1, "", "RULE_TYPE_DEFAULT"], [20, 4, 1, "", "SEVERITY"], [20, 4, 1, "", "SEVERITY_ERROR"], [20, 4, 1, "", "SEVERITY_VALID"], [20, 4, 1, "", "SEVERITY_WARNING"], [20, 4, 1, "", "TYPE_AREA"], [20, 4, 1, "", "TYPE_DATE"], [20, 4, 1, "", "TYPE_EUI"], [20, 4, 1, "", "TYPE_NUMBER"], [20, 4, 1, "", "TYPE_STRING"], [20, 4, 1, "", "TYPE_YEAR"], [20, 4, 1, "", "condition"], [20, 4, 1, "", "cross_cycle"], [20, 4, 1, "", "data_quality_check"], [20, 4, 1, "", "data_quality_check_id"], [20, 4, 1, "", "data_type"], [20, 4, 1, "", "description"], [20, 4, 1, "", "enabled"], [20, 4, 1, "", "field"], [20, 4, 1, "", "for_derived_column"], [20, 3, 1, "", "format_strings"], [20, 3, 1, "", "get_data_type_display"], [20, 3, 1, "", "get_rule_type_display"], [20, 3, 1, "", "get_severity_display"], [20, 4, 1, "", "id"], [20, 4, 1, "", "max"], [20, 3, 1, "", "maximum_valid"], [20, 4, 1, "", "min"], [20, 3, 1, "", "minimum_valid"], [20, 4, 1, "", "name"], [20, 4, 1, "", "not_null"], [20, 4, 1, "", "objects"], [20, 4, 1, "", "required"], [20, 4, 1, "", "rule_type"], [20, 4, 1, "", "severity"], [20, 4, 1, "", "status_label"], [20, 4, 1, "", "status_label_id"], [20, 3, 1, "", "str_to_data_type"], [20, 4, 1, "", "table_name"], [20, 4, 1, "", "text_match"], [20, 4, 1, "", "units"], [20, 3, 1, "", "valid_text"]], "seed.models.models": [[34, 2, 1, "", "StatusLabel"], [34, 2, 1, "", "Unit"]], "seed.models.models.StatusLabel": [[34, 4, 1, "", "BLUE_CHOICE"], [34, 4, 1, "", "COLOR_CHOICES"], [34, 4, 1, "", "DEFAULT_LABELS"], [34, 6, 1, "", "DoesNotExist"], [34, 4, 1, "", "GRAY_CHOICE"], [34, 4, 1, "", "GREEN_CHOICE"], [34, 4, 1, "", "LIGHT_BLUE_CHOICE"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "ORANGE_CHOICE"], [34, 4, 1, "", "RED_CHOICE"], [34, 4, 1, "", "WHITE_CHOICE"], [34, 4, 1, "", "and_filter_groups"], [34, 4, 1, "", "color"], [34, 4, 1, "", "compliance_label"], [34, 4, 1, "", "exclude_filter_groups"], [34, 3, 1, "", "get_color_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_modified"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_modified"], [34, 4, 1, "", "id"], [34, 4, 1, "", "indication_label"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "or_filter_groups"], [34, 4, 1, "", "propertyview_set"], [34, 4, 1, "", "propertyviewlabel_set"], [34, 4, 1, "", "rule_set"], [34, 4, 1, "", "show_in_list"], [34, 4, 1, "", "super_organization"], [34, 4, 1, "", "super_organization_id"], [34, 4, 1, "", "taxlotview_set"], [34, 3, 1, "", "to_dict"], [34, 4, 1, "", "violation_label"]], "seed.models.models.Unit": [[34, 4, 1, "", "DATE"], [34, 4, 1, "", "DATETIME"], [34, 4, 1, "", "DECIMAL"], [34, 6, 1, "", "DoesNotExist"], [34, 4, 1, "", "FLOAT"], [34, 4, 1, "", "INTEGER"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "STRING"], [34, 4, 1, "", "UNIT_TYPES"], [34, 4, 1, "", "column_set"], [34, 3, 1, "", "get_unit_type_display"], [34, 4, 1, "", "id"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "unit_name"], [34, 4, 1, "", "unit_type"]], "seed.models.properties": [[34, 2, 1, "", "Property"], [34, 2, 1, "", "PropertyAuditLog"], [34, 2, 1, "", "PropertyState"], [34, 2, 1, "", "PropertyView"], [34, 2, 1, "", "PropertyViewLabel"], [34, 1, 1, "", "post_save_property"], [34, 1, 1, "", "post_save_property_state"], [34, 1, 1, "", "post_save_property_view"], [34, 1, 1, "", "pre_delete_state"], [34, 1, 1, "", "set_default_access_level_instance"], [34, 1, 1, "", "sync_latitude_longitude_and_long_lat"]], "seed.models.properties.Property": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "access_level_instance"], [34, 4, 1, "", "access_level_instance_id"], [34, 4, 1, "", "analysispropertyview_set"], [34, 3, 1, "", "copy_meters"], [34, 4, 1, "", "created"], [34, 4, 1, "", "data_loggers"], [34, 4, 1, "", "elements"], [34, 4, 1, "", "events"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 4, 1, "", "goalnote_set"], [34, 4, 1, "", "historical_note"], [34, 4, 1, "", "id"], [34, 4, 1, "", "inventory_documents"], [34, 4, 1, "", "meters"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "parent_property"], [34, 4, 1, "", "parent_property_id"], [34, 4, 1, "", "property_set"], [34, 4, 1, "", "updated"], [34, 4, 1, "", "views"]], "seed.models.properties.PropertyAuditLog": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "created"], [34, 4, 1, "", "description"], [34, 3, 1, "", "get_record_type_display"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_filename"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "parent1"], [34, 4, 1, "", "parent1_id"], [34, 4, 1, "", "parent2"], [34, 4, 1, "", "parent2_id"], [34, 4, 1, "", "parent_state1"], [34, 4, 1, "", "parent_state1_id"], [34, 4, 1, "", "parent_state2"], [34, 4, 1, "", "parent_state2_id"], [34, 4, 1, "", "propertyauditlog_parent1"], [34, 4, 1, "", "propertyauditlog_parent2"], [34, 4, 1, "", "record_type"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 4, 1, "", "view"], [34, 4, 1, "", "view_id"]], "seed.models.properties.PropertyState": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "address_line_1"], [34, 4, 1, "", "address_line_2"], [34, 4, 1, "", "analysispropertyview"], [34, 4, 1, "", "audit_template_building_id"], [34, 4, 1, "", "bounding_box"], [34, 4, 1, "", "building_certification"], [34, 4, 1, "", "building_count"], [34, 4, 1, "", "building_files"], [34, 4, 1, "", "centroid"], [34, 4, 1, "", "city"], [34, 3, 1, "", "clean"], [34, 4, 1, "", "conditioned_floor_area"], [34, 4, 1, "", "conditioned_floor_area_orig"], [34, 3, 1, "", "coparent"], [34, 4, 1, "", "created"], [34, 4, 1, "", "custom_id_1"], [34, 4, 1, "", "data_state"], [34, 4, 1, "", "derived_data"], [34, 4, 1, "", "egrid_subregion_code"], [34, 4, 1, "", "energy_alerts"], [34, 4, 1, "", "energy_score"], [34, 4, 1, "", "extra_data"], [34, 4, 1, "", "generation_date"], [34, 4, 1, "", "geocoding_confidence"], [34, 3, 1, "", "get_data_state_display"], [34, 3, 1, "", "get_merge_state_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 3, 1, "", "get_source_type_display"], [34, 4, 1, "", "gross_floor_area"], [34, 4, 1, "", "gross_floor_area_orig"], [34, 4, 1, "", "hash_object"], [34, 3, 1, "", "history"], [34, 4, 1, "", "home_energy_score_id"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_file"], [34, 4, 1, "", "import_file_id"], [34, 4, 1, "", "indoor_water_use"], [34, 4, 1, "", "indoor_wui"], [34, 4, 1, "", "jurisdiction_property_id"], [34, 4, 1, "", "latitude"], [34, 4, 1, "", "long_lat"], [34, 4, 1, "", "longitude"], [34, 4, 1, "", "lot_number"], [34, 4, 1, "", "measure_set"], [34, 4, 1, "", "measures"], [34, 3, 1, "", "merge_relationships"], [34, 4, 1, "", "merge_state"], [34, 4, 1, "", "normalized_address"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "occupied_floor_area"], [34, 4, 1, "", "occupied_floor_area_orig"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "outdoor_water_use"], [34, 4, 1, "", "owner"], [34, 4, 1, "", "owner_address"], [34, 4, 1, "", "owner_city_state"], [34, 4, 1, "", "owner_email"], [34, 4, 1, "", "owner_postal_code"], [34, 4, 1, "", "owner_telephone"], [34, 4, 1, "", "parent_state1"], [34, 4, 1, "", "parent_state2"], [34, 4, 1, "", "pm_parent_property_id"], [34, 4, 1, "", "pm_property_id"], [34, 4, 1, "", "postal_code"], [34, 3, 1, "", "promote"], [34, 4, 1, "", "property_footprint"], [34, 4, 1, "", "property_name"], [34, 4, 1, "", "property_notes"], [34, 4, 1, "", "property_timezone"], [34, 4, 1, "", "property_type"], [34, 4, 1, "", "propertyauditlog_state"], [34, 4, 1, "", "propertymeasure_set"], [34, 4, 1, "", "propertyview_set"], [34, 4, 1, "", "raw_access_level_instance"], [34, 4, 1, "", "raw_access_level_instance_error"], [34, 4, 1, "", "raw_access_level_instance_id"], [34, 4, 1, "", "recent_sale_date"], [34, 4, 1, "", "release_date"], [34, 3, 1, "", "save"], [34, 4, 1, "", "scenarios"], [34, 4, 1, "", "simulation"], [34, 4, 1, "", "site_eui"], [34, 4, 1, "", "site_eui_modeled"], [34, 4, 1, "", "site_eui_modeled_orig"], [34, 4, 1, "", "site_eui_orig"], [34, 4, 1, "", "site_eui_weather_normalized"], [34, 4, 1, "", "site_eui_weather_normalized_orig"], [34, 4, 1, "", "source_eui"], [34, 4, 1, "", "source_eui_modeled"], [34, 4, 1, "", "source_eui_modeled_orig"], [34, 4, 1, "", "source_eui_orig"], [34, 4, 1, "", "source_eui_weather_normalized"], [34, 4, 1, "", "source_eui_weather_normalized_orig"], [34, 4, 1, "", "source_type"], [34, 4, 1, "", "space_alerts"], [34, 4, 1, "", "state"], [34, 3, 1, "", "to_dict"], [34, 4, 1, "", "total_ghg_emissions"], [34, 4, 1, "", "total_ghg_emissions_intensity"], [34, 4, 1, "", "total_marginal_ghg_emissions"], [34, 4, 1, "", "total_marginal_ghg_emissions_intensity"], [34, 4, 1, "", "ubid"], [34, 4, 1, "", "ubidmodel_set"], [34, 4, 1, "", "updated"], [34, 4, 1, "", "use_description"], [34, 4, 1, "", "water_use"], [34, 4, 1, "", "wui"], [34, 4, 1, "", "year_built"], [34, 4, 1, "", "year_ending"]], "seed.models.properties.PropertyView": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "cycle"], [34, 4, 1, "", "cycle_id"], [34, 4, 1, "", "gapauditlog_view"], [34, 4, 1, "", "greenassessmentproperty_set"], [34, 4, 1, "", "id"], [34, 5, 1, "", "import_filename"], [34, 3, 1, "", "initialize_audit_logs"], [34, 4, 1, "", "labels"], [34, 4, 1, "", "notes"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "property"], [34, 4, 1, "", "property_id"], [34, 4, 1, "", "propertyauditlog_view"], [34, 4, 1, "", "propertyviewlabel_set"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 3, 1, "", "tax_lot_states"], [34, 3, 1, "", "tax_lot_views"], [34, 4, 1, "", "taxlotproperty_set"]], "seed.models.properties.PropertyViewLabel": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "goal"], [34, 4, 1, "", "goal_id"], [34, 4, 1, "", "id"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "propertyview"], [34, 4, 1, "", "propertyview_id"], [34, 4, 1, "", "statuslabel"], [34, 4, 1, "", "statuslabel_id"]], "seed.models.tax_lots": [[34, 2, 1, "", "TaxLot"], [34, 2, 1, "", "TaxLotAuditLog"], [34, 2, 1, "", "TaxLotState"], [34, 2, 1, "", "TaxLotView"], [34, 1, 1, "", "post_save_taxlot_state"], [34, 1, 1, "", "post_save_taxlot_view"], [34, 1, 1, "", "set_default_access_level_instance"], [34, 1, 1, "", "sync_latitude_longitude_and_long_lat"]], "seed.models.tax_lots.TaxLot": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "access_level_instance"], [34, 4, 1, "", "access_level_instance_id"], [34, 4, 1, "", "created"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 4, 1, "", "id"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "updated"], [34, 4, 1, "", "views"]], "seed.models.tax_lots.TaxLotAuditLog": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "created"], [34, 4, 1, "", "description"], [34, 3, 1, "", "get_record_type_display"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_filename"], [34, 4, 1, "", "name"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "parent1"], [34, 4, 1, "", "parent1_id"], [34, 4, 1, "", "parent2"], [34, 4, 1, "", "parent2_id"], [34, 4, 1, "", "parent_state1"], [34, 4, 1, "", "parent_state1_id"], [34, 4, 1, "", "parent_state2"], [34, 4, 1, "", "parent_state2_id"], [34, 4, 1, "", "record_type"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 4, 1, "", "taxlotauditlog_parent1"], [34, 4, 1, "", "taxlotauditlog_parent2"], [34, 4, 1, "", "view"], [34, 4, 1, "", "view_id"]], "seed.models.tax_lots.TaxLotState": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "address_line_1"], [34, 4, 1, "", "address_line_2"], [34, 4, 1, "", "block_number"], [34, 4, 1, "", "bounding_box"], [34, 4, 1, "", "centroid"], [34, 4, 1, "", "city"], [34, 3, 1, "", "coparent"], [34, 4, 1, "", "created"], [34, 4, 1, "", "custom_id_1"], [34, 4, 1, "", "data_state"], [34, 4, 1, "", "derived_data"], [34, 4, 1, "", "district"], [34, 4, 1, "", "extra_data"], [34, 4, 1, "", "geocoding_confidence"], [34, 3, 1, "", "get_data_state_display"], [34, 3, 1, "", "get_merge_state_display"], [34, 3, 1, "", "get_next_by_created"], [34, 3, 1, "", "get_next_by_updated"], [34, 3, 1, "", "get_previous_by_created"], [34, 3, 1, "", "get_previous_by_updated"], [34, 4, 1, "", "hash_object"], [34, 3, 1, "", "history"], [34, 4, 1, "", "id"], [34, 4, 1, "", "import_file"], [34, 4, 1, "", "import_file_id"], [34, 4, 1, "", "jurisdiction_tax_lot_id"], [34, 4, 1, "", "latitude"], [34, 4, 1, "", "long_lat"], [34, 4, 1, "", "longitude"], [34, 3, 1, "", "merge_relationships"], [34, 4, 1, "", "merge_state"], [34, 4, 1, "", "normalized_address"], [34, 4, 1, "", "number_properties"], [34, 4, 1, "", "objects"], [34, 4, 1, "", "organization"], [34, 4, 1, "", "organization_id"], [34, 4, 1, "", "postal_code"], [34, 3, 1, "", "promote"], [34, 4, 1, "", "raw_access_level_instance"], [34, 4, 1, "", "raw_access_level_instance_error"], [34, 4, 1, "", "raw_access_level_instance_id"], [34, 3, 1, "", "save"], [34, 4, 1, "", "state"], [34, 4, 1, "", "taxlot_footprint"], [34, 4, 1, "", "taxlotauditlog_parent_state1"], [34, 4, 1, "", "taxlotauditlog_parent_state2"], [34, 4, 1, "", "taxlotauditlog_state"], [34, 4, 1, "", "taxlotview_set"], [34, 3, 1, "", "to_dict"], [34, 4, 1, "", "ubid"], [34, 4, 1, "", "ubidmodel_set"], [34, 4, 1, "", "updated"]], "seed.models.tax_lots.TaxLotView": [[34, 6, 1, "", "DoesNotExist"], [34, 6, 1, "", "MultipleObjectsReturned"], [34, 4, 1, "", "cycle"], [34, 4, 1, "", "cycle_id"], [34, 4, 1, "", "id"], [34, 5, 1, "", "import_filename"], [34, 3, 1, "", "initialize_audit_logs"], [34, 4, 1, "", "labels"], [34, 4, 1, "", "notes"], [34, 4, 1, "", "objects"], [34, 3, 1, "", "property_states"], [34, 3, 1, "", "property_views"], [34, 4, 1, "", "state"], [34, 4, 1, "", "state_id"], [34, 4, 1, "", "taxlot"], [34, 4, 1, "", "taxlot_id"], [34, 4, 1, "", "taxlotauditlog_view"], [34, 4, 1, "", "taxlotproperty_set"]], "seed.search": [[19, 1, 1, "", "build_shared_buildings_orgs"], [19, 1, 1, "", "create_inventory_queryset"], [19, 1, 1, "", "get_inventory_fieldnames"], [19, 1, 1, "", "get_orgs_w_public_fields"], [19, 1, 1, "", "inventory_search_filter_sort"], [19, 1, 1, "", "parse_body"], [19, 1, 1, "", "process_search_params"], [19, 1, 1, "", "search_inventory"], [19, 1, 1, "", "search_properties"], [19, 1, 1, "", "search_taxlots"]], "seed.serializers": [[36, 0, 0, "-", "celery"], [36, 0, 0, "-", "labels"]], "seed.serializers.celery": [[36, 2, 1, "", "CeleryDatetimeSerializer"]], "seed.serializers.celery.CeleryDatetimeSerializer": [[36, 3, 1, "", "default"], [36, 3, 1, "", "seed_decoder"], [36, 3, 1, "", "seed_dumps"], [36, 3, 1, "", "seed_loads"]], "seed.serializers.labels": [[36, 2, 1, "", "LabelSerializer"]], "seed.serializers.labels.LabelSerializer": [[36, 2, 1, "", "Meta"], [36, 3, 1, "", "get_is_applied"], [36, 3, 1, "", "to_representation"]], "seed.serializers.labels.LabelSerializer.Meta": [[36, 4, 1, "", "extra_kwargs"], [36, 4, 1, "", "fields"], [36, 4, 1, "", "model"]], "seed.tasks": [[19, 1, 1, "", "delete_organization"], [19, 1, 1, "", "invite_new_user_to_seed"], [19, 1, 1, "", "send_salesforce_error_log"]], "seed.templatetags": [[37, 0, 0, "-", "breadcrumbs"]], "seed.templatetags.breadcrumbs": [[37, 2, 1, "", "BreadcrumbNode"], [37, 2, 1, "", "UrlBreadcrumbNode"], [37, 1, 1, "", "breadcrumb"], [37, 1, 1, "", "breadcrumb_root"], [37, 1, 1, "", "breadcrumb_url"], [37, 1, 1, "", "breadcrumb_url_root"], [37, 1, 1, "", "create_crumb"], [37, 1, 1, "", "create_crumb_first"]], "seed.templatetags.breadcrumbs.BreadcrumbNode": [[37, 3, 1, "", "render"]], "seed.templatetags.breadcrumbs.UrlBreadcrumbNode": [[37, 3, 1, "", "render"]], "seed.test_helpers.factory": [[39, 0, 0, "-", "helpers"]], "seed.test_helpers.factory.helpers": [[39, 2, 1, "", "DjangoFunctionalFactory"]], "seed.test_helpers.factory.helpers.DjangoFunctionalFactory": [[39, 3, 1, "", "invalid_test_cc_number"], [39, 3, 1, "", "rand_bool"], [39, 3, 1, "", "rand_city"], [39, 3, 1, "", "rand_city_suffix"], [39, 3, 1, "", "rand_currency"], [39, 3, 1, "", "rand_date"], [39, 3, 1, "", "rand_domain"], [39, 3, 1, "", "rand_email"], [39, 3, 1, "", "rand_float"], [39, 3, 1, "", "rand_int"], [39, 3, 1, "", "rand_name"], [39, 3, 1, "", "rand_phone"], [39, 3, 1, "", "rand_plant_name"], [39, 3, 1, "", "rand_str"], [39, 3, 1, "", "rand_street_address"], [39, 3, 1, "", "rand_street_suffix"], [39, 3, 1, "", "test_cc_number"], [39, 3, 1, "", "valid_test_cc_number"]], "seed.tests": [[41, 0, 0, "-", "test_admin_views"], [41, 0, 0, "-", "test_decorators"], [41, 0, 0, "-", "test_tasks"], [41, 0, 0, "-", "test_views"], [41, 0, 0, "-", "util"]], "seed.tests.test_admin_views": [[41, 2, 1, "", "AdminViewsTest"]], "seed.tests.test_admin_views.AdminViewsTest": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_add_org"], [41, 3, 1, "", "test_add_org_dupe"], [41, 3, 1, "", "test_add_owner_existing_org_to_non_root"], [41, 3, 1, "", "test_add_user_existing_org"], [41, 3, 1, "", "test_add_user_new_org"], [41, 3, 1, "", "test_add_user_no_org"], [41, 3, 1, "", "test_signup_process"], [41, 3, 1, "", "test_signup_process_force_lowercase_email"]], "seed.tests.test_decorators": [[41, 2, 1, "", "ClassDecoratorTests"], [41, 2, 1, "", "RequireOrganizationIDTests"], [41, 2, 1, "", "TestDecorators"], [41, 6, 1, "", "TestError"]], "seed.tests.test_decorators.ClassDecoratorTests": [[41, 3, 1, "", "test_ajax_request_class_dict"], [41, 3, 1, "", "test_ajax_request_class_dict_status_error"], [41, 3, 1, "", "test_ajax_request_class_dict_status_false"], [41, 3, 1, "", "test_ajax_request_class_format_type"], [41, 3, 1, "", "test_require_organization_id_class_no_org_id"], [41, 3, 1, "", "test_require_organization_id_class_org_id"], [41, 3, 1, "", "test_require_organization_id_class_org_id_not_int"]], "seed.tests.test_decorators.RequireOrganizationIDTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_require_organization_id_fail_no_key"], [41, 3, 1, "", "test_require_organization_id_fail_not_numeric"], [41, 3, 1, "", "test_require_organization_id_success_integer"], [41, 3, 1, "", "test_require_organization_id_success_string"]], "seed.tests.test_decorators.TestDecorators": [[41, 4, 1, "", "locked"], [41, 4, 1, "", "pk"], [41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_get_prog_key"], [41, 3, 1, "", "test_increment_cache"], [41, 3, 1, "", "test_locking"], [41, 3, 1, "", "test_locking_w_exception"], [41, 3, 1, "", "test_progress"], [41, 4, 1, "", "unlocked"]], "seed.tests.test_tasks": [[41, 2, 1, "", "TestTasks"]], "seed.tests.test_tasks.TestTasks": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_delete_organization"], [41, 3, 1, "", "test_rehash_query_or_structure"]], "seed.tests.test_views": [[41, 2, 1, "", "DatasetPermissionsTests"], [41, 2, 1, "", "GetDatasetsViewsTests"], [41, 2, 1, "", "ImportFileViewsTests"], [41, 2, 1, "", "InventoryViewTests"], [41, 2, 1, "", "MainViewTests"], [41, 2, 1, "", "TestMCMViews"]], "seed.tests.test_views.DatasetPermissionsTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_dataset_count"], [41, 3, 1, "", "test_dataset_create"], [41, 3, 1, "", "test_dataset_destroy"], [41, 3, 1, "", "test_dataset_list"], [41, 3, 1, "", "test_dataset_retrieve"], [41, 3, 1, "", "test_dataset_update"]], "seed.tests.test_views.GetDatasetsViewsTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_delete_dataset"], [41, 3, 1, "", "test_get_dataset"], [41, 3, 1, "", "test_get_datasets"], [41, 3, 1, "", "test_get_datasets_count"], [41, 3, 1, "", "test_get_datasets_count_invalid"], [41, 3, 1, "", "test_update_dataset"]], "seed.tests.test_views.ImportFileViewsTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_delete_file"], [41, 3, 1, "", "test_get_import_file"], [41, 3, 1, "", "test_get_matching_and_geocoding_results"]], "seed.tests.test_views.InventoryViewTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_get_cycles"], [41, 3, 1, "", "test_get_properties"], [41, 3, 1, "", "test_get_properties_cycle_id"], [41, 3, 1, "", "test_get_properties_empty_page"], [41, 3, 1, "", "test_get_properties_page_not_an_integer"], [41, 3, 1, "", "test_get_properties_pint_fields"], [41, 3, 1, "", "test_get_properties_profile_id"], [41, 3, 1, "", "test_get_properties_property_extra_data"], [41, 3, 1, "", "test_get_properties_select_all"], [41, 3, 1, "", "test_get_properties_taxlot_extra_data"], [41, 3, 1, "", "test_get_properties_with_taxlots"], [41, 3, 1, "", "test_get_properties_with_taxlots_with_footprints"], [41, 3, 1, "", "test_get_properties_wrong_query_params"], [41, 3, 1, "", "test_get_property"], [41, 3, 1, "", "test_get_property_columns"], [41, 3, 1, "", "test_get_property_multiple_taxlots"], [41, 3, 1, "", "test_get_taxlot"], [41, 3, 1, "", "test_get_taxlot_columns"], [41, 3, 1, "", "test_get_taxlots"], [41, 3, 1, "", "test_get_taxlots_empty_page"], [41, 3, 1, "", "test_get_taxlots_extra_data"], [41, 3, 1, "", "test_get_taxlots_multiple_taxlots"], [41, 3, 1, "", "test_get_taxlots_no_cycle_id"], [41, 3, 1, "", "test_get_taxlots_page_not_an_integer"], [41, 3, 1, "", "test_get_taxlots_profile_id"], [41, 3, 1, "", "test_postoffice"], [41, 3, 1, "", "test_update_pint_fields_with_modified_display_settings"]], "seed.tests.test_views.MainViewTests": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_home"]], "seed.tests.test_views.TestMCMViews": [[41, 3, 1, "", "assert_expected_mappings"], [41, 4, 1, "", "expected_mappings"], [41, 4, 1, "", "raw_columns_expected"], [41, 3, 1, "", "setUp"], [41, 3, 1, "", "test_create_dataset"], [41, 3, 1, "", "test_get_column_mapping_suggestions"], [41, 3, 1, "", "test_get_column_mapping_suggestions_pm_file"], [41, 3, 1, "", "test_get_column_mapping_suggestions_with_columns"], [41, 3, 1, "", "test_get_raw_column_names"], [41, 3, 1, "", "test_progress"], [41, 3, 1, "", "test_save_column_mappings"], [41, 3, 1, "", "test_save_column_mappings_idempotent"]], "seed.tests.util": [[41, 2, 1, "", "AccessLevelBaseTestCase"], [41, 2, 1, "", "AssertDictSubsetMixin"], [41, 2, 1, "", "DataMappingBaseTestCase"], [41, 2, 1, "", "DeleteModelsTestCase"], [41, 2, 1, "", "FakeClient"], [41, 2, 1, "", "FakeRequest"]], "seed.tests.util.AccessLevelBaseTestCase": [[41, 3, 1, "", "login_as_child_member"], [41, 3, 1, "", "login_as_root_member"], [41, 3, 1, "", "login_as_root_owner"], [41, 3, 1, "", "setUp"]], "seed.tests.util.AssertDictSubsetMixin": [[41, 3, 1, "", "assertDictContainsSubset"]], "seed.tests.util.DataMappingBaseTestCase": [[41, 3, 1, "", "create_import_file"], [41, 3, 1, "", "set_up"]], "seed.tests.util.DeleteModelsTestCase": [[41, 3, 1, "", "setUp"], [41, 3, 1, "", "tearDown"]], "seed.tests.util.FakeClient": [[41, 3, 1, "", "get"], [41, 3, 1, "", "post"]], "seed.tests.util.FakeRequest": [[41, 4, 1, "", "GET"], [41, 4, 1, "", "META"], [41, 4, 1, "", "POST"], [41, 4, 1, "", "body"], [41, 4, 1, "", "path"]], "seed.token_generators": [[19, 2, 1, "", "SignupTokenGenerator"]], "seed.token_generators.SignupTokenGenerator": [[19, 3, 1, "", "check_token"], [19, 3, 1, "", "make_token"]], "seed.utils": [[44, 0, 0, "-", "api"], [44, 0, 0, "-", "buildings"], [44, 0, 0, "-", "organizations"], [44, 0, 0, "-", "time"]], "seed.utils.api": [[44, 2, 1, "", "APIBypassCSRFMiddleware"], [44, 2, 1, "", "OrgCreateMixin"], [44, 2, 1, "", "OrgCreateUpdateMixin"], [44, 2, 1, "", "OrgMixin"], [44, 2, 1, "", "OrgQuerySetMixin"], [44, 2, 1, "", "OrgUpdateMixin"], [44, 2, 1, "", "OrgValidateMixin"], [44, 2, 1, "", "OrgValidator"], [44, 2, 1, "", "ProfileIdMixin"], [44, 1, 1, "", "api_endpoint"], [44, 1, 1, "", "api_endpoint_class"], [44, 1, 1, "", "clean_api_regex"], [44, 1, 1, "", "drf_api_endpoint"], [44, 1, 1, "", "format_api_docstring"], [44, 1, 1, "", "get_all_urls"], [44, 1, 1, "", "get_api_endpoints"], [44, 1, 1, "", "get_api_request_user"], [44, 1, 1, "", "get_org_id_from_validator"], [44, 1, 1, "", "rgetattr"]], "seed.utils.api.OrgCreateMixin": [[44, 3, 1, "", "perform_create"]], "seed.utils.api.OrgMixin": [[44, 3, 1, "", "get_organization"], [44, 3, 1, "", "get_parent_org"]], "seed.utils.api.OrgQuerySetMixin": [[44, 3, 1, "", "get_queryset"]], "seed.utils.api.OrgUpdateMixin": [[44, 3, 1, "", "perform_update"]], "seed.utils.api.OrgValidateMixin": [[44, 3, 1, "", "validate"], [44, 3, 1, "", "validate_org"]], "seed.utils.api.OrgValidator": [[44, 4, 1, "", "field"], [44, 4, 1, "", "key"]], "seed.utils.api.ProfileIdMixin": [[44, 3, 1, "", "get_show_columns"]], "seed.utils.buildings": [[44, 1, 1, "", "get_source_type"]], "seed.utils.organizations": [[44, 1, 1, "", "create_organization"], [44, 1, 1, "", "create_suborganization"], [44, 1, 1, "", "default_pm_mappings"], [44, 1, 1, "", "set_default_2fa_method"]], "seed.utils.time": [[44, 1, 1, "", "convert_datestr"], [44, 1, 1, "", "convert_to_js_timestamp"], [44, 1, 1, "", "parse_datetime"]]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method", "4": "py:attribute", "5": "py:property", "6": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"], "4": ["py", "attribute", "Python attribute"], "5": ["py", "property", "Python property"], "6": ["py", "exception", "Python exception"]}, "titleterms": {"api": [0, 43, 44, 45, 48], "authent": 0, "payload": 0, "respons": 0, "endpoint": 0, "aw": [1, 6, 11, 13], "setup": [1, 8, 11, 13], "prerequisit": [1, 13, 48], "amazon": 1, "web": [1, 11, 13], "servic": [1, 13], "depend": [1, 13, 48], "python": [1, 5, 13, 48], "javascript": [1, 13, 48], "databas": [1, 5, 13, 46, 48], "configur": [1, 11, 13, 18, 48], "cach": [1, 13], "messag": [1, 13], "broker": [1, 13], "run": [1, 13, 47, 48], "celeri": [1, 11, 13], "background": [1, 13], "task": [1, 13, 19, 41], "worker": [1, 13], "data": [2, 3, 10, 20, 21, 22], "model": [2, 19, 20, 22, 24, 34, 35, 41], "todo": [2, 14], "parent": 2, "children": 2, "match": [2, 14, 15], "manual": 2, "v": 2, "auto": 2, "what": [2, 7, 15], "realli": 2, "happen": 2, "buildingsnapshot": 2, "tabl": [2, 10], "import": [2, 14, 22], "when": [2, 15], "canonicalbuild": 2, "organ": [2, 44], "_source_id": 2, "field": [2, 5], "extra_data": 2, "save": 2, "possibl": 2, "loss": 2, "qualiti": [3, 20], "deploy": [4, 6, 11, 16], "guid": [4, 11], "migrat": [4, 5, 16, 48], "monitor": 4, "sentri": 4, "develop": [5, 8, 9, 13, 16, 47], "resourc": [5, 11], "gener": [5, 13, 19, 34, 49], "note": [5, 15], "pre": 5, "commit": 5, "ruff": 5, "set": [5, 7], "type": 5, "hint": 5, "usag": 5, "check": 5, "django": [5, 13, 48], "ad": 5, "new": 5, "nginx": 5, "angularj": 5, "integr": 5, "templat": [5, 18], "tag": 5, "csrf": 5, "token": [5, 19], "ajax": 5, "request": 5, "rout": 5, "partial": 5, "view": [5, 18, 19, 20, 22, 24, 41, 45], "log": [5, 11], "bede": [5, 21], "complianc": 5, "manag": [5, 11, 22, 25, 26, 30, 31, 32], "column": [5, 34], "reset": 5, "restor": 5, "dump": 5, "test": [5, 18, 20, 24, 32, 38, 39, 40, 41, 42, 47], "build": [5, 44, 47], "document": 5, "contribut": 5, "instruct": [5, 48], "best": 5, "practic": 5, "releas": 5, "docker": [6, 16, 47], "instal": [6, 47, 48], "deploi": 6, "frequent": 7, "ask": 7, "question": 7, "i": [7, 15], "seed": [7, 9, 10, 19, 25, 28, 29, 33, 46, 49], "platform": [7, 9, 10], "issu": 7, "why": [7, 15], "domain": 7, "exampl": 7, "com": 7, "aren": 7, "t": [7, 49], "static": 7, "asset": 7, "being": 7, "serv": 7, "correctli": 7, "get": 8, "start": [8, 48], "help": 9, "For": 9, "user": [9, 13, 48], "standard": 10, "energi": 10, "effici": 10, "indic": 10, "kubernet": 11, "helm": 11, "cluster": 11, "cli": 11, "kubectl": 11, "ek": 11, "control": 11, "specif": 11, "chart": 11, "exist": [11, 15], "upgrad": [11, 46], "redeploi": 11, "stack": 11, "In": [11, 15], "updat": [11, 26], "other": 11, "licens": 12, "linux": 13, "postgresql": [13, 48], "creat": 13, "initi": 13, "server": [13, 47, 48], "product": 13, "environ": 13, "variabl": 13, "mail": 13, "se": 13, "smtp": 13, "local_untrack": 13, "py": 13, "map": [14, 28, 33], "pair": 14, "doe": 15, "how": 15, "us": [15, 47], "cycl": [15, 34], "merg": [15, 29], "link": 15, "across": 15, "put": 15, "them": 15, "togeth": 15, "Not": 15, "search": [15, 19], "depth": 15, "version": 16, "3": 16, "2": [16, 48], "0": [16, 48], "1": [16, 48], "beta": 16, "22": 16, "21": 16, "20": 16, "19": 16, "18": 16, "17": 16, "4": 16, "16": [16, 46], "15": 16, "14": 16, "13": 16, "12": [16, 46], "11": [16, 48], "10": 16, "7": 16, "9": 16, "6": 16, "base": [16, 42], "ubuntu": [16, 47], "max": 16, "osx": [16, 47, 48], "5": [16, 48], "modul": [17, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 45], "submodul": [18, 19, 20, 21, 22, 23, 24, 26, 27, 28, 29, 31, 32, 33, 34, 35, 36, 37, 39, 40, 41, 42, 43, 44, 45], "context": 18, "util": [18, 19, 22, 41, 44], "wsgi": 18, "packag": [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 48], "subpackag": [19, 24, 25, 30, 31, 38, 39], "inherit": [19, 20], "decor": [19, 41], "factori": [19, 40], "content": [19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 38, 45], "url": [22, 24, 43], "featur": 23, "land": [24, 25, 26], "form": 24, "eula": 26, "librari": 27, "lib": [28, 29, 40], "mapper": [28, 33], "mapping_column": 28, "mapping_data": 28, "test_mapp": 28, "test_mapping_column": 28, "test_mapping_data": 28, "json": [31, 32], "seed_map": 33, "auditlog": 34, "join": 34, "properti": 34, "taxlot": 34, "public": 35, "serial": 36, "label": 36, "templatetag": 37, "breadcrumb": 37, "helper": [38, 39, 40], "factor": 39, "chomski": 40, "admin": [41, 48], "export": 41, "function": 42, "page": 42, "account": [43, 45], "main": [43, 45], "time": 44, "meter": 45, "from": 46, "postgr": 46, "assumpt": 46, "nativ": 47, "window": 47, "contain": 47, "non": 47, "debug": 47, "quick": 48, "postgi": 48, "timescaledb": 48, "nodej": 48, "npm": 48, "mapquest": 48, "kei": 48, "redi": 48, "login": 48, "translat": 49, "philosophi": 49, "style": 49, "don": 49, "go": 49, "crazi": 49, "indirect": 49, "interpol": 49}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx.ext.intersphinx": 1, "sphinx": 60}, "alltitles": {"API": [[0, "api"]], "Authentication": [[0, "authentication"]], "Payloads": [[0, "payloads"]], "Responses": [[0, "responses"]], "API Endpoints": [[0, "api-endpoints"]], "AWS Setup": [[1, "aws-setup"]], "Prerequisites": [[1, "prerequisites"], [13, "prerequisites"], [48, "prerequisites"]], "Amazon Web Services (AWS) Dependencies": [[1, "amazon-web-services-aws-dependencies"]], "Python Dependencies": [[1, "python-dependencies"], [13, "python-dependencies"]], "JavaScript Dependencies": [[1, "javascript-dependencies"], [13, "javascript-dependencies"]], "Database Configuration": [[1, "database-configuration"]], "Cache and Message Broker": [[1, "cache-and-message-broker"], [13, "cache-and-message-broker"]], "Running Celery the Background Task Worker": [[1, "running-celery-the-background-task-worker"]], "Data Model": [[2, "data-model"]], "Todo": [[2, "id1"], [14, "id2"], [14, "id3"]], "parents and children": [[2, "parents-and-children"]], "matching": [[2, "matching"]], "manual-matching vs auto-matching": [[2, "manual-matching-vs-auto-matching"]], "what really happens to the BuildingSnapshot table on import (and when)": [[2, "what-really-happens-to-the-buildingsnapshot-table-on-import-and-when"]], "what really happens to the CanonicalBuilding table on import (and when)": [[2, "what-really-happens-to-the-canonicalbuilding-table-on-import-and-when"]], "organization": [[2, "organization"]], "*_source_id fields": [[2, "source-id-fields"]], "extra_data": [[2, "extra-data"]], "saving and possible data loss": [[2, "saving-and-possible-data-loss"]], "Data Quality": [[3, "data-quality"]], "Deployment Guide": [[4, "deployment-guide"]], "Migrations": [[4, "migrations"], [16, "migrations"]], "Monitoring": [[4, "monitoring"]], "Sentry": [[4, "sentry"]], "Developer Resources": [[5, "developer-resources"]], "General Notes": [[5, "general-notes"]], "Pre-commit": [[5, "pre-commit"]], "Ruff Settings": [[5, "ruff-settings"]], "Python Type Hints": [[5, "python-type-hints"]], "Usage": [[5, "usage"]], "Type Checking": [[5, "type-checking"]], "Django Notes": [[5, "django-notes"]], "Adding New Fields to Database": [[5, "adding-new-fields-to-database"]], "NGINX Notes": [[5, "nginx-notes"]], "AngularJS Integration Notes": [[5, "angularjs-integration-notes"]], "Template Tags": [[5, "template-tags"]], "Django CSRF Token and AJAX Requests": [[5, "django-csrf-token-and-ajax-requests"]], "Routes and Partials or Views": [[5, "routes-and-partials-or-views"]], "Logging": [[5, "logging"]], "BEDES Compliance and Managing Columns": [[5, "bedes-compliance-and-managing-columns"]], "Resetting the Database": [[5, "resetting-the-database"]], "Restoring a Database Dump": [[5, "restoring-a-database-dump"]], "Migrating the Database": [[5, "migrating-the-database"]], "Testing": [[5, "testing"]], "Building Documentation": [[5, "building-documentation"]], "Contribution Instructions / Best Practices": [[5, "contribution-instructions-best-practices"]], "Release Instructions": [[5, "release-instructions"]], "Docker Deployment on AWS": [[6, "docker-deployment-on-aws"]], "Installation": [[6, "installation"]], "Deploying with Docker": [[6, "deploying-with-docker"]], "Frequently Asked Questions": [[7, "frequently-asked-questions"]], "Questions": [[7, "questions"]], "What is the SEED Platform?": [[7, "what-is-the-seed-platform"]], "Issues": [[7, "issues"]], "Why is the domain set to example.com?": [[7, "why-is-the-domain-set-to-example-com"]], "Why aren\u2019t the static assets being served correctly?": [[7, "why-aren-t-the-static-assets-being-served-correctly"]], "Getting Started": [[8, "getting-started"]], "Development Setup": [[8, "development-setup"]], "Help": [[9, "help"]], "For SEED Platform Users": [[9, "for-seed-platform-users"]], "For SEED Platform Developers": [[9, "for-seed-platform-developers"]], "Standard Energy Efficiency Data (SEED) Platform": [[10, "standard-energy-efficiency-data-seed-platform"]], "Indices and tables": [[10, "indices-and-tables"]], "Kubernetes Deployment Guide with Helm": [[11, "kubernetes-deployment-guide-with-helm"]], "Setup": [[11, "setup"]], "Cluster": [[11, "cluster"]], "AWS CLI Configuration": [[11, "aws-cli-configuration"]], "Kubectl": [[11, "kubectl"]], "Helm": [[11, "helm"]], "EKS Control (AWS Specific)": [[11, "eks-control-aws-specific"]], "Charts": [[11, "charts"]], "Deployment": [[11, "deployment"]], "Managing Existing Clusters": [[11, "managing-existing-clusters"]], "Upgrade/Redeploy the Helm Stack": [[11, "upgrade-redeploy-the-helm-stack"]], "Managing the Kubernetes Cluster (AWS Specific)": [[11, "managing-the-kubernetes-cluster-aws-specific"]], "Logging In": [[11, "logging-in"]], "Update web and web-celery": [[11, "update-web-and-web-celery"]], "Other Resources": [[11, "other-resources"]], "License": [[12, "license"]], "General Linux Setup": [[13, "general-linux-setup"]], "Configure PostgreSQL": [[13, "configure-postgresql"]], "Django Database Configuration": [[13, "django-database-configuration"]], "Creating the initial user": [[13, "creating-the-initial-user"]], "Running celery the background task worker": [[13, "running-celery-the-background-task-worker"]], "Running the development web server": [[13, "running-the-development-web-server"]], "Running a production web server": [[13, "running-a-production-web-server"]], "Environment Variables": [[13, "environment-variables"]], "Mail Services": [[13, "mail-services"]], "AWS SES Service": [[13, "aws-ses-service"]], "SMTP service": [[13, "smtp-service"]], "local_untracked.py": [[13, "local-untracked-py"]], "Mapping": [[14, "mapping"], [14, "id1"]], "Import": [[14, "import"]], "Matching": [[14, "matching"], [15, "matching"]], "Pairing": [[14, "pairing"]], "What is it?": [[15, "what-is-it"]], "Why does it exist?": [[15, "why-does-it-exist"]], "How and when is it used?": [[15, "how-and-when-is-it-used"]], "In-Cycle Merging": [[15, "in-cycle-merging"]], "Linking (Across Cycles)": [[15, "linking-across-cycles"]], "Putting them Together, Match-Merge-Linking": [[15, "putting-them-together-match-merge-linking"]], "Note on In-Cycle Not-merged Matches": [[15, "note-on-in-cycle-not-merged-matches"]], "Match Searching in Depth": [[15, "match-searching-in-depth"]], "Version Develop": [[16, "version-develop"]], "Version 3.2.0": [[16, "version-3-2-0"]], "Version 3.1.0": [[16, "version-3-1-0"]], "Version 3.0.0": [[16, "version-3-0-0"]], "Version 3.0.0-beta.0": [[16, "version-3-0-0-beta-0"]], "Version 2.22.0": [[16, "version-2-22-0"]], "Version 2.21.0": [[16, "version-2-21-0"]], "Version 2.20.1": [[16, "version-2-20-1"]], "Version 2.20.0": [[16, "version-2-20-0"]], "Version 2.19.0": [[16, "version-2-19-0"]], "Version 2.18.1": [[16, "version-2-18-1"]], "Version 2.18.0": [[16, "version-2-18-0"]], "Version 2.17.4": [[16, "version-2-17-4"]], "Version 2.17.3": [[16, "version-2-17-3"]], "Version 2.17.2": [[16, "version-2-17-2"]], "Version 2.17.1": [[16, "version-2-17-1"]], "Version 2.17.0": [[16, "version-2-17-0"]], "Version 2.16.0": [[16, "version-2-16-0"]], "Version 2.15.2": [[16, "version-2-15-2"]], "Version 2.15.1": [[16, "version-2-15-1"]], "Version 2.15.0": [[16, "version-2-15-0"]], "Version 2.14.0": [[16, "version-2-14-0"]], "Version 2.13.0": [[16, "version-2-13-0"]], "Version 2.12.0 - 2.12.4": [[16, "version-2-12-0-2-12-4"]], "Version 2.11.0": [[16, "version-2-11-0"]], "Version 2.10.0": [[16, "version-2-10-0"]], "Version 2.7.3 to 2.9.0": [[16, "version-2-7-3-to-2-9-0"]], "Version 2.7.2": [[16, "version-2-7-2"]], "Version 2.7.1": [[16, "version-2-7-1"]], "Version 2.7.0": [[16, "version-2-7-0"]], "Version 2.6.1": [[16, "version-2-6-1"]], "Version 2.6.0": [[16, "version-2-6-0"]], "Docker-based Deployment": [[16, "docker-based-deployment"], [16, "id1"]], "Ubuntu": [[16, "ubuntu"]], "Max OSX": [[16, "max-osx"]], "Version 2.5.2": [[16, "version-2-5-2"]], "Version 2.5.1": [[16, "version-2-5-1"]], "Version 2.5.0": [[16, "version-2-5-0"]], "Development": [[16, "development"]], "Modules": [[17, "modules"]], "Configuration": [[18, "configuration"]], "Submodules": [[18, "submodules"], [19, "submodules"], [20, "submodules"], [21, "submodules"], [22, "submodules"], [23, "submodules"], [24, "submodules"], [26, "submodules"], [27, "submodules"], [28, "submodules"], [29, "submodules"], [31, "submodules"], [32, "submodules"], [33, "submodules"], [34, "submodules"], [35, "submodules"], [36, "submodules"], [37, "submodules"], [39, "submodules"], [40, "submodules"], [41, "submodules"], [42, "submodules"], [43, "submodules"], [44, "submodules"], [45, "submodules"]], "Template Context": [[18, "module-config.template_context"]], "Tests": [[18, "module-config.tests"], [20, "tests"], [24, "module-seed.landing.tests"], [41, "tests"]], "Utils": [[18, "module-config.utils"], [19, "module-seed.utils"], [22, "module-seed.data_importer.utils"], [41, "module-seed.tests.util"]], "Views": [[18, "module-config.views"], [19, "module-seed.views"], [20, "views"], [22, "views"], [24, "module-seed.landing.views"], [41, "module-seed.tests.test_views"]], "WSGI": [[18, "module-config.wsgi"]], "SEED Package": [[19, "seed-package"]], "Subpackages": [[19, "subpackages"], [24, "subpackages"], [25, "subpackages"], [30, "subpackages"], [31, "subpackages"], [38, "subpackages"], [39, "subpackages"]], "Inheritance": [[19, "inheritance"], [20, "inheritance"]], "Decorators": [[19, "module-seed.decorators"], [41, "module-seed.tests.test_decorators"]], "Factory": [[19, "factory"]], "Models": [[19, "module-seed.models"], [20, "module-seed.models.data_quality"], [22, "models"], [24, "module-seed.landing.models"], [34, "models"], [35, "models"], [41, "models"]], "Search": [[19, "module-seed.search"]], "Tasks": [[19, "module-seed.tasks"], [41, "module-seed.tests.test_tasks"]], "Token Generator": [[19, "module-seed.token_generators"]], "Module contents": [[19, "module-seed"], [21, "module-contents"], [22, "module-seed.data_importer"], [23, "module-contents"], [24, "module-seed.landing"], [25, "module-seed.landing.management"], [26, "module-seed.landing.management.commands"], [27, "module-seed.lib"], [28, "module-seed.lib.mappings"], [29, "module-seed.lib.merging"], [30, "module-seed.management"], [31, "module-contents"], [32, "module-contents"], [33, "module-contents"], [34, "module-seed.models"], [35, "module-seed.public"], [36, "module-seed.serializers"], [38, "module-seed.test_helpers"], [45, "module-seed.views"]], "Data Quality Package": [[20, "data-quality-package"]], "Data Package": [[21, "data-package"]], "BEDES": [[21, "bedes"]], "Data Importer Package": [[22, "data-importer-package"]], "Managers": [[22, "module-seed.data_importer.managers"]], "URLs": [[22, "urls"], [24, "module-seed.landing.urls"]], "Features Package": [[23, "features-package"]], "Landing Package": [[24, "landing-package"]], "Forms": [[24, "module-seed.landing.forms"]], "seed.landing.management package": [[25, "seed-landing-management-package"]], "Landing Management Package": [[26, "landing-management-package"]], "Update EULA": [[26, "update-eula"]], "Library Packages": [[27, "library-packages"]], "seed.lib.mappings package": [[28, "seed-lib-mappings-package"]], "seed.lib.mappings.mapper module": [[28, "module-seed.lib.mappings.mapper"]], "seed.lib.mappings.mapping_columns module": [[28, "module-seed.lib.mappings.mapping_columns"]], "seed.lib.mappings.mapping_data module": [[28, "seed-lib-mappings-mapping-data-module"]], "seed.lib.mappings.test_mapper module": [[28, "seed-lib-mappings-test-mapper-module"]], "seed.lib.mappings.test_mapping_columns module": [[28, "seed-lib-mappings-test-mapping-columns-module"]], "seed.lib.mappings.test_mapping_data module": [[28, "seed-lib-mappings-test-mapping-data-module"]], "seed.lib.merging package": [[29, "seed-lib-merging-package"]], "seed.lib.merging.merging module": [[29, "module-seed.lib.merging.merging"]], "Management Package": [[30, "management-package"]], "Managers Package": [[31, "managers-package"]], "JSON": [[31, "json"]], "Manager Tests Package": [[32, "manager-tests-package"]], "Test JSON Manager": [[32, "test-json-manager"]], "Mapping Package": [[33, "mapping-package"]], "seed.mappings.mapper module": [[33, "seed-mappings-mapper-module"]], "seed.mappings.seed_mappings module": [[33, "seed-mappings-seed-mappings-module"]], "AuditLog": [[34, "module-seed.models.auditlog"]], "Columns": [[34, "module-seed.models.columns"]], "Cycles": [[34, "module-seed.models.cycles"]], "Joins": [[34, "joins"]], "Generic Models": [[34, "module-seed.models.models"]], "Properties": [[34, "module-seed.models.properties"]], "TaxLots": [[34, "module-seed.models.tax_lots"]], "Public Package": [[35, "public-package"]], "Serializers Package": [[36, "serializers-package"]], "Serializers": [[36, "module-seed.serializers.celery"]], "Labels": [[36, "module-seed.serializers.labels"]], "Templatetags Package": [[37, "templatetags-package"]], "Breadcrumbs": [[37, "module-seed.templatetags.breadcrumbs"]], "Test Helpers Package": [[38, "test-helpers-package"]], "Test Helper Factor Package": [[39, "test-helper-factor-package"]], "Helpers": [[39, "module-seed.test_helpers.factory.helpers"]], "Test Helper Factory Lib Package": [[40, "test-helper-factory-lib-package"]], "Chomsky": [[40, "chomsky"]], "Tests Package": [[41, "tests-package"]], "Admin Views": [[41, "module-seed.tests.test_admin_views"]], "Exporters": [[41, "exporters"]], "Tests (Functional) Package": [[42, "tests-functional-package"]], "Base": [[42, "base"]], "Page": [[42, "page"]], "Pages": [[42, "pages"]], "URLs Package": [[43, "urls-package"]], "Accounts": [[43, "accounts"], [45, "accounts"]], "APIs": [[43, "apis"], [44, "module-seed.utils.api"], [45, "apis"]], "Main": [[43, "main"], [45, "main"]], "Utilities Package": [[44, "utilities-package"]], "Buildings": [[44, "module-seed.utils.buildings"]], "Organizations": [[44, "module-seed.utils.organizations"]], "Time": [[44, "module-seed.utils.time"]], "Views Package": [[45, "views-package"]], "Meters": [[45, "meters"]], "Upgrade a SEED database from Postgres 12 to Postgres 16": [[46, "upgrade-a-seed-database-from-postgres-12-to-postgres-16"]], "Assumptions": [[46, "assumptions"]], "Installation using Docker": [[47, "installation-using-docker"]], "Docker Native (Ubuntu)": [[47, "docker-native-ubuntu"]], "Docker Native (Windows/OSX)": [[47, "docker-native-windows-osx"]], "Building and Running Containers for Non-Development": [[47, "building-and-running-containers-for-non-development"]], "Using Docker for Development": [[47, "using-docker-for-development"]], "Build": [[47, "build"]], "Running the Server": [[47, "running-the-server"]], "Running Tests": [[47, "running-tests"]], "Debugging": [[47, "debugging"]], "Installation on OSX": [[48, "installation-on-osx"]], "Quick Installation Instructions": [[48, "quick-installation-instructions"]], "PostgreSQL 11.1": [[48, "postgresql-11-1"]], "PostGIS 2.5": [[48, "postgis-2-5"]], "TimescaleDB 1.5.0": [[48, "timescaledb-1-5-0"]], "Python Packages": [[48, "python-packages"]], "NodeJS/npm": [[48, "nodejs-npm"]], "Configure Django and Databases": [[48, "configure-django-and-databases"]], "MapQuest API Key": [[48, "mapquest-api-key"]], "Run Django Migrations": [[48, "run-django-migrations"]], "Django Admin User": [[48, "django-admin-user"]], "Install Redis": [[48, "install-redis"]], "Install JavaScript Dependencies": [[48, "install-javascript-dependencies"]], "Start the Server": [[48, "start-the-server"]], "Login": [[48, "login"]], "Translating SEED": [[49, "translating-seed"]], "General philosophies / style": [[49, "general-philosophies-style"]], "Don\u2019t go crazy with indirection and interpolation": [[49, "don-t-go-crazy-with-indirection-and-interpolation"]]}, "indexentries": {"config.template_context": [[18, "module-config.template_context"]], "config.tests": [[18, "module-config.tests"]], "config.utils": [[18, "module-config.utils"]], "config.views": [[18, "module-config.views"]], "config.wsgi": [[18, "module-config.wsgi"]], "de_camel_case() (in module config.utils)": [[18, "config.utils.de_camel_case"]], "module": [[18, "module-config.template_context"], [18, "module-config.tests"], [18, "module-config.utils"], [18, "module-config.views"], [18, "module-config.wsgi"], [19, "module-seed"], [19, "module-seed.decorators"], [19, "module-seed.models"], [19, "module-seed.search"], [19, "module-seed.tasks"], [19, "module-seed.token_generators"], [19, "module-seed.utils"], [19, "module-seed.views"], [20, "module-seed.models.data_quality"], [22, "module-seed.data_importer"], [22, "module-seed.data_importer.managers"], [22, "module-seed.data_importer.utils"], [24, "module-seed.landing"], [24, "module-seed.landing.forms"], [24, "module-seed.landing.models"], [24, "module-seed.landing.tests"], [24, "module-seed.landing.urls"], [24, "module-seed.landing.views"], [25, "module-seed.landing.management"], [26, "module-seed.landing.management.commands"], [27, "module-seed.lib"], [27, "module-seed.lib.mappings"], [27, "module-seed.lib.merging"], [28, "module-seed.lib.mappings"], [28, "module-seed.lib.mappings.mapper"], [28, "module-seed.lib.mappings.mapping_columns"], [29, "module-seed.lib.merging"], [29, "module-seed.lib.merging.merging"], [30, "module-seed.management"], [34, "module-seed.models"], [34, "module-seed.models.auditlog"], [34, "module-seed.models.columns"], [34, "module-seed.models.cycles"], [34, "module-seed.models.models"], [34, "module-seed.models.properties"], [34, "module-seed.models.tax_lots"], [35, "module-seed.public"], [36, "module-seed.serializers"], [36, "module-seed.serializers.celery"], [36, "module-seed.serializers.labels"], [37, "module-seed.templatetags.breadcrumbs"], [38, "module-seed.test_helpers"], [39, "module-seed.test_helpers.factory.helpers"], [41, "module-seed.tests.test_admin_views"], [41, "module-seed.tests.test_decorators"], [41, "module-seed.tests.test_tasks"], [41, "module-seed.tests.test_views"], [41, "module-seed.tests.util"], [44, "module-seed.utils.api"], [44, "module-seed.utils.buildings"], [44, "module-seed.utils.organizations"], [44, "module-seed.utils.time"], [45, "module-seed.views"]], "robots_txt() (in module config.views)": [[18, "config.views.robots_txt"]], "sentry_js() (in module config.template_context)": [[18, "config.template_context.sentry_js"]], "session_key() (in module config.template_context)": [[18, "config.template_context.session_key"]], "drfendpointmixin (in module seed.decorators)": [[19, "seed.decorators.DRFEndpointMixin"]], "signuptokengenerator (class in seed.token_generators)": [[19, "seed.token_generators.SignupTokenGenerator"]], "ajax_request() (in module seed.decorators)": [[19, "seed.decorators.ajax_request"]], "ajax_request_class() (in module seed.decorators)": [[19, "seed.decorators.ajax_request_class"]], "build_shared_buildings_orgs() (in module seed.search)": [[19, "seed.search.build_shared_buildings_orgs"]], "check_token() (seed.token_generators.signuptokengenerator method)": [[19, "seed.token_generators.SignupTokenGenerator.check_token"]], "create_inventory_queryset() (in module seed.search)": [[19, "seed.search.create_inventory_queryset"]], "decorator_to_mixin() (in module seed.decorators)": [[19, "seed.decorators.decorator_to_mixin"]], "delete_organization() (in module seed.tasks)": [[19, "seed.tasks.delete_organization"]], "get_inventory_fieldnames() (in module seed.search)": [[19, "seed.search.get_inventory_fieldnames"]], "get_orgs_w_public_fields() (in module seed.search)": [[19, "seed.search.get_orgs_w_public_fields"]], "get_prog_key() (in module seed.decorators)": [[19, "seed.decorators.get_prog_key"]], "inventory_search_filter_sort() (in module seed.search)": [[19, "seed.search.inventory_search_filter_sort"]], "invite_new_user_to_seed() (in module seed.tasks)": [[19, "seed.tasks.invite_new_user_to_seed"]], "lock_and_track() (in module seed.decorators)": [[19, "seed.decorators.lock_and_track"]], "make_token() (seed.token_generators.signuptokengenerator method)": [[19, "seed.token_generators.SignupTokenGenerator.make_token"]], "parse_body() (in module seed.search)": [[19, "seed.search.parse_body"]], "process_search_params() (in module seed.search)": [[19, "seed.search.process_search_params"]], "require_organization_id() (in module seed.decorators)": [[19, "seed.decorators.require_organization_id"]], "require_organization_id_class() (in module seed.decorators)": [[19, "seed.decorators.require_organization_id_class"]], "require_organization_membership() (in module seed.decorators)": [[19, "seed.decorators.require_organization_membership"]], "search_inventory() (in module seed.search)": [[19, "seed.search.search_inventory"]], "search_properties() (in module seed.search)": [[19, "seed.search.search_properties"]], "search_taxlots() (in module seed.search)": [[19, "seed.search.search_taxlots"]], "seed": [[19, "module-seed"]], "seed.decorators": [[19, "module-seed.decorators"]], "seed.models": [[19, "module-seed.models"], [34, "module-seed.models"]], "seed.search": [[19, "module-seed.search"]], "seed.tasks": [[19, "module-seed.tasks"]], "seed.token_generators": [[19, "module-seed.token_generators"]], "seed.utils": [[19, "module-seed.utils"]], "seed.views": [[19, "module-seed.views"], [45, "module-seed.views"]], "send_salesforce_error_log() (in module seed.tasks)": [[19, "seed.tasks.send_salesforce_error_log"]], "comparisonerror": [[20, "seed.models.data_quality.ComparisonError"]], "data_types (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.DATA_TYPES"]], "default_rules (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.DEFAULT_RULES"]], "dataqualitycheck (class in seed.models.data_quality)": [[20, "seed.models.data_quality.DataQualityCheck"]], "dataqualitycheck.doesnotexist": [[20, "seed.models.data_quality.DataQualityCheck.DoesNotExist"]], "dataqualitycheck.multipleobjectsreturned": [[20, "seed.models.data_quality.DataQualityCheck.MultipleObjectsReturned"]], "dataqualitytypecasterror": [[20, "seed.models.data_quality.DataQualityTypeCastError"]], "required_fields (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.REQUIRED_FIELDS"]], "rule_exclude (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_EXCLUDE"]], "rule_include (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_INCLUDE"]], "rule_not_null (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_NOT_NULL"]], "rule_range (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_RANGE"]], "rule_required (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_REQUIRED"]], "rule_type (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_TYPE"], [20, "seed.models.data_quality.Rule.rule_type"]], "rule_type_custom (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_TYPE_CUSTOM"]], "rule_type_default (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.RULE_TYPE_DEFAULT"]], "rule (class in seed.models.data_quality)": [[20, "seed.models.data_quality.Rule"]], "rule.doesnotexist": [[20, "seed.models.data_quality.Rule.DoesNotExist"]], "rule.multipleobjectsreturned": [[20, "seed.models.data_quality.Rule.MultipleObjectsReturned"]], "severity (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY"], [20, "seed.models.data_quality.Rule.severity"]], "severity_error (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY_ERROR"]], "severity_valid (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY_VALID"]], "severity_warning (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.SEVERITY_WARNING"]], "type_area (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_AREA"]], "type_date (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_DATE"]], "type_eui (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_EUI"]], "type_number (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_NUMBER"]], "type_string (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_STRING"]], "type_year (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.TYPE_YEAR"]], "unitmismatcherror": [[20, "seed.models.data_quality.UnitMismatchError"]], "add_goal_rule_labels() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_goal_rule_labels"]], "add_invalid_geometry_entry_provided() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_invalid_geometry_entry_provided"]], "add_result_comparison_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_comparison_error"]], "add_result_dimension_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_dimension_error"]], "add_result_is_null() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_is_null"]], "add_result_max_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_max_error"]], "add_result_min_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_min_error"]], "add_result_missing_and_none() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_missing_and_none"]], "add_result_missing_req() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_missing_req"]], "add_result_range_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_range_error"]], "add_result_string_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_string_error"]], "add_result_type_error() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_result_type_error"]], "add_rule() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_rule"]], "add_rule_if_new() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.add_rule_if_new"]], "cache_key() (seed.models.data_quality.dataqualitycheck static method)": [[20, "seed.models.data_quality.DataQualityCheck.cache_key"]], "check_data() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.check_data"]], "check_data_cross_cycle() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.check_data_cross_cycle"]], "condition (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.condition"]], "cross_cycle (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.cross_cycle"]], "data_quality_check (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.data_quality_check"]], "data_quality_check_id (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.data_quality_check_id"]], "data_type (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.data_type"]], "description (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.description"]], "enabled (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.enabled"]], "field (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.field"]], "for_derived_column (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.for_derived_column"]], "format_pint_violation() (in module seed.models.data_quality)": [[20, "seed.models.data_quality.format_pint_violation"]], "format_strings() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.format_strings"]], "get_data_type_display() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.get_data_type_display"]], "get_fieldnames() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.get_fieldnames"]], "get_rule_type_display() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.get_rule_type_display"]], "get_severity_display() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.get_severity_display"]], "get_value() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.get_value"]], "id (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.id"]], "id (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.id"]], "init_result() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.init_result"]], "initialize_cache() (seed.models.data_quality.dataqualitycheck static method)": [[20, "seed.models.data_quality.DataQualityCheck.initialize_cache"]], "initialize_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.initialize_rules"]], "max (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.max"]], "maximum_valid() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.maximum_valid"]], "min (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.min"]], "minimum_valid() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.minimum_valid"]], "name (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.name"]], "name (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.name"]], "not_null (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.not_null"]], "objects (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.objects"]], "objects (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.objects"]], "organization (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.organization"]], "organization_id (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.organization_id"]], "prune_results() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.prune_results"]], "remove_all_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.remove_all_rules"]], "remove_status_label() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.remove_status_label"]], "required (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.required"]], "reset_all_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.reset_all_rules"]], "reset_default_rules() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.reset_default_rules"]], "reset_results() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.reset_results"]], "retrieve() (seed.models.data_quality.dataqualitycheck class method)": [[20, "seed.models.data_quality.DataQualityCheck.retrieve"]], "retrieve_result_by_address() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.retrieve_result_by_address"]], "retrieve_result_by_tax_lot_id() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.retrieve_result_by_tax_lot_id"]], "rules (seed.models.data_quality.dataqualitycheck attribute)": [[20, "seed.models.data_quality.DataQualityCheck.rules"]], "save_to_cache() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.save_to_cache"]], "seed.models.data_quality": [[20, "module-seed.models.data_quality"]], "status_label (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.status_label"]], "status_label_id (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.status_label_id"]], "str_to_data_type() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.str_to_data_type"]], "table_name (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.table_name"]], "text_match (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.text_match"]], "units (seed.models.data_quality.rule attribute)": [[20, "seed.models.data_quality.Rule.units"]], "update_status_label() (seed.models.data_quality.dataqualitycheck method)": [[20, "seed.models.data_quality.DataQualityCheck.update_status_label"]], "valid_text() (seed.models.data_quality.rule method)": [[20, "seed.models.data_quality.Rule.valid_text"]], "notdeletedmanager (class in seed.data_importer.managers)": [[22, "seed.data_importer.managers.NotDeletedManager"]], "get_all() (seed.data_importer.managers.notdeletedmanager method)": [[22, "seed.data_importer.managers.NotDeletedManager.get_all"]], "get_queryset() (seed.data_importer.managers.notdeletedmanager method)": [[22, "seed.data_importer.managers.NotDeletedManager.get_queryset"]], "kbtu_thermal_conversion_factors() (in module seed.data_importer.utils)": [[22, "seed.data_importer.utils.kbtu_thermal_conversion_factors"]], "kgal_water_conversion_factors() (in module seed.data_importer.utils)": [[22, "seed.data_importer.utils.kgal_water_conversion_factors"]], "seed.data_importer": [[22, "module-seed.data_importer"]], "seed.data_importer.managers": [[22, "module-seed.data_importer.managers"]], "seed.data_importer.utils": [[22, "module-seed.data_importer.utils"]], "usage_point_id() (in module seed.data_importer.utils)": [[22, "seed.data_importer.utils.usage_point_id"]], "use_for_related_fields (seed.data_importer.managers.notdeletedmanager attribute)": [[22, "seed.data_importer.managers.NotDeletedManager.use_for_related_fields"]], "customcreateuserform (class in seed.landing.forms)": [[24, "seed.landing.forms.CustomCreateUserForm"]], "customcreateuserform.meta (class in seed.landing.forms)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta"]], "customloginview (class in seed.landing.views)": [[24, "seed.landing.views.CustomLoginView"]], "loginform (class in seed.landing.forms)": [[24, "seed.landing.forms.LoginForm"]], "required_fields (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.REQUIRED_FIELDS"]], "seeduser (class in seed.landing.models)": [[24, "seed.landing.models.SEEDUser"]], "seeduser.doesnotexist": [[24, "seed.landing.models.SEEDUser.DoesNotExist"]], "seeduser.multipleobjectsreturned": [[24, "seed.landing.models.SEEDUser.MultipleObjectsReturned"]], "username_field (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.USERNAME_FIELD"]], "userlogintest (class in seed.landing.tests)": [[24, "seed.landing.tests.UserLoginTest"]], "account_activation_sent() (in module seed.landing.views)": [[24, "seed.landing.views.account_activation_sent"]], "activate() (in module seed.landing.views)": [[24, "seed.landing.views.activate"]], "analysis_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.analysis_set"]], "api_key (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.api_key"]], "base_fields (seed.landing.forms.customcreateuserform attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.base_fields"]], "base_fields (seed.landing.forms.loginform attribute)": [[24, "seed.landing.forms.LoginForm.base_fields"]], "columnmapping_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.columnmapping_set"]], "create_account() (in module seed.landing.views)": [[24, "seed.landing.views.create_account"]], "cycle_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.cycle_set"]], "date_joined (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.date_joined"]], "deactivate_user() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.deactivate_user"]], "declared_fields (seed.landing.forms.customcreateuserform attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.declared_fields"]], "declared_fields (seed.landing.forms.loginform attribute)": [[24, "seed.landing.forms.LoginForm.declared_fields"]], "default_building_detail_custom_columns (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_building_detail_custom_columns"]], "default_custom_columns (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_custom_columns"]], "default_organization (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_organization"]], "default_organization_id (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.default_organization_id"]], "dispatch() (seed.landing.views.customloginview method)": [[24, "seed.landing.views.CustomLoginView.dispatch"]], "email (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.email"]], "email_user() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.email_user"]], "emaildevice_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.emaildevice_set"]], "fields (seed.landing.forms.customcreateuserform.meta attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta.fields"]], "first_name (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.first_name"]], "generate_key() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.generate_key"]], "get() (seed.landing.views.customloginview method)": [[24, "seed.landing.views.CustomLoginView.get"]], "get_absolute_url() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_absolute_url"]], "get_full_name() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_full_name"]], "get_next_by_date_joined() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_next_by_date_joined"]], "get_previous_by_date_joined() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_previous_by_date_joined"]], "get_short_name() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.get_short_name"]], "greenassessmentpropertyauditlog_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.greenassessmentpropertyauditlog_set"]], "groups (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.groups"]], "handle_2fa_prompt() (seed.landing.views.customloginview method)": [[24, "seed.landing.views.CustomLoginView.handle_2fa_prompt"]], "handle_auth() (seed.landing.views.customloginview method)": [[24, "seed.landing.views.CustomLoginView.handle_auth"]], "handle_token() (seed.landing.views.customloginview method)": [[24, "seed.landing.views.CustomLoginView.handle_token"]], "id (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.id"]], "importrecord_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.importrecord_set"]], "is_staff (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.is_staff"]], "landing_page() (in module seed.landing.views)": [[24, "seed.landing.views.landing_page"]], "last_name (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.last_name"]], "logentry_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.logentry_set"]], "media (seed.landing.forms.customcreateuserform property)": [[24, "seed.landing.forms.CustomCreateUserForm.media"]], "media (seed.landing.forms.loginform property)": [[24, "seed.landing.forms.LoginForm.media"]], "model (seed.landing.forms.customcreateuserform.meta attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta.model"]], "modified_import_records (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.modified_import_records"]], "notes (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.notes"]], "objects (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.objects"]], "organizationuser_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.organizationuser_set"]], "orgs (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.orgs"]], "password_reset() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset"]], "password_reset_complete() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset_complete"]], "password_reset_confirm() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset_confirm"]], "password_reset_done() (in module seed.landing.views)": [[24, "seed.landing.views.password_reset_done"]], "password_set() (in module seed.landing.views)": [[24, "seed.landing.views.password_set"]], "phonedevice_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.phonedevice_set"]], "post() (seed.landing.views.customloginview method)": [[24, "seed.landing.views.CustomLoginView.post"]], "postofficeemail_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.postofficeemail_set"]], "postofficeemailtemplate_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.postofficeemailtemplate_set"]], "process_header_request() (seed.landing.models.seeduser class method)": [[24, "seed.landing.models.SEEDUser.process_header_request"]], "prompt_2fa (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.prompt_2fa"]], "save() (seed.landing.models.seeduser method)": [[24, "seed.landing.models.SEEDUser.save"]], "seed.landing": [[24, "module-seed.landing"]], "seed.landing.forms": [[24, "module-seed.landing.forms"]], "seed.landing.models": [[24, "module-seed.landing.models"]], "seed.landing.tests": [[24, "module-seed.landing.tests"]], "seed.landing.urls": [[24, "module-seed.landing.urls"]], "seed.landing.views": [[24, "module-seed.landing.views"]], "setup() (seed.landing.tests.userlogintest method)": [[24, "seed.landing.tests.UserLoginTest.setUp"]], "show_shared_buildings (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.show_shared_buildings"]], "signup() (in module seed.landing.views)": [[24, "seed.landing.views.signup"]], "staticdevice_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.staticdevice_set"]], "test_simple_login() (seed.landing.tests.userlogintest method)": [[24, "seed.landing.tests.UserLoginTest.test_simple_login"]], "totpdevice_set (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.totpdevice_set"]], "user_permissions (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.user_permissions"]], "username (seed.landing.models.seeduser attribute)": [[24, "seed.landing.models.SEEDUser.username"]], "widgets (seed.landing.forms.customcreateuserform.meta attribute)": [[24, "seed.landing.forms.CustomCreateUserForm.Meta.widgets"]], "seed.landing.management": [[25, "module-seed.landing.management"]], "seed.landing.management.commands": [[26, "module-seed.landing.management.commands"]], "seed.lib": [[27, "module-seed.lib"]], "seed.lib.mappings": [[27, "module-seed.lib.mappings"], [28, "module-seed.lib.mappings"]], "seed.lib.merging": [[27, "module-seed.lib.merging"], [29, "module-seed.lib.merging"]], "mappingcolumns (class in seed.lib.mappings.mapping_columns)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns"]], "add_mappings() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.add_mappings"]], "apply_threshold() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.apply_threshold"]], "create_column_regexes() (in module seed.lib.mappings.mapper)": [[28, "seed.lib.mappings.mapper.create_column_regexes"]], "duplicates (seed.lib.mappings.mapping_columns.mappingcolumns property)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.duplicates"]], "final_mappings (seed.lib.mappings.mapping_columns.mappingcolumns property)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.final_mappings"]], "first_suggested_mapping() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.first_suggested_mapping"]], "get_pm_mapping() (in module seed.lib.mappings.mapper)": [[28, "seed.lib.mappings.mapper.get_pm_mapping"]], "resolve_duplicate() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.resolve_duplicate"]], "seed.lib.mappings.mapper": [[28, "module-seed.lib.mappings.mapper"]], "seed.lib.mappings.mapping_columns": [[28, "module-seed.lib.mappings.mapping_columns"]], "set_initial_mapping_cmp() (seed.lib.mappings.mapping_columns.mappingcolumns method)": [[28, "seed.lib.mappings.mapping_columns.MappingColumns.set_initial_mapping_cmp"]], "sort_duplicates() (in module seed.lib.mappings.mapping_columns)": [[28, "seed.lib.mappings.mapping_columns.sort_duplicates"]], "get_attrs_with_mapping() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_attrs_with_mapping"]], "get_propertystate_attrs() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_propertystate_attrs"]], "get_state_attrs() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_state_attrs"]], "get_state_to_state_tuple() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_state_to_state_tuple"]], "get_taxlotstate_attrs() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.get_taxlotstate_attrs"]], "merge_state() (in module seed.lib.merging.merging)": [[29, "seed.lib.merging.merging.merge_state"]], "seed.lib.merging.merging": [[29, "module-seed.lib.merging.merging"]], "seed.management": [[30, "module-seed.management"]], "blue_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.BLUE_CHOICE"]], "color_choices (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.COLOR_CHOICES"]], "column_exclude_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_EXCLUDE_FIELDS"]], "column_merge_favor_existing (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_MERGE_FAVOR_EXISTING"]], "column_merge_favor_new (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_MERGE_FAVOR_NEW"]], "column_merge_protection (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.COLUMN_MERGE_PROTECTION"]], "column (class in seed.models.columns)": [[34, "seed.models.columns.Column"]], "column.doesnotexist": [[34, "seed.models.columns.Column.DoesNotExist"]], "column.multipleobjectsreturned": [[34, "seed.models.columns.Column.MultipleObjectsReturned"]], "columncasterror": [[34, "seed.models.columns.ColumnCastError"]], "cycle (class in seed.models.cycles)": [[34, "seed.models.cycles.Cycle"]], "cycle.doesnotexist": [[34, "seed.models.cycles.Cycle.DoesNotExist"]], "cycle.multipleobjectsreturned": [[34, "seed.models.cycles.Cycle.MultipleObjectsReturned"]], "database_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.DATABASE_COLUMNS"]], "data_type_parsers (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.DATA_TYPE_PARSERS"]], "date (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.DATE"]], "datetime (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.DATETIME"]], "db_types (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.DB_TYPES"]], "decimal (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.DECIMAL"]], "default_labels (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.DEFAULT_LABELS"]], "excluded_column_return_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_COLUMN_RETURN_FIELDS"]], "excluded_mapping_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_MAPPING_FIELDS"]], "excluded_rename_from_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_RENAME_FROM_FIELDS"]], "excluded_rename_to_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.EXCLUDED_RENAME_TO_FIELDS"]], "float (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.FLOAT"]], "gray_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.GRAY_CHOICE"]], "green_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.GREEN_CHOICE"]], "integer (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.INTEGER"]], "internal_type_to_data_type (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.INTERNAL_TYPE_TO_DATA_TYPE"]], "light_blue_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.LIGHT_BLUE_CHOICE"]], "orange_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.ORANGE_CHOICE"]], "pinned_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.PINNED_COLUMNS"]], "property (class in seed.models.properties)": [[34, "seed.models.properties.Property"]], "property.doesnotexist": [[34, "seed.models.properties.Property.DoesNotExist"]], "property.multipleobjectsreturned": [[34, "seed.models.properties.Property.MultipleObjectsReturned"]], "propertyauditlog (class in seed.models.properties)": [[34, "seed.models.properties.PropertyAuditLog"]], "propertyauditlog.doesnotexist": [[34, "seed.models.properties.PropertyAuditLog.DoesNotExist"]], "propertyauditlog.multipleobjectsreturned": [[34, "seed.models.properties.PropertyAuditLog.MultipleObjectsReturned"]], "propertystate (class in seed.models.properties)": [[34, "seed.models.properties.PropertyState"]], "propertystate.doesnotexist": [[34, "seed.models.properties.PropertyState.DoesNotExist"]], "propertystate.multipleobjectsreturned": [[34, "seed.models.properties.PropertyState.MultipleObjectsReturned"]], "propertyview (class in seed.models.properties)": [[34, "seed.models.properties.PropertyView"]], "propertyview.doesnotexist": [[34, "seed.models.properties.PropertyView.DoesNotExist"]], "propertyview.multipleobjectsreturned": [[34, "seed.models.properties.PropertyView.MultipleObjectsReturned"]], "propertyviewlabel (class in seed.models.properties)": [[34, "seed.models.properties.PropertyViewLabel"]], "propertyviewlabel.doesnotexist": [[34, "seed.models.properties.PropertyViewLabel.DoesNotExist"]], "propertyviewlabel.multipleobjectsreturned": [[34, "seed.models.properties.PropertyViewLabel.MultipleObjectsReturned"]], "quantity_unit_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.QUANTITY_UNIT_COLUMNS"]], "red_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.RED_CHOICE"]], "shared_field_types (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.SHARED_FIELD_TYPES"]], "shared_none (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.SHARED_NONE"]], "shared_public (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.SHARED_PUBLIC"]], "string (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.STRING"]], "statuslabel (class in seed.models.models)": [[34, "seed.models.models.StatusLabel"]], "statuslabel.doesnotexist": [[34, "seed.models.models.StatusLabel.DoesNotExist"]], "statuslabel.multipleobjectsreturned": [[34, "seed.models.models.StatusLabel.MultipleObjectsReturned"]], "taxlot (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLot"]], "taxlot.doesnotexist": [[34, "seed.models.tax_lots.TaxLot.DoesNotExist"]], "taxlot.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLot.MultipleObjectsReturned"]], "taxlotauditlog (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLotAuditLog"]], "taxlotauditlog.doesnotexist": [[34, "seed.models.tax_lots.TaxLotAuditLog.DoesNotExist"]], "taxlotauditlog.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLotAuditLog.MultipleObjectsReturned"]], "taxlotstate (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLotState"]], "taxlotstate.doesnotexist": [[34, "seed.models.tax_lots.TaxLotState.DoesNotExist"]], "taxlotstate.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLotState.MultipleObjectsReturned"]], "taxlotview (class in seed.models.tax_lots)": [[34, "seed.models.tax_lots.TaxLotView"]], "taxlotview.doesnotexist": [[34, "seed.models.tax_lots.TaxLotView.DoesNotExist"]], "taxlotview.multipleobjectsreturned": [[34, "seed.models.tax_lots.TaxLotView.MultipleObjectsReturned"]], "unit_types (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.UNIT_TYPES"]], "unmappable_property_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.UNMAPPABLE_PROPERTY_FIELDS"]], "unmappable_taxlot_fields (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.UNMAPPABLE_TAXLOT_FIELDS"]], "unit (class in seed.models.models)": [[34, "seed.models.models.Unit"]], "unit.doesnotexist": [[34, "seed.models.models.Unit.DoesNotExist"]], "unit.multipleobjectsreturned": [[34, "seed.models.models.Unit.MultipleObjectsReturned"]], "white_choice (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.WHITE_CHOICE"]], "access_level_instance (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.access_level_instance"]], "access_level_instance (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.access_level_instance"]], "access_level_instance_id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.access_level_instance_id"]], "access_level_instance_id (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.access_level_instance_id"]], "account_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.account_name_column"]], "actual_emission_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.actual_emission_column"]], "actual_energy_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.actual_energy_column"]], "address_line_1 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.address_line_1"]], "address_line_1 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.address_line_1"]], "address_line_2 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.address_line_2"]], "address_line_2 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.address_line_2"]], "analysispropertyview (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.analysispropertyview"]], "analysispropertyview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.analysispropertyview_set"]], "analysispropertyview_set (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.analysispropertyview_set"]], "and_filter_groups (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.and_filter_groups"]], "audit_template_building_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.audit_template_building_id"]], "benchmark_id_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.benchmark_id_column"]], "block_number (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.block_number"]], "bounding_box (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.bounding_box"]], "bounding_box (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.bounding_box"]], "building_certification (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.building_certification"]], "building_count (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.building_count"]], "building_files (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.building_files"]], "cast() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.cast"]], "cast_column_value() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.cast_column_value"]], "centroid (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.centroid"]], "centroid (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.centroid"]], "city (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.city"]], "city (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.city"]], "clean() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.clean"]], "clean() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.clean"]], "color (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.color"]], "column_description (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.column_description"]], "column_list_profiles (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.column_list_profiles"]], "column_name (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.column_name"]], "column_set (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.column_set"]], "columnlistprofilecolumn_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.columnlistprofilecolumn_set"]], "compliance_label (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.compliance_label"]], "comstock_mapping (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.comstock_mapping"]], "conditioned_floor_area (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.conditioned_floor_area"]], "conditioned_floor_area_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.conditioned_floor_area_orig"]], "contact_email_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.contact_email_column"]], "contact_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.contact_name_column"]], "coparent() (seed.models.properties.propertystate class method)": [[34, "seed.models.properties.PropertyState.coparent"]], "coparent() (seed.models.tax_lots.taxlotstate class method)": [[34, "seed.models.tax_lots.TaxLotState.coparent"]], "copy_meters() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.copy_meters"]], "create_mappings() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.create_mappings"]], "create_mappings_from_file() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.create_mappings_from_file"]], "created (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.created"]], "created (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.created"]], "created (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.created"]], "created (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.created"]], "created (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.created"]], "created (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.created"]], "created (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.created"]], "created (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.created"]], "custom_id_1 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.custom_id_1"]], "custom_id_1 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.custom_id_1"]], "cycle (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.cycle"]], "cycle (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.cycle"]], "cycle_id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.cycle_id"]], "cycle_id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.cycle_id"]], "cycles (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.cycles"]], "data_admin_account_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_admin_account_name_column"]], "data_admin_email_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_admin_email_column"]], "data_admin_name_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_admin_name_column"]], "data_loggers (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.data_loggers"]], "data_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.data_state"]], "data_state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.data_state"]], "data_type (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.data_type"]], "dataview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.dataview_set"]], "dataviewparameter_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.dataviewparameter_set"]], "delete_all() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.delete_all"]], "derived_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derived_column"]], "derived_column_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derived_column_id"]], "derived_data (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.derived_data"]], "derived_data (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.derived_data"]], "derivedcolumn_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derivedcolumn_set"]], "derivedcolumnparameter_set (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.derivedcolumnparameter_set"]], "description (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.description"]], "description (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.description"]], "display_name (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.display_name"]], "district (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.district"]], "egrid_subregion_code (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.egrid_subregion_code"]], "elements (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.elements"]], "end (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.end"]], "energy_alerts (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.energy_alerts"]], "energy_score (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.energy_score"]], "event_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.event_set"]], "events (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.events"]], "exclude_filter_groups (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.exclude_filter_groups"]], "extra_data (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.extra_data"]], "extra_data (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.extra_data"]], "gapauditlog_view (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.gapauditlog_view"]], "generation_date (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.generation_date"]], "geocoding_confidence (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.geocoding_confidence"]], "geocoding_confidence (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.geocoding_confidence"]], "geocoding_order (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.geocoding_order"]], "get_color_display() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_color_display"]], "get_data_state_display() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_data_state_display"]], "get_data_state_display() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_data_state_display"]], "get_merge_protection_display() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_merge_protection_display"]], "get_merge_state_display() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_merge_state_display"]], "get_merge_state_display() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_merge_state_display"]], "get_next_by_created() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_next_by_created"]], "get_next_by_created() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_next_by_created"]], "get_next_by_created() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_next_by_created"]], "get_next_by_created() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_next_by_created"]], "get_next_by_created() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_next_by_created"]], "get_next_by_created() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_next_by_created"]], "get_next_by_created() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_next_by_created"]], "get_next_by_end() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_next_by_end"]], "get_next_by_modified() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_next_by_modified"]], "get_next_by_modified() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_next_by_modified"]], "get_next_by_start() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_next_by_start"]], "get_next_by_updated() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_next_by_updated"]], "get_next_by_updated() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_next_by_updated"]], "get_next_by_updated() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_next_by_updated"]], "get_next_by_updated() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_next_by_updated"]], "get_or_create_default() (seed.models.cycles.cycle class method)": [[34, "seed.models.cycles.Cycle.get_or_create_default"]], "get_previous_by_created() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_previous_by_created"]], "get_previous_by_created() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_previous_by_created"]], "get_previous_by_created() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_previous_by_created"]], "get_previous_by_created() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_previous_by_created"]], "get_previous_by_created() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_previous_by_created"]], "get_previous_by_created() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_previous_by_created"]], "get_previous_by_created() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_previous_by_created"]], "get_previous_by_end() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_previous_by_end"]], "get_previous_by_modified() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_previous_by_modified"]], "get_previous_by_modified() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.get_previous_by_modified"]], "get_previous_by_start() (seed.models.cycles.cycle method)": [[34, "seed.models.cycles.Cycle.get_previous_by_start"]], "get_previous_by_updated() (seed.models.properties.property method)": [[34, "seed.models.properties.Property.get_previous_by_updated"]], "get_previous_by_updated() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_previous_by_updated"]], "get_previous_by_updated() (seed.models.tax_lots.taxlot method)": [[34, "seed.models.tax_lots.TaxLot.get_previous_by_updated"]], "get_previous_by_updated() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.get_previous_by_updated"]], "get_record_type_display() (seed.models.properties.propertyauditlog method)": [[34, "seed.models.properties.PropertyAuditLog.get_record_type_display"]], "get_record_type_display() (seed.models.tax_lots.taxlotauditlog method)": [[34, "seed.models.tax_lots.TaxLotAuditLog.get_record_type_display"]], "get_shared_field_type_display() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.get_shared_field_type_display"]], "get_source_type_display() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.get_source_type_display"]], "get_unit_type_display() (seed.models.models.unit method)": [[34, "seed.models.models.Unit.get_unit_type_display"]], "goal (seed.models.properties.propertyviewlabel attribute)": [[34, "seed.models.properties.PropertyViewLabel.goal"]], "goal_area_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.goal_area_columns"]], "goal_baseline_cycles (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.goal_baseline_cycles"]], "goal_current_cycles (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.goal_current_cycles"]], "goal_eui_column1s (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.goal_eui_column1s"]], "goal_eui_column2s (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.goal_eui_column2s"]], "goal_eui_column3s (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.goal_eui_column3s"]], "goal_id (seed.models.properties.propertyviewlabel attribute)": [[34, "seed.models.properties.PropertyViewLabel.goal_id"]], "goalnote_set (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.goalnote_set"]], "greenassessmentproperty_set (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.greenassessmentproperty_set"]], "gross_floor_area (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.gross_floor_area"]], "gross_floor_area_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.gross_floor_area_orig"]], "hash_object (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.hash_object"]], "hash_object (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.hash_object"]], "historical_note (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.historical_note"]], "history() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.history"]], "history() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.history"]], "home_energy_score_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.home_energy_score_id"]], "id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.id"]], "id (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.id"]], "id (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.id"]], "id (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.id"]], "id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.id"]], "id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.id"]], "id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.id"]], "id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.id"]], "id (seed.models.properties.propertyviewlabel attribute)": [[34, "seed.models.properties.PropertyViewLabel.id"]], "id (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.id"]], "id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.id"]], "id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.id"]], "id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.id"]], "import_file (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.import_file"]], "import_file (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.import_file"]], "import_file (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.import_file"]], "import_file_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.import_file_id"]], "import_file_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.import_file_id"]], "import_file_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.import_file_id"]], "import_filename (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.import_filename"]], "import_filename (seed.models.properties.propertyview property)": [[34, "seed.models.properties.PropertyView.import_filename"]], "import_filename (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.import_filename"]], "import_filename (seed.models.tax_lots.taxlotview property)": [[34, "seed.models.tax_lots.TaxLotView.import_filename"]], "importfile_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.importfile_set"]], "indication_label (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.indication_label"]], "indoor_water_use (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.indoor_water_use"]], "indoor_wui (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.indoor_wui"]], "initialize_audit_logs() (seed.models.properties.propertyview method)": [[34, "seed.models.properties.PropertyView.initialize_audit_logs"]], "initialize_audit_logs() (seed.models.tax_lots.taxlotview method)": [[34, "seed.models.tax_lots.TaxLotView.initialize_audit_logs"]], "inventory_documents (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.inventory_documents"]], "is_excluded_from_hash (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.is_excluded_from_hash"]], "is_extra_data (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.is_extra_data"]], "is_matching_criteria (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.is_matching_criteria"]], "is_option_for_reports_x_axis (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.is_option_for_reports_x_axis"]], "is_option_for_reports_y_axis (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.is_option_for_reports_y_axis"]], "is_updating (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.is_updating"]], "jurisdiction_property_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.jurisdiction_property_id"]], "jurisdiction_tax_lot_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.jurisdiction_tax_lot_id"]], "labels (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.labels"]], "labels (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.labels"]], "latitude (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.latitude"]], "latitude (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.latitude"]], "long_lat (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.long_lat"]], "long_lat (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.long_lat"]], "longitude (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.longitude"]], "longitude (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.longitude"]], "lot_number (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.lot_number"]], "mapped_mappings (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.mapped_mappings"]], "measure_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.measure_set"]], "measures (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.measures"]], "merge_protection (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.merge_protection"]], "merge_relationships() (seed.models.properties.propertystate class method)": [[34, "seed.models.properties.PropertyState.merge_relationships"]], "merge_relationships() (seed.models.tax_lots.taxlotstate class method)": [[34, "seed.models.tax_lots.TaxLotState.merge_relationships"]], "merge_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.merge_state"]], "merge_state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.merge_state"]], "meters (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.meters"]], "modified (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.modified"]], "name (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.name"]], "name (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.name"]], "name (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.name"]], "name (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.name"]], "normalized_address (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.normalized_address"]], "normalized_address (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.normalized_address"]], "notes (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.notes"]], "notes (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.notes"]], "number_properties (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.number_properties"]], "objects (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.objects"]], "objects (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.objects"]], "objects (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.objects"]], "objects (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.objects"]], "objects (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.objects"]], "objects (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.objects"]], "objects (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.objects"]], "objects (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.objects"]], "objects (seed.models.properties.propertyviewlabel attribute)": [[34, "seed.models.properties.PropertyViewLabel.objects"]], "objects (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.objects"]], "objects (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.objects"]], "objects (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.objects"]], "objects (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.objects"]], "occupied_floor_area (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.occupied_floor_area"]], "occupied_floor_area_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.occupied_floor_area_orig"]], "or_filter_groups (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.or_filter_groups"]], "organization (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.organization"]], "organization (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.organization"]], "organization (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.organization"]], "organization (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.organization"]], "organization (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.organization"]], "organization (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.organization"]], "organization (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.organization"]], "organization (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.organization"]], "organization_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.organization_id"]], "organization_id (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.organization_id"]], "organization_id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.organization_id"]], "organization_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.organization_id"]], "organization_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.organization_id"]], "organization_id (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.organization_id"]], "organization_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.organization_id"]], "organization_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.organization_id"]], "outdoor_water_use (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.outdoor_water_use"]], "owner (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner"]], "owner_address (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_address"]], "owner_city_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_city_state"]], "owner_email (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_email"]], "owner_postal_code (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_postal_code"]], "owner_telephone (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.owner_telephone"]], "parent1 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent1"]], "parent1 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent1"]], "parent1_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent1_id"]], "parent1_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent1_id"]], "parent2 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent2"]], "parent2 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent2"]], "parent2_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent2_id"]], "parent2_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent2_id"]], "parent_property (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.parent_property"]], "parent_property_id (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.parent_property_id"]], "parent_state1 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state1"]], "parent_state1 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.parent_state1"]], "parent_state1 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state1"]], "parent_state1_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state1_id"]], "parent_state1_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state1_id"]], "parent_state2 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state2"]], "parent_state2 (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.parent_state2"]], "parent_state2 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state2"]], "parent_state2_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.parent_state2_id"]], "parent_state2_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.parent_state2_id"]], "pm_parent_property_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.pm_parent_property_id"]], "pm_property_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.pm_property_id"]], "post_save_property() (in module seed.models.properties)": [[34, "seed.models.properties.post_save_property"]], "post_save_property_state() (in module seed.models.properties)": [[34, "seed.models.properties.post_save_property_state"]], "post_save_property_view() (in module seed.models.properties)": [[34, "seed.models.properties.post_save_property_view"]], "post_save_taxlot_state() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.post_save_taxlot_state"]], "post_save_taxlot_view() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.post_save_taxlot_view"]], "postal_code (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.postal_code"]], "postal_code (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.postal_code"]], "pre_delete_state() (in module seed.models.properties)": [[34, "seed.models.properties.pre_delete_state"]], "promote() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.promote"]], "promote() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.promote"]], "property (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.property"]], "property_footprint (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_footprint"]], "property_id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.property_id"]], "property_name (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_name"]], "property_notes (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_notes"]], "property_set (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.property_set"]], "property_states() (seed.models.tax_lots.taxlotview method)": [[34, "seed.models.tax_lots.TaxLotView.property_states"]], "property_timezone (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_timezone"]], "property_type (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.property_type"]], "property_views() (seed.models.tax_lots.taxlotview method)": [[34, "seed.models.tax_lots.TaxLotView.property_views"]], "propertyauditlog_parent1 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.propertyauditlog_parent1"]], "propertyauditlog_parent2 (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.propertyauditlog_parent2"]], "propertyauditlog_state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.propertyauditlog_state"]], "propertyauditlog_view (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.propertyauditlog_view"]], "propertymeasure_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.propertymeasure_set"]], "propertyview (seed.models.properties.propertyviewlabel attribute)": [[34, "seed.models.properties.PropertyViewLabel.propertyview"]], "propertyview_id (seed.models.properties.propertyviewlabel attribute)": [[34, "seed.models.properties.PropertyViewLabel.propertyview_id"]], "propertyview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.propertyview_set"]], "propertyview_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.propertyview_set"]], "propertyview_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.propertyview_set"]], "propertyviewlabel_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.propertyviewlabel_set"]], "propertyviewlabel_set (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.propertyviewlabel_set"]], "raw_access_level_instance (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.raw_access_level_instance"]], "raw_access_level_instance (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.raw_access_level_instance"]], "raw_access_level_instance_error (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.raw_access_level_instance_error"]], "raw_access_level_instance_error (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.raw_access_level_instance_error"]], "raw_access_level_instance_id (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.raw_access_level_instance_id"]], "raw_access_level_instance_id (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.raw_access_level_instance_id"]], "raw_mappings (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.raw_mappings"]], "recent_sale_date (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.recent_sale_date"]], "recognize_empty (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.recognize_empty"]], "record_type (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.record_type"]], "record_type (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.record_type"]], "release_date (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.release_date"]], "rename_column() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.rename_column"]], "retrieve_all() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_all"]], "retrieve_all_by_tuple() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_all_by_tuple"]], "retrieve_db_field_name_for_hash_comparison() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_field_name_for_hash_comparison"]], "retrieve_db_field_table_and_names_from_db_tables() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_field_table_and_names_from_db_tables"]], "retrieve_db_fields() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_fields"]], "retrieve_db_fields_from_db_tables() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_fields_from_db_tables"]], "retrieve_db_types() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_db_types"]], "retrieve_mapping_columns() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_mapping_columns"]], "retrieve_priorities() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.retrieve_priorities"]], "rule_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.rule_set"]], "salesforce_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.salesforce_column"]], "save() (seed.models.columns.column method)": [[34, "seed.models.columns.Column.save"]], "save() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.save"]], "save() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.save"]], "save_column_names() (seed.models.columns.column static method)": [[34, "seed.models.columns.Column.save_column_names"]], "scenarios (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.scenarios"]], "seed.models.auditlog": [[34, "module-seed.models.auditlog"]], "seed.models.columns": [[34, "module-seed.models.columns"]], "seed.models.cycles": [[34, "module-seed.models.cycles"]], "seed.models.models": [[34, "module-seed.models.models"]], "seed.models.properties": [[34, "module-seed.models.properties"]], "seed.models.tax_lots": [[34, "module-seed.models.tax_lots"]], "set_default_access_level_instance() (in module seed.models.properties)": [[34, "seed.models.properties.set_default_access_level_instance"]], "set_default_access_level_instance() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.set_default_access_level_instance"]], "shared_field_type (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.shared_field_type"]], "show_in_list (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.show_in_list"]], "simulation (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.simulation"]], "site_eui (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui"]], "site_eui_modeled (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_modeled"]], "site_eui_modeled_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_modeled_orig"]], "site_eui_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_orig"]], "site_eui_weather_normalized (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_weather_normalized"]], "site_eui_weather_normalized_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.site_eui_weather_normalized_orig"]], "source_eui (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui"]], "source_eui_modeled (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_modeled"]], "source_eui_modeled_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_modeled_orig"]], "source_eui_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_orig"]], "source_eui_weather_normalized (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_weather_normalized"]], "source_eui_weather_normalized_orig (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_eui_weather_normalized_orig"]], "source_type (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.source_type"]], "space_alerts (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.space_alerts"]], "start (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.start"]], "state (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.state"]], "state (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.state"]], "state (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.state"]], "state (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.state"]], "state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.state"]], "state (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.state"]], "state_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.state_id"]], "state_id (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.state_id"]], "state_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.state_id"]], "state_id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.state_id"]], "statuslabel (seed.models.properties.propertyviewlabel attribute)": [[34, "seed.models.properties.PropertyViewLabel.statuslabel"]], "statuslabel_id (seed.models.properties.propertyviewlabel attribute)": [[34, "seed.models.properties.PropertyViewLabel.statuslabel_id"]], "super_organization (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.super_organization"]], "super_organization_id (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.super_organization_id"]], "sync_latitude_longitude_and_long_lat() (in module seed.models.properties)": [[34, "seed.models.properties.sync_latitude_longitude_and_long_lat"]], "sync_latitude_longitude_and_long_lat() (in module seed.models.tax_lots)": [[34, "seed.models.tax_lots.sync_latitude_longitude_and_long_lat"]], "table_name (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.table_name"]], "target_emission_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.target_emission_column"]], "target_energy_column (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.target_energy_column"]], "tax_lot_states() (seed.models.properties.propertyview method)": [[34, "seed.models.properties.PropertyView.tax_lot_states"]], "tax_lot_views() (seed.models.properties.propertyview method)": [[34, "seed.models.properties.PropertyView.tax_lot_views"]], "taxlot (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlot"]], "taxlot_footprint (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlot_footprint"]], "taxlot_id (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlot_id"]], "taxlotauditlog_parent1 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.taxlotauditlog_parent1"]], "taxlotauditlog_parent2 (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.taxlotauditlog_parent2"]], "taxlotauditlog_parent_state1 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotauditlog_parent_state1"]], "taxlotauditlog_parent_state2 (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotauditlog_parent_state2"]], "taxlotauditlog_state (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotauditlog_state"]], "taxlotauditlog_view (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlotauditlog_view"]], "taxlotproperty_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.taxlotproperty_set"]], "taxlotproperty_set (seed.models.properties.propertyview attribute)": [[34, "seed.models.properties.PropertyView.taxlotproperty_set"]], "taxlotproperty_set (seed.models.tax_lots.taxlotview attribute)": [[34, "seed.models.tax_lots.TaxLotView.taxlotproperty_set"]], "taxlotview_set (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.taxlotview_set"]], "taxlotview_set (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.taxlotview_set"]], "taxlotview_set (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.taxlotview_set"]], "to_dict() (seed.models.models.statuslabel method)": [[34, "seed.models.models.StatusLabel.to_dict"]], "to_dict() (seed.models.properties.propertystate method)": [[34, "seed.models.properties.PropertyState.to_dict"]], "to_dict() (seed.models.tax_lots.taxlotstate method)": [[34, "seed.models.tax_lots.TaxLotState.to_dict"]], "total_ghg_emissions (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_ghg_emissions"]], "total_ghg_emissions_intensity (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_ghg_emissions_intensity"]], "total_marginal_ghg_emissions (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_marginal_ghg_emissions"]], "total_marginal_ghg_emissions_intensity (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.total_marginal_ghg_emissions_intensity"]], "ubid (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.ubid"]], "ubid (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.ubid"]], "ubidmodel_set (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.ubidmodel_set"]], "ubidmodel_set (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.ubidmodel_set"]], "unit (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.unit"]], "unit_id (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.unit_id"]], "unit_name (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.unit_name"]], "unit_type (seed.models.models.unit attribute)": [[34, "seed.models.models.Unit.unit_type"]], "units_pint (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.units_pint"]], "updated (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.updated"]], "updated (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.updated"]], "updated (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.updated"]], "updated (seed.models.tax_lots.taxlotstate attribute)": [[34, "seed.models.tax_lots.TaxLotState.updated"]], "use_description (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.use_description"]], "user (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.user"]], "user_id (seed.models.cycles.cycle attribute)": [[34, "seed.models.cycles.Cycle.user_id"]], "validate_model() (in module seed.models.columns)": [[34, "seed.models.columns.validate_model"]], "view (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.view"]], "view (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.view"]], "view_id (seed.models.properties.propertyauditlog attribute)": [[34, "seed.models.properties.PropertyAuditLog.view_id"]], "view_id (seed.models.tax_lots.taxlotauditlog attribute)": [[34, "seed.models.tax_lots.TaxLotAuditLog.view_id"]], "views (seed.models.properties.property attribute)": [[34, "seed.models.properties.Property.views"]], "views (seed.models.tax_lots.taxlot attribute)": [[34, "seed.models.tax_lots.TaxLot.views"]], "violation_label (seed.models.models.statuslabel attribute)": [[34, "seed.models.models.StatusLabel.violation_label"]], "water_use (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.water_use"]], "wui (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.wui"]], "x_axis_columns (seed.models.columns.column attribute)": [[34, "seed.models.columns.Column.x_axis_columns"]], "year_built (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.year_built"]], "year_ending (seed.models.properties.propertystate attribute)": [[34, "seed.models.properties.PropertyState.year_ending"]], "seed.public": [[35, "module-seed.public"]], "celerydatetimeserializer (class in seed.serializers.celery)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer"]], "labelserializer (class in seed.serializers.labels)": [[36, "seed.serializers.labels.LabelSerializer"]], "labelserializer.meta (class in seed.serializers.labels)": [[36, "seed.serializers.labels.LabelSerializer.Meta"]], "default() (seed.serializers.celery.celerydatetimeserializer method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.default"]], "extra_kwargs (seed.serializers.labels.labelserializer.meta attribute)": [[36, "seed.serializers.labels.LabelSerializer.Meta.extra_kwargs"]], "fields (seed.serializers.labels.labelserializer.meta attribute)": [[36, "seed.serializers.labels.LabelSerializer.Meta.fields"]], "get_is_applied() (seed.serializers.labels.labelserializer method)": [[36, "seed.serializers.labels.LabelSerializer.get_is_applied"]], "model (seed.serializers.labels.labelserializer.meta attribute)": [[36, "seed.serializers.labels.LabelSerializer.Meta.model"]], "seed.serializers": [[36, "module-seed.serializers"]], "seed.serializers.celery": [[36, "module-seed.serializers.celery"]], "seed.serializers.labels": [[36, "module-seed.serializers.labels"]], "seed_decoder() (seed.serializers.celery.celerydatetimeserializer static method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.seed_decoder"]], "seed_dumps() (seed.serializers.celery.celerydatetimeserializer static method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.seed_dumps"]], "seed_loads() (seed.serializers.celery.celerydatetimeserializer static method)": [[36, "seed.serializers.celery.CeleryDatetimeSerializer.seed_loads"]], "to_representation() (seed.serializers.labels.labelserializer method)": [[36, "seed.serializers.labels.LabelSerializer.to_representation"]], "breadcrumbnode (class in seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.BreadcrumbNode"]], "urlbreadcrumbnode (class in seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.UrlBreadcrumbNode"]], "breadcrumb() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb"]], "breadcrumb_root() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb_root"]], "breadcrumb_url() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb_url"]], "breadcrumb_url_root() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.breadcrumb_url_root"]], "create_crumb() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.create_crumb"]], "create_crumb_first() (in module seed.templatetags.breadcrumbs)": [[37, "seed.templatetags.breadcrumbs.create_crumb_first"]], "render() (seed.templatetags.breadcrumbs.breadcrumbnode method)": [[37, "seed.templatetags.breadcrumbs.BreadcrumbNode.render"]], "render() (seed.templatetags.breadcrumbs.urlbreadcrumbnode method)": [[37, "seed.templatetags.breadcrumbs.UrlBreadcrumbNode.render"]], "seed.templatetags.breadcrumbs": [[37, "module-seed.templatetags.breadcrumbs"]], "seed.test_helpers": [[38, "module-seed.test_helpers"]], "djangofunctionalfactory (class in seed.test_helpers.factory.helpers)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory"]], "invalid_test_cc_number() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.invalid_test_cc_number"]], "rand_bool() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_bool"]], "rand_city() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_city"]], "rand_city_suffix() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_city_suffix"]], "rand_currency() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_currency"]], "rand_date() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_date"]], "rand_domain() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_domain"]], "rand_email() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_email"]], "rand_float() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_float"]], "rand_int() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_int"]], "rand_name() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_name"]], "rand_phone() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_phone"]], "rand_plant_name() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_plant_name"]], "rand_str() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_str"]], "rand_street_address() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_street_address"]], "rand_street_suffix() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.rand_street_suffix"]], "seed.test_helpers.factory.helpers": [[39, "module-seed.test_helpers.factory.helpers"]], "test_cc_number() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.test_cc_number"]], "valid_test_cc_number() (seed.test_helpers.factory.helpers.djangofunctionalfactory class method)": [[39, "seed.test_helpers.factory.helpers.DjangoFunctionalFactory.valid_test_cc_number"]], "accesslevelbasetestcase (class in seed.tests.util)": [[41, "seed.tests.util.AccessLevelBaseTestCase"]], "adminviewstest (class in seed.tests.test_admin_views)": [[41, "seed.tests.test_admin_views.AdminViewsTest"]], "assertdictsubsetmixin (class in seed.tests.util)": [[41, "seed.tests.util.AssertDictSubsetMixin"]], "classdecoratortests (class in seed.tests.test_decorators)": [[41, "seed.tests.test_decorators.ClassDecoratorTests"]], "datamappingbasetestcase (class in seed.tests.util)": [[41, "seed.tests.util.DataMappingBaseTestCase"]], "datasetpermissionstests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.DatasetPermissionsTests"]], "deletemodelstestcase (class in seed.tests.util)": [[41, "seed.tests.util.DeleteModelsTestCase"]], "fakeclient (class in seed.tests.util)": [[41, "seed.tests.util.FakeClient"]], "fakerequest (class in seed.tests.util)": [[41, "seed.tests.util.FakeRequest"]], "get (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.GET"]], "getdatasetsviewstests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.GetDatasetsViewsTests"]], "importfileviewstests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.ImportFileViewsTests"]], "inventoryviewtests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.InventoryViewTests"]], "meta (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.META"]], "mainviewtests (class in seed.tests.test_views)": [[41, "seed.tests.test_views.MainViewTests"]], "post (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.POST"]], "requireorganizationidtests (class in seed.tests.test_decorators)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests"]], "testdecorators (class in seed.tests.test_decorators)": [[41, "seed.tests.test_decorators.TestDecorators"]], "testerror": [[41, "seed.tests.test_decorators.TestError"]], "testmcmviews (class in seed.tests.test_views)": [[41, "seed.tests.test_views.TestMCMViews"]], "testtasks (class in seed.tests.test_tasks)": [[41, "seed.tests.test_tasks.TestTasks"]], "assertdictcontainssubset() (seed.tests.util.assertdictsubsetmixin method)": [[41, "seed.tests.util.AssertDictSubsetMixin.assertDictContainsSubset"]], "assert_expected_mappings() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.assert_expected_mappings"]], "body (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.body"]], "create_import_file() (seed.tests.util.datamappingbasetestcase method)": [[41, "seed.tests.util.DataMappingBaseTestCase.create_import_file"]], "expected_mappings (seed.tests.test_views.testmcmviews attribute)": [[41, "seed.tests.test_views.TestMCMViews.expected_mappings"]], "get() (seed.tests.util.fakeclient method)": [[41, "seed.tests.util.FakeClient.get"]], "locked (seed.tests.test_decorators.testdecorators attribute)": [[41, "seed.tests.test_decorators.TestDecorators.locked"]], "login_as_child_member() (seed.tests.util.accesslevelbasetestcase method)": [[41, "seed.tests.util.AccessLevelBaseTestCase.login_as_child_member"]], "login_as_root_member() (seed.tests.util.accesslevelbasetestcase method)": [[41, "seed.tests.util.AccessLevelBaseTestCase.login_as_root_member"]], "login_as_root_owner() (seed.tests.util.accesslevelbasetestcase method)": [[41, "seed.tests.util.AccessLevelBaseTestCase.login_as_root_owner"]], "path (seed.tests.util.fakerequest attribute)": [[41, "seed.tests.util.FakeRequest.path"]], "pk (seed.tests.test_decorators.testdecorators attribute)": [[41, "seed.tests.test_decorators.TestDecorators.pk"]], "post() (seed.tests.util.fakeclient method)": [[41, "seed.tests.util.FakeClient.post"]], "raw_columns_expected (seed.tests.test_views.testmcmviews attribute)": [[41, "seed.tests.test_views.TestMCMViews.raw_columns_expected"]], "seed.tests.test_admin_views": [[41, "module-seed.tests.test_admin_views"]], "seed.tests.test_decorators": [[41, "module-seed.tests.test_decorators"]], "seed.tests.test_tasks": [[41, "module-seed.tests.test_tasks"]], "seed.tests.test_views": [[41, "module-seed.tests.test_views"]], "seed.tests.util": [[41, "module-seed.tests.util"]], "setup() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.setUp"]], "setup() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.setUp"]], "setup() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.setUp"]], "setup() (seed.tests.test_tasks.testtasks method)": [[41, "seed.tests.test_tasks.TestTasks.setUp"]], "setup() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.setUp"]], "setup() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.setUp"]], "setup() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.setUp"]], "setup() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.setUp"]], "setup() (seed.tests.test_views.mainviewtests method)": [[41, "seed.tests.test_views.MainViewTests.setUp"]], "setup() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.setUp"]], "setup() (seed.tests.util.accesslevelbasetestcase method)": [[41, "seed.tests.util.AccessLevelBaseTestCase.setUp"]], "setup() (seed.tests.util.deletemodelstestcase method)": [[41, "seed.tests.util.DeleteModelsTestCase.setUp"]], "set_up() (seed.tests.util.datamappingbasetestcase method)": [[41, "seed.tests.util.DataMappingBaseTestCase.set_up"]], "teardown() (seed.tests.util.deletemodelstestcase method)": [[41, "seed.tests.util.DeleteModelsTestCase.tearDown"]], "test_add_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_org"]], "test_add_org_dupe() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_org_dupe"]], "test_add_owner_existing_org_to_non_root() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_owner_existing_org_to_non_root"]], "test_add_user_existing_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_user_existing_org"]], "test_add_user_new_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_user_new_org"]], "test_add_user_no_org() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_add_user_no_org"]], "test_ajax_request_class_dict() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_dict"]], "test_ajax_request_class_dict_status_error() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_dict_status_error"]], "test_ajax_request_class_dict_status_false() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_dict_status_false"]], "test_ajax_request_class_format_type() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_ajax_request_class_format_type"]], "test_create_dataset() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_create_dataset"]], "test_dataset_count() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_count"]], "test_dataset_create() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_create"]], "test_dataset_destroy() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_destroy"]], "test_dataset_list() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_list"]], "test_dataset_retrieve() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_retrieve"]], "test_dataset_update() (seed.tests.test_views.datasetpermissionstests method)": [[41, "seed.tests.test_views.DatasetPermissionsTests.test_dataset_update"]], "test_delete_dataset() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_delete_dataset"]], "test_delete_file() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.test_delete_file"]], "test_delete_organization() (seed.tests.test_tasks.testtasks method)": [[41, "seed.tests.test_tasks.TestTasks.test_delete_organization"]], "test_get_column_mapping_suggestions() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_column_mapping_suggestions"]], "test_get_column_mapping_suggestions_pm_file() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_column_mapping_suggestions_pm_file"]], "test_get_column_mapping_suggestions_with_columns() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_column_mapping_suggestions_with_columns"]], "test_get_cycles() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_cycles"]], "test_get_dataset() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_dataset"]], "test_get_datasets() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_datasets"]], "test_get_datasets_count() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_datasets_count"]], "test_get_datasets_count_invalid() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_get_datasets_count_invalid"]], "test_get_import_file() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.test_get_import_file"]], "test_get_matching_and_geocoding_results() (seed.tests.test_views.importfileviewstests method)": [[41, "seed.tests.test_views.ImportFileViewsTests.test_get_matching_and_geocoding_results"]], "test_get_prog_key() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_get_prog_key"]], "test_get_properties() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties"]], "test_get_properties_cycle_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_cycle_id"]], "test_get_properties_empty_page() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_empty_page"]], "test_get_properties_page_not_an_integer() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_page_not_an_integer"]], "test_get_properties_pint_fields() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_pint_fields"]], "test_get_properties_profile_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_profile_id"]], "test_get_properties_property_extra_data() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_property_extra_data"]], "test_get_properties_select_all() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_select_all"]], "test_get_properties_taxlot_extra_data() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_taxlot_extra_data"]], "test_get_properties_with_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_with_taxlots"]], "test_get_properties_with_taxlots_with_footprints() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_with_taxlots_with_footprints"]], "test_get_properties_wrong_query_params() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_properties_wrong_query_params"]], "test_get_property() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_property"]], "test_get_property_columns() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_property_columns"]], "test_get_property_multiple_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_property_multiple_taxlots"]], "test_get_raw_column_names() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_get_raw_column_names"]], "test_get_taxlot() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlot"]], "test_get_taxlot_columns() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlot_columns"]], "test_get_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots"]], "test_get_taxlots_empty_page() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_empty_page"]], "test_get_taxlots_extra_data() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_extra_data"]], "test_get_taxlots_multiple_taxlots() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_multiple_taxlots"]], "test_get_taxlots_no_cycle_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_no_cycle_id"]], "test_get_taxlots_page_not_an_integer() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_page_not_an_integer"]], "test_get_taxlots_profile_id() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_get_taxlots_profile_id"]], "test_home() (seed.tests.test_views.mainviewtests method)": [[41, "seed.tests.test_views.MainViewTests.test_home"]], "test_increment_cache() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_increment_cache"]], "test_locking() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_locking"]], "test_locking_w_exception() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_locking_w_exception"]], "test_postoffice() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_postoffice"]], "test_progress() (seed.tests.test_decorators.testdecorators method)": [[41, "seed.tests.test_decorators.TestDecorators.test_progress"]], "test_progress() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_progress"]], "test_rehash_query_or_structure() (seed.tests.test_tasks.testtasks method)": [[41, "seed.tests.test_tasks.TestTasks.test_rehash_query_or_structure"]], "test_require_organization_id_class_no_org_id() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_require_organization_id_class_no_org_id"]], "test_require_organization_id_class_org_id() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_require_organization_id_class_org_id"]], "test_require_organization_id_class_org_id_not_int() (seed.tests.test_decorators.classdecoratortests method)": [[41, "seed.tests.test_decorators.ClassDecoratorTests.test_require_organization_id_class_org_id_not_int"]], "test_require_organization_id_fail_no_key() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_fail_no_key"]], "test_require_organization_id_fail_not_numeric() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_fail_not_numeric"]], "test_require_organization_id_success_integer() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_success_integer"]], "test_require_organization_id_success_string() (seed.tests.test_decorators.requireorganizationidtests method)": [[41, "seed.tests.test_decorators.RequireOrganizationIDTests.test_require_organization_id_success_string"]], "test_save_column_mappings() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_save_column_mappings"]], "test_save_column_mappings_idempotent() (seed.tests.test_views.testmcmviews method)": [[41, "seed.tests.test_views.TestMCMViews.test_save_column_mappings_idempotent"]], "test_signup_process() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_signup_process"]], "test_signup_process_force_lowercase_email() (seed.tests.test_admin_views.adminviewstest method)": [[41, "seed.tests.test_admin_views.AdminViewsTest.test_signup_process_force_lowercase_email"]], "test_update_dataset() (seed.tests.test_views.getdatasetsviewstests method)": [[41, "seed.tests.test_views.GetDatasetsViewsTests.test_update_dataset"]], "test_update_pint_fields_with_modified_display_settings() (seed.tests.test_views.inventoryviewtests method)": [[41, "seed.tests.test_views.InventoryViewTests.test_update_pint_fields_with_modified_display_settings"]], "unlocked (seed.tests.test_decorators.testdecorators attribute)": [[41, "seed.tests.test_decorators.TestDecorators.unlocked"]], "apibypasscsrfmiddleware (class in seed.utils.api)": [[44, "seed.utils.api.APIBypassCSRFMiddleware"]], "orgcreatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgCreateMixin"]], "orgcreateupdatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgCreateUpdateMixin"]], "orgmixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgMixin"]], "orgquerysetmixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgQuerySetMixin"]], "orgupdatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgUpdateMixin"]], "orgvalidatemixin (class in seed.utils.api)": [[44, "seed.utils.api.OrgValidateMixin"]], "orgvalidator (class in seed.utils.api)": [[44, "seed.utils.api.OrgValidator"]], "profileidmixin (class in seed.utils.api)": [[44, "seed.utils.api.ProfileIdMixin"]], "api_endpoint() (in module seed.utils.api)": [[44, "seed.utils.api.api_endpoint"]], "api_endpoint_class() (in module seed.utils.api)": [[44, "seed.utils.api.api_endpoint_class"]], "clean_api_regex() (in module seed.utils.api)": [[44, "seed.utils.api.clean_api_regex"]], "convert_datestr() (in module seed.utils.time)": [[44, "seed.utils.time.convert_datestr"]], "convert_to_js_timestamp() (in module seed.utils.time)": [[44, "seed.utils.time.convert_to_js_timestamp"]], "create_organization() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.create_organization"]], "create_suborganization() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.create_suborganization"]], "default_pm_mappings() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.default_pm_mappings"]], "drf_api_endpoint() (in module seed.utils.api)": [[44, "seed.utils.api.drf_api_endpoint"]], "field (seed.utils.api.orgvalidator attribute)": [[44, "seed.utils.api.OrgValidator.field"]], "format_api_docstring() (in module seed.utils.api)": [[44, "seed.utils.api.format_api_docstring"]], "get_all_urls() (in module seed.utils.api)": [[44, "seed.utils.api.get_all_urls"]], "get_api_endpoints() (in module seed.utils.api)": [[44, "seed.utils.api.get_api_endpoints"]], "get_api_request_user() (in module seed.utils.api)": [[44, "seed.utils.api.get_api_request_user"]], "get_org_id_from_validator() (in module seed.utils.api)": [[44, "seed.utils.api.get_org_id_from_validator"]], "get_organization() (seed.utils.api.orgmixin method)": [[44, "seed.utils.api.OrgMixin.get_organization"]], "get_parent_org() (seed.utils.api.orgmixin method)": [[44, "seed.utils.api.OrgMixin.get_parent_org"]], "get_queryset() (seed.utils.api.orgquerysetmixin method)": [[44, "seed.utils.api.OrgQuerySetMixin.get_queryset"]], "get_show_columns() (seed.utils.api.profileidmixin method)": [[44, "seed.utils.api.ProfileIdMixin.get_show_columns"]], "get_source_type() (in module seed.utils.buildings)": [[44, "seed.utils.buildings.get_source_type"]], "key (seed.utils.api.orgvalidator attribute)": [[44, "seed.utils.api.OrgValidator.key"]], "parse_datetime() (in module seed.utils.time)": [[44, "seed.utils.time.parse_datetime"]], "perform_create() (seed.utils.api.orgcreatemixin method)": [[44, "seed.utils.api.OrgCreateMixin.perform_create"]], "perform_update() (seed.utils.api.orgupdatemixin method)": [[44, "seed.utils.api.OrgUpdateMixin.perform_update"]], "rgetattr() (in module seed.utils.api)": [[44, "seed.utils.api.rgetattr"]], "seed.utils.api": [[44, "module-seed.utils.api"]], "seed.utils.buildings": [[44, "module-seed.utils.buildings"]], "seed.utils.organizations": [[44, "module-seed.utils.organizations"]], "seed.utils.time": [[44, "module-seed.utils.time"]], "set_default_2fa_method() (in module seed.utils.organizations)": [[44, "seed.utils.organizations.set_default_2fa_method"]], "validate() (seed.utils.api.orgvalidatemixin method)": [[44, "seed.utils.api.OrgValidateMixin.validate"]], "validate_org() (seed.utils.api.orgvalidatemixin method)": [[44, "seed.utils.api.OrgValidateMixin.validate_org"]]}}) \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/setup_docker.html b/docs/code_documentation/3.2.0/setup_docker.html new file mode 100644 index 00000000..685773e9 --- /dev/null +++ b/docs/code_documentation/3.2.0/setup_docker.html @@ -0,0 +1,254 @@ + + + + + + + Installation using Docker — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Installation using Docker

+

Docker works natively on Linux, Mac OSX, and Windows 10. If you are using an older version of +Windows (and some older versions of Mac OSX), you will need to install Docker Toolbox.

+

Choose either Docker Native (Windows/OSX) or Docker Native (Ubuntu) to +install Docker.

+
+

Docker Native (Ubuntu)

+

Follow instructions here.

+ +
+
+

Docker Native (Windows/OSX)

+

Following instructions for Mac or +for Windows. Note that for OSX you must have docker desktop version 3.0 or later <https://github.com/concourse/concourse/issues/6038>.

+ +
+
+

Building and Running Containers for Non-Development

+
    +
  • Run Docker Compose

    +
    +
    docker compose build
    +
    +
    +

    Be Patient … If the containers build successfully, then start the containers

    +
    docker volume create --name=seed_pgdata
    +docker volume create --name=seed_media
    +docker compose up
    +
    +
    +

    Note that you may need to build the containers a couple times for everything to converge

    +
    +
  • +
  • Login to container

    +
    +

    The docker-compose file creates a default user and password. Below are the defaults but can +be overridden by setting environment variables.

    +
    username: user@seed-platform.org
    +password: super-secret-password
    +
    +
    +
    +
  • +
+
+

Note

+

Don’t forget that you need to reset your default username and password if you are going +to use these Docker images in production mode!

+
+
+
+

Using Docker for Development

+

The development environment is configured for live reloading (i.e., restart webserver when files change) +and debugging. It builds off the base docker-compose.yml, so it’s necessary +to specify the files being used in docker-compose commands as seen below.

+
+

Build

+
# create volumes for the database and media directory
+docker volume create --name=seed_pgdata
+docker volume create --name=seed_media
+
+# build the images
+docker compose -f docker-compose.yml -f docker-compose.dev.yml build
+
+
+
+
+

Running the Server

+

NOTE: the server config is sourced from config.settings.docker_dev, which will include +your local_untracked.py if it exists. If you have a local_untracked.py, make sure it doesn’t +overwrite the database or celery configuration!

+
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
+
+
+

If the server doesn’t start successfully, and docker compose logs doesn’t help, +the django development server probably failed to start due to an error in your config or code. +Unfortunately docker/django logging doesn’t appear to work when the container is first started. +Just try running the server yourself with docker exec, and see what the output is.

+

The development docker-compose file has some configurable parameters for specifying volumes to use:

+
    +
  • SEED_DB_VOLUME: the name of the docker volume to mount for postgres

  • +
  • SEED_MEDIA_VOLUME: the name of the docker volume to mount for the seed media folder

  • +
+

Docker will use environment variables from the shell or from a .env file to set these values.

+

This is useful if you want to switch between different databases for testing. +For example, if you want to create a separate volume for storing a production backup, you could do the following

+
docker volume create --name=seed_pgdata_prod
+SEED_DB_VOLUME=seed_pgdata_prod docker compose -f docker-compose.yml -f docker-compose.dev.yml up
+
+
+

NOTE: you’ll need to run docker compose down to remove the containers before you +can restart the containers connecting to different volumes.

+
+
+

Running Tests

+

While the containers are running (i.e., after running the docker compose up command), use docker exec to run tests in the web container:

+
docker exec -it seed_web ./manage.py test --settings config.settings.docker_dev
+
+
+

Add the setting --nocapture in order to see stdout while running tests. You will need to do this in order to make use of debugging as described below or the output to your debug commands will not display until after the break point has passed and the tests are finished.

+

Also worth noting: output from logging (_log.debug, etc) will not display in any situation unless a test fails.

+
+
+

Debugging

+

To use pdb on the server, the web container has remote-pdb installed. +In your code, insert the following

+
import remote_pdb; remote_pdb.set_trace()
+
+
+

Once the breakpoint is triggered, you should see the web container log something like “RemotePdb session open at 127.0.0.1:41653, waiting for connection …”. +To connect to the remote session, run netcat from inside the container (using the appropriate port).

+
docker exec -it seed_web nc 127.0.0.1:41653
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/setup_osx.html b/docs/code_documentation/3.2.0/setup_osx.html new file mode 100644 index 00000000..7e343396 --- /dev/null +++ b/docs/code_documentation/3.2.0/setup_osx.html @@ -0,0 +1,467 @@ + + + + + + + Installation on OSX — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Installation on OSX

+

These instructions are for installing and running SEED on Mac OSX in +development mode.

+
+

Quick Installation Instructions

+

This section is intended for developers who may already have their machine +ready for general development. If this is not the case, skip to Prerequisites. Note that SEED uses python 3.

+
    +
  • install Postgres 11.1 and redis for cache and message broker

  • +
  • install PostGIS 2.5 and enable it on the database using CREATE EXTENSION postgis;

  • +
  • install TimescaleDB 1.5.0

  • +
  • use a virtualenv (if desired)

  • +
  • git clone git@github.com:seed-platform/seed.git

  • +
  • create a local_untracked.py in the config/settings folder and add CACHE and DB config (example local_untracked.py.dist)

  • +
  • to enable geocoding, get MapQuest API key and attach it to your organization

  • +
  • export DJANGO_SETTINGS_MODULE=config.settings.dev in all terminals used by SEED (celery terminal and runserver terminal)

  • +
  • +
    pip install -r requirements/local.txt
      +
    • for condas python, you way need to run this command to get pip install to succeed: conda install -c conda-forge python-crfsuite

    • +
    +
    +
    +
  • +
  • npm install

  • +
  • ./manage.py migrate

  • +
  • ./manage.py create_default_user

  • +
  • ./manage.py runserver

  • +
  • DJANGO_SETTINGS_MODULE=config.settings.dev celery -A seed worker -l INFO -c 4 –max-tasks-per-child 1000 -EBS django_celery_beat.schedulers:DatabaseScheduler

  • +
  • navigate to http://127.0.0.1:8000/app/#/profile/admin in your browser to add users to organizations

  • +
  • main app runs at 127.0.0.1:8000/app

  • +
+

The python manage.py create_default_user will setup a default superuser +which must be used to access the system the first time. The management command +can also create other superusers.

+
./manage.py create_default_user --username=demo@seed-platform.org --organization=lbl --password=demo123
+
+
+
+
+

Prerequisites

+

These instructions assume you have MacPorts or Homebrew. Your system +should have the following dependencies already installed:

+
    +
  • git (port install git or brew install git)

  • +
  • graphviz (brew install graphviz)

  • +
  • pyenv (Recommended)

    +
    +
    +

    Note

    +

    Although you could install Python packages globally, this is the +easiest way to install Python packages. Setting these up first will +help avoid polluting your base Python installation and make it much +easier to switch between different versions of the code.

    +
    +
    brew install pyenv
    +brew install pyenv-virtualenv
    +pyenv install <python3 version you want>
    +pyenv virtualenv <python3 version you want> seed
    +pyenv local seed
    +
    +
    +
    +
  • +
+
+
+

PostgreSQL 11.1

+

MacPorts:

+
sudo su - root
+port install postgresql94-server postgresql94 postgresql94-doc
+# init db
+mkdir -p /opt/local/var/db/postgresql94/defaultdb
+chown postgres:postgres /opt/local/var/db/postgresql94/defaultdb
+su postgres -c '/opt/local/lib/postgresql94/bin/initdb -D /opt/local/var/db/postgresql94/defaultdb'
+
+# At this point, you may want to add start/stop scripts or aliases to
+# ~/.bashrc or your virtualenv ``postactivate`` script
+# (in ``~/.virtualenvs/{env-name}/bin/postactivate``).
+
+alias pg_start='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \
+    -D /opt/local/var/db/postgresql94/defaultdb \
+    -l /opt/local/var/db/postgresql94/defaultdb/postgresql.log start"'
+alias pg_stop='sudo su postgres -c "/opt/local/lib/postgresql94/bin/pg_ctl \
+    -D /opt/local/var/db/postgresql94/defaultdb stop"'
+
+pg_start
+
+sudo su - postgres
+PATH=$PATH:/opt/local/lib/postgresql94/bin/
+
+
+

Homebrew:

+
brew install postgres
+# follow the post install instructions to add to launchagents or call
+# manually with `postgres -D /usr/local/var/postgres`
+# Skip the remaining Postgres instructions!
+
+
+

Configure PostgreSQL. Replace ‘seeddb’, ‘seeduser’ with desired db/user. By +default use password seedpass when prompted. Use the code block below in development only since +the seeduser is a SUPERUSER.

+
createuser -P seeduser
+createdb `whoami`
+psql -c 'CREATE DATABASE "seeddb" WITH OWNER = "seeduser";'
+psql -c 'GRANT ALL PRIVILEGES ON DATABASE "seeddb" TO seeduser;'
+psql -c 'ALTER ROLE seeduser SUPERUSER;'
+
+
+
+
+

PostGIS 2.5

+

MacPorts:

+
# Assuming you're still root from installing PostgreSQL,
+port install postgis2
+
+
+

Homebrew:

+
brew install postgis
+
+
+

Configure PostGIS:

+
psql -d seeddb -c "CREATE EXTENSION postgis;"
+
+# For testing, give seed user superuser access:
+# psql -c 'ALTER USER seeduser CREATEDB;'
+
+
+

If upgrading from an existing database or existing local_untracked.py file, make sure to add the +MapQuest API Key and set the database engine to ‘ENGINE’: ‘django.contrib.gis.db.backends.postgis’.

+

Now exit any root environments, becoming just yourself (even though it’s not +that easy being green), for the remainder of these instructions.

+
+
+

TimescaleDB 1.5.0

+

Note, as of version 1.5.0, dumping and restoring databases requires that both the source and target +database have the same version of TimescaleDB.

+

Downloading From Source:

+
# Note: Installing from source should only be done
+# if you have a Postgres installation not maintained by Homebrew.
+# This installation requires C compiler (e.g., gcc or clang) and CMake version 3.4 or greater.
+
+git clone https://github.com/timescale/timescaledb.git
+cd timescaledb
+git checkout 1.5.0
+
+# Bootstrap the build system
+./bootstrap
+
+# If OpenSSL can't be found by cmake - run the following instead
+# ./bootstrap -DOPENSSL_ROOT_DIR=<location of OpenSSL> # e.g., -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl
+
+# To build the extension
+cd build && make
+
+# To install
+make install
+
+# Find postgresql.conf
+# Then uncomment the shared_preload_libraries line changing it to the following
+# shared_preload_libraries = 'timescaledb'
+psql -d postgres -c "SHOW config_file;"
+
+# Restart PostgreSQL instance
+
+
+
+
+

Python Packages

+

Run these commands as your normal user id.

+

Change to a virtualenv (using virtualenvwrapper) or do the following as a +superuser. A virtualenv is usually better for development. Set the virtualenv +to seed.

+
workon seed
+
+
+

Make sure PostgreSQL command line scripts are in your PATH (if using MacPorts)

+
export PATH=$PATH:/opt/local/lib/postgresql94/bin
+
+
+

Some packages (uWSGI) may need to find your C compiler. Make sure you have +‘gcc’ on your system, and then also export this to the CC environment +variable:

+
export CC=gcc
+
+
+

Install requirements with pip

+
pip install -r requirements/local.txt
+
+
+
+
+

NodeJS/npm

+

Install npm. You can do this by installing from nodejs.org, MacPorts, or +Homebrew:

+

MacPorts:

+
sudo port install npm
+
+
+

Homebrew:

+
brew install npm
+
+
+
+
+

Configure Django and Databases

+

In the config/settings directory, there must be a file called +local_untracked.py that sets up databases and a number of other things. +To create and edit this file, start by copying over the template

+
cd config/settings
+cp local_untracked.py.dist local_untracked.py
+
+
+

Edit local_untracked.py. Open the file you created in your favorite editor. The PostgreSQL config section will look something like this:

+
# postgres DB config
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.contrib.gis.db.backends.postgis',
+        'NAME': 'seeddb',
+        'USER': 'seeduser',
+        'PASSWORD': 'seedpass',
+        'HOST': 'localhost',
+        'PORT': '5432',
+    }
+}
+
+
+

You may want to comment out the AWS settings.

+

For Redis, edit the CACHES and CELERY_BROKER_URL values to look like this:

+
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1'
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': CELERY_BROKER_URL,
+    }
+}
+
+
+
+
+

MapQuest API Key

+

Register for a MapQuest API key: +https://developer.mapquest.com/plan_purchase/steps/business_edition/business_edition_free/register

+

Visit the Manage Keys page: +https://developer.mapquest.com/user/me/apps +Either create a new key or use the key initially provided. +Copy the “Consumer Key” into the target organizations MapQuest API Key field under the organization’s settings page or directly within the DB.

+
+
+

Run Django Migrations

+

Change back to the root of the repository. Now run the migration script to set +up the database tables

+
export DJANGO_SETTINGS_MODULE=config.settings.dev
+./manage.py migrate
+
+
+
+
+

Django Admin User

+

You need a Django admin (super) user.

+
./manage.py create_default_user --username=admin@my.org --organization=seedorg --password=badpass
+
+
+

Of course, you need to save this user/password somewhere, since this is what +you will use to login to the SEED website.

+

If you want to do any API testing (and of course you do!), you will need to +add an API KEY for this user. You can do this in postgresql directly:

+
psql seeddb seeduser
+seeddb=> update landing_seeduser set api_key='DEADBEEF' where id=1;
+
+
+

The ‘secret’ key DEADBEEF is hard-coded into the test scripts.

+
+
+

Install Redis

+

You need to manually install Redis for Celery to work.

+

MacPorts:

+
sudo port install redis
+
+
+

Homebrew:

+
brew install redis
+# follow the post install instructions to add to launchagents or
+# call manually with `redis-server`
+
+
+
+
+

Install JavaScript Dependencies

+

The JS dependencies are installed using node.js package management (npm).

+
npm install
+
+
+
+
+

Start the Server

+

You should put the following statement in ~/.bashrc or add it to the +virtualenv post-activation script (e.g., in +~/.virtualenvs/seed/bin/postactivate).

+
export DJANGO_SETTINGS_MODULE=config.settings.dev
+
+
+

The combination of Redis, Celery, and Django have been encapsulated in a +single shell script, which examines existing processes and does not start +duplicate instances:

+
./bin/start-seed.sh
+
+
+

When this script is done, the Django stand-alone server will be running in +the foreground.

+
+
+

Login

+

Open your browser and navigate to http://127.0.0.1:8000

+

Login with the user/password you created before, e.g., admin@my.org and +badpass.

+
+

Note

+

these steps have been combined into a script called start-seed.sh. +The script will also not start Celery or Redis if they already seem +to be running.

+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/3.2.0/translation.html b/docs/code_documentation/3.2.0/translation.html new file mode 100644 index 00000000..fffa98f9 --- /dev/null +++ b/docs/code_documentation/3.2.0/translation.html @@ -0,0 +1,218 @@ + + + + + + + Translating SEED — SEED Platform 3.2.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Translating SEED

+
    +
  1. Update translations on lokalise.

  2. +
  3. Copy lokalise.yml.example to lokalise.yml. Update API token.

  4. +
  5. Install lokalise locally

    +
    brew tap lokalise/cli-2
    +brew install lokalise2
    +
    +
    +
  6. +
+
    +
  1. Run scripts if you have Lokalise CLI installed. If not, see scripts for manual steps.

    +
    script/get_python_translations.sh
    +script/get_angular_translations.sh
    +
    +
    +
  2. +
  3. Uncomment the useMissingTranslationHandlerLog line seed.js to log untranslated strings to the console for review

  4. +
  5. Verify and commit changes

  6. +
+

Note: The lokalize website is the canonical source of data. If you +change the locale files locally, then you need to push them to +lokalize.

+

TL;DR

+

SEED is localized for more than just English, so a little more care is +needed as we add new UI. All translatable strings are held in either +per-language .json files (for Angular-controlled strings, which are +the majority), or .mo files (for strings supplied by Django).

+

At render time, SEED will sniff out the browser’s Accept: header. +Based on that, we choose the right file. The language files themselves +are key->value mappings from a translation “key” to a translated value. +Either Angular or Django will then swap that value into the DOM wherever +it sees the key. If no translation is available, the key remains in the +DOM. (There are some wrinkles with HTML styling and pluralization that +we’ll review below).

+

So, the basic flow on top of any new UI features is now:

+
    +
  1. Tag any user-visible strings in the UI as “translatable.” There are +currently 12 (!) ways in which to do this; see below.

  2. +
  3. Create the translation key at lokalise. We’re using lokalise +because it can smooth over differences in the file formats that +Angular and Django require, and is a nice tool for managing the +process of getting translations done by a native speaker: we can put +up screenshots to clarify how the translated phrase is used, track +translation progress, etc.

  4. +
  5. Get a translation done. As a placeholder, lokalise can provide an +auto-filled translation from Google Translate or a few other +services, but it’s fairly straightforward to order a professional +translation through lokalise.

  6. +
  7. Pull new translation files into the right places in the source tree +and commit them. There are scripts under /scripts to make this +mostly automatic.

  8. +
  9. Visually check that the containing UI looks OK with the translated +string(s). Some languages (e.g., French, German) can be wordy relative +to English and cause UI elements like buttons to expand oddly. Adjust +the layout or adjust the translation as needed.

  10. +
+
+

General philosophies / style

+
+

Don’t go crazy with indirection and interpolation

+

It’s probably better to err on the side of too many keys than to get +clever with interpolation or Angular expressions to avoid +near-duplicates of keys. The aim should be that there is at least one +place where a competent translator can see the whole string at once.

+

Compare:

+
<h2>{$:: inventory_type == 'taxlots' ?
+      translations['INCLUDE_SHARED_TAXLOTS'] :
+      translations['INCLUDE_SHARED']
+
+
+
+
+
+ + +
+
+
+ +
+ +
+

© Copyright 2017, 2024, Alliance for Sustainable Energy, LLC, and other contributors..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/code_documentation/latest/.buildinfo b/docs/code_documentation/latest/.buildinfo index e901f8e1..335398ea 100644 --- a/docs/code_documentation/latest/.buildinfo +++ b/docs/code_documentation/latest/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: f1a17141f94cb2079d56bce92dc65614 +config: 97ffa8cd3d547df50854d2e9c7b7c44f tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/code_documentation/latest/.doctrees/api.doctree b/docs/code_documentation/latest/.doctrees/api.doctree index 22bd2166..572883d8 100644 Binary files a/docs/code_documentation/latest/.doctrees/api.doctree and b/docs/code_documentation/latest/.doctrees/api.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/aws.doctree b/docs/code_documentation/latest/.doctrees/aws.doctree index 69463d90..df526559 100644 Binary files a/docs/code_documentation/latest/.doctrees/aws.doctree and b/docs/code_documentation/latest/.doctrees/aws.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/data_model.doctree b/docs/code_documentation/latest/.doctrees/data_model.doctree index c435f25a..130d53ca 100644 Binary files a/docs/code_documentation/latest/.doctrees/data_model.doctree and b/docs/code_documentation/latest/.doctrees/data_model.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/data_quality.doctree b/docs/code_documentation/latest/.doctrees/data_quality.doctree index 9ffaafe8..19e84b77 100644 Binary files a/docs/code_documentation/latest/.doctrees/data_quality.doctree and b/docs/code_documentation/latest/.doctrees/data_quality.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/deployment.doctree b/docs/code_documentation/latest/.doctrees/deployment.doctree index 8bfeb9e1..1022e318 100644 Binary files a/docs/code_documentation/latest/.doctrees/deployment.doctree and b/docs/code_documentation/latest/.doctrees/deployment.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/developer_resources.doctree b/docs/code_documentation/latest/.doctrees/developer_resources.doctree index 0d5f90d8..0bba63e2 100644 Binary files a/docs/code_documentation/latest/.doctrees/developer_resources.doctree and b/docs/code_documentation/latest/.doctrees/developer_resources.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/docker.doctree b/docs/code_documentation/latest/.doctrees/docker.doctree index ca4b5db4..ba400a47 100644 Binary files a/docs/code_documentation/latest/.doctrees/docker.doctree and b/docs/code_documentation/latest/.doctrees/docker.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/environment.pickle b/docs/code_documentation/latest/.doctrees/environment.pickle index 75839689..806a059d 100644 Binary files a/docs/code_documentation/latest/.doctrees/environment.pickle and b/docs/code_documentation/latest/.doctrees/environment.pickle differ diff --git a/docs/code_documentation/latest/.doctrees/faq.doctree b/docs/code_documentation/latest/.doctrees/faq.doctree index 57f68af3..7f064dd8 100644 Binary files a/docs/code_documentation/latest/.doctrees/faq.doctree and b/docs/code_documentation/latest/.doctrees/faq.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/getting_started.doctree b/docs/code_documentation/latest/.doctrees/getting_started.doctree index 79fe7fbf..1da9e919 100644 Binary files a/docs/code_documentation/latest/.doctrees/getting_started.doctree and b/docs/code_documentation/latest/.doctrees/getting_started.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/help.doctree b/docs/code_documentation/latest/.doctrees/help.doctree index a5bcfdba..ad88a505 100644 Binary files a/docs/code_documentation/latest/.doctrees/help.doctree and b/docs/code_documentation/latest/.doctrees/help.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/index.doctree b/docs/code_documentation/latest/.doctrees/index.doctree index 7c12a70d..f2608346 100644 Binary files a/docs/code_documentation/latest/.doctrees/index.doctree and b/docs/code_documentation/latest/.doctrees/index.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/kubernetes_deployment.doctree b/docs/code_documentation/latest/.doctrees/kubernetes_deployment.doctree index e0fddc6c..d258302b 100644 Binary files a/docs/code_documentation/latest/.doctrees/kubernetes_deployment.doctree and b/docs/code_documentation/latest/.doctrees/kubernetes_deployment.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/license.doctree b/docs/code_documentation/latest/.doctrees/license.doctree index 8a330a27..4d3a65b9 100644 Binary files a/docs/code_documentation/latest/.doctrees/license.doctree and b/docs/code_documentation/latest/.doctrees/license.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/linux.doctree b/docs/code_documentation/latest/.doctrees/linux.doctree index 81d9ecd5..b7ae5c4f 100644 Binary files a/docs/code_documentation/latest/.doctrees/linux.doctree and b/docs/code_documentation/latest/.doctrees/linux.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/mapping.doctree b/docs/code_documentation/latest/.doctrees/mapping.doctree index 6aec3992..b224d875 100644 Binary files a/docs/code_documentation/latest/.doctrees/mapping.doctree and b/docs/code_documentation/latest/.doctrees/mapping.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/matching.doctree b/docs/code_documentation/latest/.doctrees/matching.doctree index b49ecdaa..7d078ee3 100644 Binary files a/docs/code_documentation/latest/.doctrees/matching.doctree and b/docs/code_documentation/latest/.doctrees/matching.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/migrations.doctree b/docs/code_documentation/latest/.doctrees/migrations.doctree index f12f7e2d..f7faabf5 100644 Binary files a/docs/code_documentation/latest/.doctrees/migrations.doctree and b/docs/code_documentation/latest/.doctrees/migrations.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules.doctree b/docs/code_documentation/latest/.doctrees/modules.doctree index 68c71a50..d41b263e 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules.doctree and b/docs/code_documentation/latest/.doctrees/modules.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/config.doctree b/docs/code_documentation/latest/.doctrees/modules/config.doctree index 28692217..83d9b457 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/config.doctree and b/docs/code_documentation/latest/.doctrees/modules/config.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.cleansing.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.cleansing.doctree index 35ce3da8..878d87e7 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.cleansing.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.cleansing.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.data.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.data.doctree index 2d674b63..a39e4aab 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.data.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.data.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.data_importer.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.data_importer.doctree index 2ba3a637..ae55f03b 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.data_importer.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.data_importer.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.doctree index cdc2174c..6fd2ce84 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.features.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.features.doctree index edb7102e..48e0fb6c 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.features.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.features.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.landing.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.landing.doctree index 4d976fae..a55e6d20 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.landing.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.landing.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.landing.management.commands.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.landing.management.commands.doctree index 9b500e38..fceaf89c 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.landing.management.commands.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.landing.management.commands.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.landing.management.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.landing.management.doctree index b8c10cc2..9036aa6a 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.landing.management.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.landing.management.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.lib.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.lib.doctree index c06fac93..813df5a9 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.lib.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.lib.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.lib.mappings.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.lib.mappings.doctree index 8de30900..23770ef3 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.lib.mappings.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.lib.mappings.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.lib.merging.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.lib.merging.doctree index 32eaa228..382008aa 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.lib.merging.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.lib.merging.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.management.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.management.doctree index b45162f3..b0cd06a6 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.management.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.management.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.managers.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.managers.doctree index d82afacc..02c82493 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.managers.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.managers.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.managers.tests.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.managers.tests.doctree index 87dde3c7..387f3d6d 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.managers.tests.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.managers.tests.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.mappings.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.mappings.doctree index c2ca452a..fc03c342 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.mappings.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.mappings.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.models.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.models.doctree index 0a3c4538..5c43477e 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.models.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.models.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.public.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.public.doctree index 9c3ddee8..4b72a5dc 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.public.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.public.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.serializers.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.serializers.doctree index 25e548b6..820cb828 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.serializers.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.serializers.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.templatetags.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.templatetags.doctree index 8e342b74..b131b844 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.templatetags.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.templatetags.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.test_helpers.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.test_helpers.doctree index 4f996441..dbf7d6ad 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.test_helpers.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.test_helpers.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.test_helpers.factory.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.test_helpers.factory.doctree index cdb72b6c..be581475 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.test_helpers.factory.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.test_helpers.factory.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.test_helpers.factory.lib.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.test_helpers.factory.lib.doctree index cdbade7c..53e13ff9 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.test_helpers.factory.lib.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.test_helpers.factory.lib.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.tests.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.tests.doctree index d276042a..8fb78e10 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.tests.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.tests.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.tests.functional.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.tests.functional.doctree index de04b832..8728c0e9 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.tests.functional.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.tests.functional.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.urls.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.urls.doctree index 314f1b4f..d75717df 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.urls.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.urls.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.utils.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.utils.doctree index 4306dee6..1b6b1483 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.utils.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.utils.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/modules/seed.views.doctree b/docs/code_documentation/latest/.doctrees/modules/seed.views.doctree index 63aba7f8..a565b63d 100644 Binary files a/docs/code_documentation/latest/.doctrees/modules/seed.views.doctree and b/docs/code_documentation/latest/.doctrees/modules/seed.views.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/postgres_upgrade.doctree b/docs/code_documentation/latest/.doctrees/postgres_upgrade.doctree new file mode 100644 index 00000000..5f3f4dbc Binary files /dev/null and b/docs/code_documentation/latest/.doctrees/postgres_upgrade.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/setup_docker.doctree b/docs/code_documentation/latest/.doctrees/setup_docker.doctree index 60e23a18..4935b5d9 100644 Binary files a/docs/code_documentation/latest/.doctrees/setup_docker.doctree and b/docs/code_documentation/latest/.doctrees/setup_docker.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/setup_osx.doctree b/docs/code_documentation/latest/.doctrees/setup_osx.doctree index 016ff38e..54f00403 100644 Binary files a/docs/code_documentation/latest/.doctrees/setup_osx.doctree and b/docs/code_documentation/latest/.doctrees/setup_osx.doctree differ diff --git a/docs/code_documentation/latest/.doctrees/translation.doctree b/docs/code_documentation/latest/.doctrees/translation.doctree index 448cdc8c..8b7c03ad 100644 Binary files a/docs/code_documentation/latest/.doctrees/translation.doctree and b/docs/code_documentation/latest/.doctrees/translation.doctree differ diff --git a/docs/code_documentation/latest/_images/case-a.webp b/docs/code_documentation/latest/_images/case-a.webp new file mode 100644 index 00000000..aa4e81d6 Binary files /dev/null and b/docs/code_documentation/latest/_images/case-a.webp differ diff --git a/docs/code_documentation/latest/_images/case-b.webp b/docs/code_documentation/latest/_images/case-b.webp new file mode 100644 index 00000000..93b6ee0b Binary files /dev/null and b/docs/code_documentation/latest/_images/case-b.webp differ diff --git a/docs/code_documentation/latest/_images/case-c.webp b/docs/code_documentation/latest/_images/case-c.webp new file mode 100644 index 00000000..180a613c Binary files /dev/null and b/docs/code_documentation/latest/_images/case-c.webp differ diff --git a/docs/code_documentation/latest/_images/case-d.webp b/docs/code_documentation/latest/_images/case-d.webp new file mode 100644 index 00000000..72213abd Binary files /dev/null and b/docs/code_documentation/latest/_images/case-d.webp differ diff --git a/docs/code_documentation/latest/_images/data-model.webp b/docs/code_documentation/latest/_images/data-model.webp new file mode 100644 index 00000000..3471d8cf Binary files /dev/null and b/docs/code_documentation/latest/_images/data-model.webp differ diff --git a/docs/code_documentation/latest/_sources/aws.rst.txt b/docs/code_documentation/latest/_sources/aws.rst.txt index efe254c7..eccace1f 100644 --- a/docs/code_documentation/latest/_sources/aws.rst.txt +++ b/docs/code_documentation/latest/_sources/aws.rst.txt @@ -161,15 +161,13 @@ settings. .. code-block:: python + CELERY_BROKER_URL = 'redis://seed-core-cache.ntmprk.0001.usw2.cache.amazonaws.com:6379/1' CACHES = { 'default': { - 'BACKEND': 'redis_cache.cache.RedisCache', - 'LOCATION': "seed-core-cache.ntmprk.0001.usw2.cache.amazonaws.com:6379", - 'OPTIONS': { 'DB': 1 }, - 'TIMEOUT': 300 + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, } } - CELERY_BROKER_URL = 'redis://seed-core-cache.ntmprk.0001.usw2.cache.amazonaws.com:6379/1' Running Celery the Background Task Worker ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/code_documentation/latest/_sources/data_model.rst.txt b/docs/code_documentation/latest/_sources/data_model.rst.txt index c7e2ea1f..15650406 100644 --- a/docs/code_documentation/latest/_sources/data_model.rst.txt +++ b/docs/code_documentation/latest/_sources/data_model.rst.txt @@ -1,15 +1,15 @@ Data Model ========== -.. image:: images/case-a.png +.. image:: images/case-a.webp -.. image:: images/case-b.png +.. image:: images/case-b.webp -.. image:: images/case-c.png +.. image:: images/case-c.webp -.. image:: images/case-d.png +.. image:: images/case-d.webp -.. image:: images/data-model.png +.. image:: images/data-model.webp .. todo:: Documentation below is out of state and needs updated. diff --git a/docs/code_documentation/latest/_sources/developer_resources.rst.txt b/docs/code_documentation/latest/_sources/developer_resources.rst.txt index 48484641..e92c7bce 100644 --- a/docs/code_documentation/latest/_sources/developer_resources.rst.txt +++ b/docs/code_documentation/latest/_sources/developer_resources.rst.txt @@ -16,32 +16,15 @@ We use precommit commits for formatting. Set it up locally with pre-commit install -Flake Settings +Ruff Settings ^^^^^^^^^^^^^^ -Flake is used to statically verify code syntax. If the developer is running -flake from the command line, they should ignore the following checks in order -to emulate the same checks as the CI machine. - -+------+--------------------------------------------------+ -| Code | Description | -+======+==================================================+ -| E402 | module level import not at top of file | -+------+--------------------------------------------------+ -| E501 | line too long (82 characters) or max-line = 100 | -+------+--------------------------------------------------+ -| E731 | do not assign a lambda expression, use a def | -+------+--------------------------------------------------+ -| W503 | line break occurred before a binary operator | -+------+--------------------------------------------------+ -| W504 | line break occurred after a binary operator | -+------+--------------------------------------------------+ - -To run flake locally call: +Ruff is used to statically verify code syntax. To run ruff locally call: .. code-block:: bash - tox -e flake8 + tox -e precommit -- ruff + tox -e precommit -- ruff-format Python Type Hints ^^^^^^^^^^^^^^^^^ @@ -195,7 +178,7 @@ renamed `{$` and `$}`. .. code-block:: JavaScript - window.BE.apps.seed = angular.module('BE.seed', ['$interpolateProvider', ($interpolateProvider) => { + window.SEED.apps.seed = angular.module('SEED', ['$interpolateProvider', ($interpolateProvider) => { $interpolateProvider.startSymbol('{$'); $interpolateProvider.endSymbol('$}'); }]); @@ -208,7 +191,7 @@ recommended by http://django-angular.readthedocs.io/en/latest/integration.html#x .. code-block:: JavaScript - window.BE.apps.seed.run(($http, $cookies) => { + window.SEED.apps.seed.run(($http, $cookies) => { $http.defaults.headers.common['X-CSRFToken'] = $cookies['csrftoken']; }); @@ -392,15 +375,14 @@ Run coverage using coverage run manage.py test --settings=config.settings.test coverage report --fail-under=83 -Python compliance uses PEP8 with flake8 +Python compliance uses Ruff .. code-block:: bash - flake8 - # or - tox -e flake8 + tox -e precommit -- ruff + tox -e precommit -- ruff-format -JS Compliance uses ESLint +JavaScript compliance uses ESLint, SCSS compliance uses StyleLint, and HTML compliance uses Prettier .. code-block:: bash diff --git a/docs/code_documentation/latest/_sources/docker.rst.txt b/docs/code_documentation/latest/_sources/docker.rst.txt index 60db652e..00b0a5e4 100644 --- a/docs/code_documentation/latest/_sources/docker.rst.txt +++ b/docs/code_documentation/latest/_sources/docker.rst.txt @@ -89,6 +89,9 @@ Ubuntu server 18.04 or newer with a m5ad.xlarge (if using in Production instance export AWS_SES_REGION_ENDPOINT=email.us-west-2.amazonaws.com export SERVER_EMAIL=user@seed-platform.org + # For custom cookie validity duration + export COOKIE_EXPIRATION=1209600 + * Before launching the first time, make sure the persistent volumes and the backup directory exist. @@ -110,7 +113,7 @@ Ubuntu server 18.04 or newer with a m5ad.xlarge (if using in Production instance Deploying with Docker -^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^^ The preferred way to deploy with Docker is using docker swarm and docker stack. Look at the `deploy.sh script`_ for implementation details. diff --git a/docs/code_documentation/latest/_sources/kubernetes_deployment.rst.txt b/docs/code_documentation/latest/_sources/kubernetes_deployment.rst.txt index a67dc9ab..e39bec96 100644 --- a/docs/code_documentation/latest/_sources/kubernetes_deployment.rst.txt +++ b/docs/code_documentation/latest/_sources/kubernetes_deployment.rst.txt @@ -59,14 +59,14 @@ Helm Helm organizes all of your Kubernetes deployment, service, and volume yml files into "charts" that can be deployed, managed, and published with simple commands. To install Helm: -* `Windows eksctl https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-on-windows`_ +* `Windows eksctl `_ * Mac (with Homebrew) :code:`brew install helm` EKS Control (AWS Specific) ^^^^^^^^^^^^^^^^^^^^^^^^^^ EKSCtl is a command line tool to manage Elastic Kubernetes clusters on AWS. If not using AWS, then disregard this section. -* `Windows `_ +* `Windows eksctl config `_ * Mac (with Homebrew) :code:`brew install eksctl` To launch a cluster on using EKSCts, run the following command in the terminal (assuming adequate permissions for the user). Also make sure to replace items in the `<>` brackets. @@ -124,6 +124,8 @@ This chart contains the deployment specification for the SEED web container. Re value: - name: SEED_ADMIN_USER value: + - name: COOKIE_EXPIRATION + value: 1209600 # Postgres variables - name: POSTGRES_DB value: seed @@ -161,7 +163,7 @@ This chart contains the deployment specification for the Celery container to con value: # must match db-postgres-deployment.yaml and web-celery-deployment.yaml bsyncr-deployment.yaml -************************** +********************** This chart contains the deployment specification for the bsyncr analysis server. Request a NOAA token from `this website `_. .. code-block:: yaml @@ -239,7 +241,7 @@ The command below will restart the pods and re-pull the docker images. Other Resources --------------- -Common kubectl actions can be found `here `_ +Common kubectl actions can be found `on the kubernetes website `_ .. _AWS: https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html diff --git a/docs/code_documentation/latest/_sources/linux.rst.txt b/docs/code_documentation/latest/_sources/linux.rst.txt index 573f0300..d5b97dc1 100644 --- a/docs/code_documentation/latest/_sources/linux.rst.txt +++ b/docs/code_documentation/latest/_sources/linux.rst.txt @@ -32,9 +32,6 @@ Install the following base packages to run SEED: sudo apt install redis-server sudo apt install timescaledb-postgresql-10 postgresql-contrib - # For running selenium/protractor - sudo apt install default-jre - .. note:: postgresql ``>=9.3`` is required to support `JSON Type`_ .. _JSON Type: http://www.postgresql.org/docs/9.3/static/datatype-json.html @@ -143,15 +140,13 @@ settings. .. code-block:: python + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' CACHES = { 'default': { - 'BACKEND': 'redis_cache.cache.RedisCache', - 'LOCATION': '127.0.0.1:6379', - 'OPTIONS': {'DB': 1}, - 'TIMEOUT': 300 + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, } } - CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' Creating the initial user @@ -320,15 +315,13 @@ local_untracked.py # config for local storage backend DOMAIN_URLCONFS = {'default': 'config.urls'} + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' CACHES = { 'default': { - 'BACKEND': 'redis_cache.cache.RedisCache', - 'LOCATION': '127.0.0.1:6379', - 'OPTIONS': {'DB': 1}, - 'TIMEOUT': 300 + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, } } - CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' # SMTP config EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' diff --git a/docs/code_documentation/latest/_sources/migrations.rst.txt b/docs/code_documentation/latest/_sources/migrations.rst.txt index cd321bd2..af857674 100644 --- a/docs/code_documentation/latest/_sources/migrations.rst.txt +++ b/docs/code_documentation/latest/_sources/migrations.rst.txt @@ -15,28 +15,19 @@ Docker then you will not need to do this. CELERY_RESULT_BACKEND = CELERY_BROKER_URL If you are using a password, then in your local_untracked.py configuration, add the password to -the CACHES configuration option. Your final configuration should look like the following in your +the CELERY_BROKER_URL. Your final configuration should look like the following in your local_untracked.py file .. code-block:: python + CELERY_BROKER_URL = 'redis://:password@127.0.0.1:6379/1' CACHES = { 'default': { - 'BACKEND': 'redis_cache.cache.RedisCache', - 'LOCATION': "127.0.0.1:6379", - 'OPTIONS': { - 'DB': 1, - 'PASSWORD': 'password', - }, - 'TIMEOUT': 300 + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, } } - CELERY_BROKER_URL = 'redis://:%s@%s/%s' % ( - CACHES['default']['OPTIONS']['PASSWORD'], - CACHES['default']['LOCATION'], - CACHES['default']['OPTIONS']['DB'] - ) CELERY_RESULT_BACKEND = CELERY_BROKER_URL CELERY_TASK_DEFAULT_QUEUE = 'seed-local' CELERY_TASK_QUEUES = ( @@ -47,17 +38,44 @@ local_untracked.py file ), ) +Version 3.2.0 +------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 3.1.0 +------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 3.0.0 +------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 3.0.0-beta.0 +-------------------- +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. + +Version 2.22.0 +-------------- +- Run ``./manage.py migrate``. +- There is a Redis dependency update in this release that requires users and deployments to modify their settings' ``CACHES`` config. + #. Update your dependencies with pip install -r requirements/base.txt + #. Update the CACHES BACKEND property to ``django_redis.cache.RedisCache`` + #. Update the CACHES LOCATION property to match the redis-py native URL notation for connection strings, including the redis protocol and database number. e.g. ``redis://localhost:6379/1`` + + Since the CELERY_BROKER_URL setting must also be in the same format, it may be helpful to configure that setting first and then reference it in the caches LOCATION parameter. +- See the `PR for an example migration `_. + Version 2.21.0 -------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. Version 2.20.1 -------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. Version 2.20.0 -------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. - There is a single long running migration related to importing census tract disadvantaged community data. This migration should take around 7 minutes to complete. Version 2.19.0 @@ -78,35 +96,35 @@ Version 2.19.0 Version 2.18.1 -------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. Version 2.18.0 -------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. Version 2.17.4 -------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. Version 2.17.3 -------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. Version 2.17.2 -------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. Version 2.17.1 -------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. Version 2.17.0 -------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. Version 2.16.0 -------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. Version 2.15.2 -------------- @@ -118,41 +136,41 @@ Version 2.15.1 Version 2.15.0 -------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. Version 2.14.0 -------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. Version 2.13.0 -------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. Version 2.12.0 - 2.12.4 ----------------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. Version 2.11.0 -------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. Version 2.10.0 -------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. Version 2.7.3 to 2.9.0 ---------------------- -- The migrations should work without additional support. Simply run `./manage.py migrate`. +- The migrations should work without additional support. Simply run ``./manage.py migrate``. Version 2.7.2 ------------- -- The migrations should work without additional support. Simply run `./manage.py migrate`. There are no manual migrations needed. +- The migrations should work without additional support. Simply run ``./manage.py migrate``. There are no manual migrations needed. - Note the **Important Note** in Version 2.7.1 migration below which may require the need to run a "fake" migration Version 2.7.1 ------------- -- There are no special migrations needed for this version. Simply run `./manage.py migrate`. +- There are no special migrations needed for this version. Simply run ``./manage.py migrate``. **Important Note:** @@ -178,12 +196,12 @@ Version 2.7.0 - This migration will run a match/merge/pair/link method upon migration. Make sure to run the migration manually and not inside of the docker container using the ./deploy.sh script. - Make sure to backup the database before performing the migration. -- Run `./manage.py migrate`. +- Run ``./manage.py migrate``. Version 2.6.1 ------------- -- The migrations should work without additional support. Simply run `./manage.py migrate`. There are no manual migrations needed for the 2.6.1 release. +- The migrations should work without additional support. Simply run ``./manage.py migrate``. There are no manual migrations needed for the 2.6.1 release. Version 2.6.0 @@ -223,14 +241,12 @@ Max OSX Version 2.5.2 ------------- -- There are no manual migrations that are needed. The `./manage.py migrate` command may take awhile -to run since the migration requires the recalculation of all the normalized addresses to parse -bldg correct and to cast the result as a string and not a bytestring. +- There are no manual migrations that are needed. The ``./manage.py migrate`` command may take awhile to run since the migration requires the recalculation of all the normalized addresses to parse bldg correct and to cast the result as a string and not a bytestring. Version 2.5.1 ------------- -- The migrations should work by simply running `./manage.py migrate`. There are no manual migrations needed for the 2.5.1 release. +- The migrations should work by simply running ``./manage.py migrate``. There are no manual migrations needed for the 2.5.1 release. Version 2.5.0 ------------- diff --git a/docs/code_documentation/latest/_sources/modules/seed.rst.txt b/docs/code_documentation/latest/_sources/modules/seed.rst.txt index a8c3166a..771c0324 100644 --- a/docs/code_documentation/latest/_sources/modules/seed.rst.txt +++ b/docs/code_documentation/latest/_sources/modules/seed.rst.txt @@ -80,14 +80,6 @@ Token Generator :undoc-members: :show-inheritance: -URLs ----- - -.. automodule:: seed.urls - :members: - :undoc-members: - :show-inheritance: - Utils ----- diff --git a/docs/code_documentation/latest/_sources/modules/seed.utils.rst.txt b/docs/code_documentation/latest/_sources/modules/seed.utils.rst.txt index 813f849f..27fd9b6c 100644 --- a/docs/code_documentation/latest/_sources/modules/seed.utils.rst.txt +++ b/docs/code_documentation/latest/_sources/modules/seed.utils.rst.txt @@ -20,22 +20,6 @@ Buildings :undoc-members: :show-inheritance: -Constants ---------- - -.. automodule:: seed.utils.constants - :members: - :undoc-members: - :show-inheritance: - -Mappings --------- - -.. automodule:: seed.utils.mapping - :members: - :undoc-members: - :show-inheritance: - Organizations ------------- diff --git a/docs/code_documentation/latest/_sources/postgres_upgrade.rst.txt b/docs/code_documentation/latest/_sources/postgres_upgrade.rst.txt new file mode 100644 index 00000000..85ae58f5 --- /dev/null +++ b/docs/code_documentation/latest/_sources/postgres_upgrade.rst.txt @@ -0,0 +1,51 @@ +Upgrade a SEED database from Postgres 12 to Postgres 16 +======================================================= + +Assumptions +----------- + +- This process assumes that you're currently using Postgres 12.7 with TimescaleDB 2.3.0 from ``timescale/timescaledb-postgis:2.3.0-pg12`` or ``timescale/timescaledb-postgis:latest-pg12`` +- This also assumes that you have a directory in the host filesystem, e.g. ``~/share``, that is bind mounted to ``/share`` in your existing database container + +1. Create a dump of the current database + +.. code-block:: bash + + docker exec seed_postgres pg_dump -d seed -U seeduser -Fc -f /share/seed-pg12.dump + +2. Create a temporary Postgres 13 container using the Docker image ``timescale/timescaledb-ha:pg13.14-ts2.14.2-oss`` + +.. code-block:: bash + + docker run --rm --name=seed-pg13 -e POSTGRES_DB=seed -e POSTGRES_USER=seeduser -e POSTGRES_PASSWORD=password -v ~/share:/share timescale/timescaledb-ha:pg13.14-ts2.14.2-oss + +Once the container has finished initializing, open a separate shell + +.. code-block:: bash + + docker exec -it seed-pg13 bash + psql -d seed -U seeduser -c "CREATE EXTENSION postgis;" + psql -d seed -U seeduser -c "DROP EXTENSION timescaledb;" + psql -d seed -U seeduser -c "CREATE EXTENSION timescaledb WITH VERSION '2.3.0';" + psql -d seed -U seeduser -c "SELECT timescaledb_pre_restore();" + pg_restore -d seed -U seeduser /share/seed-pg12.dump + psql -d seed -U seeduser -c "SELECT timescaledb_post_restore();" + psql -d seed -U seeduser -c "ALTER EXTENSION timescaledb UPDATE;" + pg_dump -d seed -U seeduser -Fc -f /share/seed-pg13.dump + +3. Start the new, permanent Postgres 16 container using the Docker image ``timescale/timescaledb-ha:pg16.2-ts2.14.2-oss`` + +.. code-block:: bash + + docker run -d --name=seed-pg16 -e POSTGRES_DB=seed -e POSTGRES_USER=seeduser -e POSTGRES_PASSWORD=password -v ~/share:/share timescale/timescaledb-ha:pg16.2-ts2.14.2-oss + +Once the container has finished initializing, open a separate shell + +.. code-block:: bash + + docker exec -it seed-pg16 bash + psql -d seed -U seeduser -c "CREATE EXTENSION postgis;" + psql -d seed -U seeduser -c "SELECT timescaledb_pre_restore();" + pg_restore -d seed -U seeduser /share/seed-pg13.dump + psql -d seed -U seeduser -c "SELECT timescaledb_post_restore();" + pg_dump -d seed -U seeduser -Fc -f /share/seed-pg16.dump diff --git a/docs/code_documentation/latest/_sources/setup_docker.rst.txt b/docs/code_documentation/latest/_sources/setup_docker.rst.txt index 708d8b52..3f020794 100644 --- a/docs/code_documentation/latest/_sources/setup_docker.rst.txt +++ b/docs/code_documentation/latest/_sources/setup_docker.rst.txt @@ -31,7 +31,7 @@ Building and Running Containers for Non-Development .. code-block:: bash - docker-compose build + docker compose build `Be Patient`_ ... If the containers build successfully, then start the containers @@ -39,7 +39,7 @@ Building and Running Containers for Non-Development docker volume create --name=seed_pgdata docker volume create --name=seed_media - docker-compose up + docker compose up **Note that you may need to build the containers a couple times for everything to converge** @@ -76,7 +76,7 @@ Build docker volume create --name=seed_media # build the images - docker-compose -f docker-compose.yml -f docker-compose.dev.yml build + docker compose -f docker-compose.yml -f docker-compose.dev.yml build Running the Server ^^^^^^^^^^^^^^^^^^ @@ -87,9 +87,9 @@ overwrite the database or celery configuration! .. code-block:: bash - docker-compose -f docker-compose.yml -f docker-compose.dev.yml up + docker compose -f docker-compose.yml -f docker-compose.dev.yml up -If the server doesn't start successfully, and :code:`docker-compose logs` doesn't help, +If the server doesn't start successfully, and :code:`docker compose logs` doesn't help, the django development server probably failed to start due to an error in your config or code. Unfortunately docker/django logging doesn't appear to work when the container is first started. Just try running the server yourself with docker exec, and see what the output is. @@ -107,15 +107,15 @@ For example, if you want to create a separate volume for storing a production ba .. code-block:: bash docker volume create --name=seed_pgdata_prod - SEED_DB_VOLUME=seed_pgdata_prod docker-compose -f docker-compose.yml -f docker-compose.dev.yml up + SEED_DB_VOLUME=seed_pgdata_prod docker compose -f docker-compose.yml -f docker-compose.dev.yml up -NOTE: you'll need to run :code:`docker-compose down` to remove the containers before you +NOTE: you'll need to run :code:`docker compose down` to remove the containers before you can restart the containers connecting to different volumes. Running Tests ^^^^^^^^^^^^^ -While the containers are running (i.e., after running the docker-compose up command), use docker exec to run tests in the web container: +While the containers are running (i.e., after running the docker compose up command), use docker exec to run tests in the web container: .. code-block:: bash diff --git a/docs/code_documentation/latest/_sources/setup_osx.rst.txt b/docs/code_documentation/latest/_sources/setup_osx.rst.txt index 486eff08..9bc64be9 100644 --- a/docs/code_documentation/latest/_sources/setup_osx.rst.txt +++ b/docs/code_documentation/latest/_sources/setup_osx.rst.txt @@ -270,15 +270,13 @@ For Redis, edit the `CACHES` and `CELERY_BROKER_URL` values to look like this: .. code-block:: python + CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' CACHES = { 'default': { - 'BACKEND': 'redis_cache.cache.RedisCache', - 'LOCATION': "127.0.0.1:6379", - 'OPTIONS': {'DB': 1}, - 'TIMEOUT': 300 + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': CELERY_BROKER_URL, } } - CELERY_BROKER_URL = 'redis://127.0.0.1:6379/1' MapQuest API Key ---------------- diff --git a/docs/code_documentation/latest/_static/_sphinx_javascript_frameworks_compat.js b/docs/code_documentation/latest/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/docs/code_documentation/latest/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/docs/code_documentation/latest/_static/basic.css b/docs/code_documentation/latest/_static/basic.css index aa9df316..30fee9d0 100644 --- a/docs/code_documentation/latest/_static/basic.css +++ b/docs/code_documentation/latest/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -222,7 +222,7 @@ table.modindextable td { /* -- general body styles --------------------------------------------------- */ div.body { - min-width: 450px; + min-width: 360px; max-width: 800px; } @@ -237,14 +237,8 @@ a.headerlink { visibility: hidden; } -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; +a:visited { + color: #551A8B; } h1:hover > a.headerlink, @@ -335,12 +329,16 @@ p.sidebar-title { font-weight: bold; } +nav.contents, +aside.topic, div.admonition, div.topic, blockquote { clear: left; } /* -- topics ---------------------------------------------------------------- */ +nav.contents, +aside.topic, div.topic { border: 1px solid #ccc; padding: 7px; @@ -379,6 +377,8 @@ div.body p.centered { div.sidebar > :last-child, aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, div.topic > :last-child, div.admonition > :last-child { margin-bottom: 0; @@ -386,6 +386,8 @@ div.admonition > :last-child { div.sidebar::after, aside.sidebar::after, +nav.contents::after, +aside.topic::after, div.topic::after, div.admonition::after, blockquote::after { @@ -428,10 +430,6 @@ table.docutils td, table.docutils th { border-bottom: 1px solid #aaa; } -table.footnote td, table.footnote th { - border: 0 !important; -} - th { text-align: left; padding-right: 5px; @@ -615,19 +613,26 @@ ul.simple p { margin-bottom: 0; } -dl.footnote > dt, -dl.citation > dt { +aside.footnote > span, +div.citation > span { float: left; - margin-right: 0.5em; } - -dl.footnote > dd, -dl.citation > dd { +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { margin-bottom: 0em; } - -dl.footnote > dd:after, -dl.citation > dd:after { +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { content: ""; clear: both; } @@ -644,10 +649,6 @@ dl.field-list > dt { padding-right: 5px; } -dl.field-list > dt:after { - content: ":"; -} - dl.field-list > dd { padding-left: 0.5em; margin-top: 0em; @@ -673,6 +674,16 @@ dd { margin-left: 30px; } +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + dl > dd:last-child, dl > dd:last-child > :last-child { margin-bottom: 0; @@ -731,8 +742,9 @@ dl.glossary dt { .classifier:before { font-style: normal; - margin: 0.5em; + margin: 0 0.5em; content: ":"; + display: inline-block; } abbr, acronym { @@ -740,6 +752,14 @@ abbr, acronym { cursor: help; } +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + /* -- code displays --------------------------------------------------------- */ pre { @@ -756,6 +776,7 @@ span.pre { -ms-hyphens: none; -webkit-hyphens: none; hyphens: none; + white-space: nowrap; } div[class*="highlight-"] { @@ -819,7 +840,7 @@ div.code-block-caption code { table.highlighttable td.linenos, span.linenos, -div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */ +div.highlight span.gp { /* gp: Generic.Prompt */ user-select: none; -webkit-user-select: text; /* Safari fallback only */ -webkit-user-select: none; /* Chrome/Safari */ diff --git a/docs/code_documentation/latest/_static/css/badge_only.css b/docs/code_documentation/latest/_static/css/badge_only.css index 3c33cef5..c718cee4 100644 --- a/docs/code_documentation/latest/_static/css/badge_only.css +++ b/docs/code_documentation/latest/_static/css/badge_only.css @@ -1 +1 @@ -.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../fonts/fontawesome-webfont.eot");src:url("../fonts/fontawesome-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff") format("woff"),url("../fonts/fontawesome-webfont.ttf") format("truetype"),url("../fonts/fontawesome-webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/docs/code_documentation/latest/_static/css/fonts/Roboto-Slab-Bold.woff b/docs/code_documentation/latest/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/docs/code_documentation/latest/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/docs/code_documentation/latest/_static/css/fonts/Roboto-Slab-Bold.woff2 b/docs/code_documentation/latest/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/docs/code_documentation/latest/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/docs/code_documentation/latest/_static/css/fonts/Roboto-Slab-Regular.woff b/docs/code_documentation/latest/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/docs/code_documentation/latest/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/docs/code_documentation/latest/_static/css/fonts/Roboto-Slab-Regular.woff2 b/docs/code_documentation/latest/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/docs/code_documentation/latest/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/docs/code_documentation/latest/_static/css/fonts/fontawesome-webfont.eot b/docs/code_documentation/latest/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/docs/code_documentation/latest/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/docs/code_documentation/latest/_static/css/fonts/fontawesome-webfont.svg b/docs/code_documentation/latest/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/docs/code_documentation/latest/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/code_documentation/latest/_static/css/fonts/fontawesome-webfont.ttf b/docs/code_documentation/latest/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/docs/code_documentation/latest/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/docs/code_documentation/latest/_static/css/fonts/fontawesome-webfont.woff b/docs/code_documentation/latest/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/docs/code_documentation/latest/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/docs/code_documentation/latest/_static/css/fonts/fontawesome-webfont.woff2 b/docs/code_documentation/latest/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/docs/code_documentation/latest/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/docs/code_documentation/latest/_static/css/fonts/lato-bold-italic.woff b/docs/code_documentation/latest/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/docs/code_documentation/latest/_static/css/fonts/lato-bold-italic.woff differ diff --git a/docs/code_documentation/latest/_static/css/fonts/lato-bold-italic.woff2 b/docs/code_documentation/latest/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/docs/code_documentation/latest/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/docs/code_documentation/latest/_static/css/fonts/lato-bold.woff b/docs/code_documentation/latest/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/docs/code_documentation/latest/_static/css/fonts/lato-bold.woff differ diff --git a/docs/code_documentation/latest/_static/css/fonts/lato-bold.woff2 b/docs/code_documentation/latest/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/docs/code_documentation/latest/_static/css/fonts/lato-bold.woff2 differ diff --git a/docs/code_documentation/latest/_static/css/fonts/lato-normal-italic.woff b/docs/code_documentation/latest/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/docs/code_documentation/latest/_static/css/fonts/lato-normal-italic.woff differ diff --git a/docs/code_documentation/latest/_static/css/fonts/lato-normal-italic.woff2 b/docs/code_documentation/latest/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/docs/code_documentation/latest/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/docs/code_documentation/latest/_static/css/fonts/lato-normal.woff b/docs/code_documentation/latest/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/docs/code_documentation/latest/_static/css/fonts/lato-normal.woff differ diff --git a/docs/code_documentation/latest/_static/css/fonts/lato-normal.woff2 b/docs/code_documentation/latest/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/docs/code_documentation/latest/_static/css/fonts/lato-normal.woff2 differ diff --git a/docs/code_documentation/latest/_static/css/theme.css b/docs/code_documentation/latest/_static/css/theme.css index aed8cef0..19a446a0 100644 --- a/docs/code_documentation/latest/_static/css/theme.css +++ b/docs/code_documentation/latest/_static/css/theme.css @@ -1,6 +1,4 @@ -/* sphinx_rtd_theme version 0.4.3 | MIT license */ -/* Built 20190212 16:02 */ -*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,.rst-content code,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:.5cm}p,h2,.rst-content .toctree-wrapper p.caption,h3{orphans:3;widows:3}h2,.rst-content .toctree-wrapper p.caption,h3{page-break-after:avoid}}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content .code-block-caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*! +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.7.0");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"),url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.wy-menu-vertical li span.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-left.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-left.toctree-expand,.rst-content .fa-pull-left.admonition-title,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content dl dt .fa-pull-left.headerlink,.rst-content p.caption .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.rst-content code.download span.fa-pull-left:first-child,.fa-pull-left.icon{margin-right:.3em}.fa.fa-pull-right,.wy-menu-vertical li span.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-right.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-right.toctree-expand,.rst-content .fa-pull-right.admonition-title,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content dl dt .fa-pull-right.headerlink,.rst-content p.caption .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.rst-content code.download span.fa-pull-right:first-child,.fa-pull-right.icon{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.wy-menu-vertical li span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li.current>a span.pull-left.toctree-expand,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.rst-content p.caption .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content .code-block-caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.rst-content code.download span.pull-left:first-child,.pull-left.icon{margin-right:.3em}.fa.pull-right,.wy-menu-vertical li span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li.current>a span.pull-right.toctree-expand,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.rst-content p.caption .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content .code-block-caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.rst-content code.download span.pull-right:first-child,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li span.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:""}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-signing:before,.fa-sign-language:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-vcard:before,.fa-address-card:before{content:""}.fa-vcard-o:before,.fa-address-card-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content .code-block-caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .rst-content p.caption .headerlink,.rst-content p.caption a .headerlink,a .rst-content table>caption .headerlink,.rst-content table>caption a .headerlink,a .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption a .headerlink,a .rst-content tt.download span:first-child,.rst-content tt.download a span:first-child,a .rst-content code.download span:first-child,.rst-content code.download a span:first-child,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .btn span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.btn .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .rst-content p.caption .headerlink,.rst-content p.caption .btn .headerlink,.btn .rst-content table>caption .headerlink,.rst-content table>caption .btn .headerlink,.btn .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .btn .headerlink,.btn .rst-content tt.download span:first-child,.rst-content tt.download .btn span:first-child,.btn .rst-content code.download span:first-child,.rst-content code.download .btn span:first-child,.btn .icon,.nav .fa,.nav .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand,.nav .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .rst-content p.caption .headerlink,.rst-content p.caption .nav .headerlink,.nav .rst-content table>caption .headerlink,.rst-content table>caption .nav .headerlink,.nav .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .nav .headerlink,.nav .rst-content tt.download span:first-child,.rst-content tt.download .nav span:first-child,.nav .rst-content code.download span:first-child,.rst-content code.download .nav span:first-child,.nav .icon{display:inline}.btn .fa.fa-large,.btn .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .btn span.fa-large.toctree-expand,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .btn .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.btn .rst-content .code-block-caption .fa-large.headerlink,.rst-content .code-block-caption .btn .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .btn span.fa-large:first-child,.btn .rst-content code.download span.fa-large:first-child,.rst-content code.download .btn span.fa-large:first-child,.btn .fa-large.icon,.nav .fa.fa-large,.nav .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.fa-large.toctree-expand,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .nav .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.nav .rst-content .code-block-caption .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.nav .rst-content code.download span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.nav .fa-large.icon{line-height:.9em}.btn .fa.fa-spin,.btn .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .btn span.fa-spin.toctree-expand,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .btn .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.btn .rst-content .code-block-caption .fa-spin.headerlink,.rst-content .code-block-caption .btn .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .btn span.fa-spin:first-child,.btn .rst-content code.download span.fa-spin:first-child,.rst-content code.download .btn span.fa-spin:first-child,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.fa-spin.toctree-expand,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .nav .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.nav .rst-content .code-block-caption .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.nav .rst-content code.download span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.wy-menu-vertical li span.btn.toctree-expand:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.rst-content p.caption .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.rst-content code.download span.btn:first-child:before,.btn.icon:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.wy-menu-vertical li span.btn.toctree-expand:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content p.caption .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.rst-content code.download span.btn:first-child:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li .btn-mini span.toctree-expand:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .rst-content p.caption .headerlink:before,.rst-content p.caption .btn-mini .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.rst-content tt.download .btn-mini span:first-child:before,.btn-mini .rst-content code.download span:first-child:before,.rst-content code.download .btn-mini span:first-child:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.admonition{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo,.rst-content .wy-alert-warning.admonition{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title,.rst-content .wy-alert-warning.admonition .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.admonition{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.admonition{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.admonition{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a{color:#2980B9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27AE60}.wy-tray-container li.wy-tray-item-info{background:#2980B9}.wy-tray-container li.wy-tray-item-warning{background:#E67E22}.wy-tray-container li.wy-tray-item-danger{background:#E74C3C}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width: 768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27AE60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:visited{color:#fff}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980B9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27AE60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#E74C3C !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#E67E22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980B9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9B59B6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980B9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980B9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 .3125em 0;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#E74C3C}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{float:left;display:block;margin-right:2.3576515979%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.3576515979%;width:48.821174201%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.3576515979%;width:31.7615656014%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:6px 0 0 0;font-size:90%}.wy-control-no-input{display:inline-block;margin:6px 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type="datetime-local"]{padding:.34375em .625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129FEA}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#E74C3C;border:1px solid #E74C3C}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#E74C3C}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#E74C3C}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type="radio"][disabled],input[type="checkbox"][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{position:absolute;content:"";display:block;left:0;top:0;width:36px;height:12px;border-radius:4px;background:#ccc;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{position:absolute;content:"";display:block;width:18px;height:18px;border-radius:4px;background:#999;left:-3px;top:-3px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27AE60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#E74C3C}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #E74C3C}.wy-control-group.wy-control-group-error textarea{border:solid 1px #E74C3C}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27AE60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#E74C3C}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#E67E22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980B9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:.3em;display:block}.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px}.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980B9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9B59B6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#E67E22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980B9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27AE60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#E74C3C !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,.rst-content .toctree-wrapper p.caption,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2,.rst-content .toctree-wrapper p.caption{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}code,.rst-content tt,.rst-content code{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;color:#E74C3C;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{margin-bottom:0}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{list-style:decimal}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.arabic li p:last-child,article ol li p:last-child{margin-bottom:0}.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{margin-bottom:0}.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:before,.wy-breadcrumbs:after{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs li code,.wy-breadcrumbs li .rst-content tt,.rst-content .wy-breadcrumbs li tt{padding:5px;border:none;background:none}.wy-breadcrumbs li code.literal,.wy-breadcrumbs li .rst-content tt.literal,.rst-content .wy-breadcrumbs li tt.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#3a7ca8;height:32px;display:inline-block;line-height:32px;padding:0 1.618em;margin:12px 0 0 0;display:block;font-weight:bold;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li code,.wy-menu-vertical li .rst-content tt,.rst-content .wy-menu-vertical li tt{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:.8em;line-height:1.6em;color:#4d4d4d}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.on a:hover span.toctree-expand,.wy-menu-vertical li.current>a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand{display:block;font-size:.8em;line-height:1.6em;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a{color:#404040}.wy-menu-vertical li.toctree-l1.current li.toctree-l2>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>ul{display:none}.wy-menu-vertical li.toctree-l1.current li.toctree-l2.current>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current>ul{display:block}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{display:block;background:#c9c9c9;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l2 span.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3{font-size:.9em}.wy-menu-vertical li.toctree-l3.current>a{background:#bdbdbd;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{display:block;background:#bdbdbd;padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l3 span.toctree-expand{color:#969696}.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover span.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980B9;cursor:pointer;color:#fff}.wy-menu-vertical a:active span.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980B9;text-align:center;padding:.809em;display:block;color:#fcfcfc;margin-bottom:.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em auto;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-side-nav-search>a img.logo,.wy-side-nav-search .wy-dropdown>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search>a.icon img.logo,.wy-side-nav-search .wy-dropdown>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:normal;color:rgba(255,255,255,0.3)}.wy-nav .wy-menu-vertical header{color:#2980B9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980B9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980B9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:gray}footer p{margin-bottom:12px}footer span.commit code,footer span.commit .rst-content tt,.rst-content footer span.commit tt{padding:0px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;font-size:1em;background:none;border:none;color:gray}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{width:100%}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:before,.rst-breadcrumbs-buttons:after{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-side-scroll{width:auto}.wy-side-nav-search{width:auto}.wy-menu.wy-menu-vertical{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1100px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,footer,.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content p.caption .headerlink,.rst-content p.caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content img{max-width:100%;height:auto}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure p.caption{font-style:italic}.rst-content div.figure p:last-child.caption{margin-bottom:0px}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img,.rst-content .section>a>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px 12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;display:block;overflow:auto}.rst-content pre.literal-block,.rst-content div[class^='highlight']{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px 0}.rst-content pre.literal-block div[class^='highlight'],.rst-content div[class^='highlight'] div[class^='highlight']{padding:0px;border:none;margin:0}.rst-content div[class^='highlight'] td.code{width:100%}.rst-content .linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;display:block;overflow:auto}.rst-content div[class^='highlight'] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content pre.literal-block,.rst-content div[class^='highlight'] pre,.rst-content .linenodiv pre{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;font-size:12px;line-height:1.4}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^='highlight'],.rst-content div[class^='highlight'] pre{white-space:pre-wrap}}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last,.rst-content .admonition .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .section ol p:last-child,.rst-content .section ul p:last-child{margin-bottom:24px}.rst-content .line-block{margin-left:0px;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content .toctree-wrapper p.caption .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink{visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content .toctree-wrapper p.caption .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after,.rst-content p.caption .headerlink:after,.rst-content table>caption .headerlink:after,.rst-content .code-block-caption .headerlink:after{content:"";font-family:FontAwesome}.rst-content h1:hover .headerlink:after,.rst-content h2:hover .headerlink:after,.rst-content .toctree-wrapper p.caption:hover .headerlink:after,.rst-content h3:hover .headerlink:after,.rst-content h4:hover .headerlink:after,.rst-content h5:hover .headerlink:after,.rst-content h6:hover .headerlink:after,.rst-content dl dt:hover .headerlink:after,.rst-content p.caption:hover .headerlink:after,.rst-content table>caption:hover .headerlink:after,.rst-content .code-block-caption:hover .headerlink:after{visibility:visible}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#F1C40F;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:baseline;position:relative;top:-0.4em;line-height:0;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:gray}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.docutils.citation tt,.rst-content table.docutils.citation code,.rst-content table.docutils.footnote tt,.rst-content table.docutils.footnote code{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}.rst-content table.docutils td .last,.rst-content table.docutils td .last :last-child{margin-bottom:0}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content tt,.rst-content tt,.rst-content code{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;padding:2px 5px}.rst-content tt big,.rst-content tt em,.rst-content tt big,.rst-content code big,.rst-content tt em,.rst-content code em{font-size:100% !important;line-height:normal}.rst-content tt.literal,.rst-content tt.literal,.rst-content code.literal{color:#E74C3C}.rst-content tt.xref,a .rst-content tt,.rst-content tt.xref,.rst-content code.xref,a .rst-content tt,a .rst-content code{font-weight:bold;color:#404040}.rst-content pre,.rst-content kbd,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace}.rst-content a tt,.rst-content a tt,.rst-content a code{color:#2980B9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold;margin-bottom:12px}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980B9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:#555}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) code{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) code.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27AE60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:bold}.rst-content tt.download,.rst-content code.download{background:inherit;padding:inherit;font-weight:normal;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content tt.download span:first-child,.rst-content code.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040}.math{text-align:center}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-regular.eot");src:url("../fonts/Lato/lato-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-regular.woff2") format("woff2"),url("../fonts/Lato/lato-regular.woff") format("woff"),url("../fonts/Lato/lato-regular.ttf") format("truetype");font-weight:400;font-style:normal}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-bold.eot");src:url("../fonts/Lato/lato-bold.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-bold.woff2") format("woff2"),url("../fonts/Lato/lato-bold.woff") format("woff"),url("../fonts/Lato/lato-bold.ttf") format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-bolditalic.eot");src:url("../fonts/Lato/lato-bolditalic.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-bolditalic.woff2") format("woff2"),url("../fonts/Lato/lato-bolditalic.woff") format("woff"),url("../fonts/Lato/lato-bolditalic.ttf") format("truetype");font-weight:700;font-style:italic}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-italic.eot");src:url("../fonts/Lato/lato-italic.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-italic.woff2") format("woff2"),url("../fonts/Lato/lato-italic.woff") format("woff"),url("../fonts/Lato/lato-italic.ttf") format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:400;src:url("../fonts/RobotoSlab/roboto-slab.eot");src:url("../fonts/RobotoSlab/roboto-slab-v7-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.woff2") format("woff2"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.woff") format("woff"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.ttf") format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:700;src:url("../fonts/RobotoSlab/roboto-slab-v7-bold.eot");src:url("../fonts/RobotoSlab/roboto-slab-v7-bold.eot?#iefix") format("embedded-opentype"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.woff2") format("woff2"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.woff") format("woff"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.ttf") format("truetype")} + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs/code_documentation/latest/_static/doctools.js b/docs/code_documentation/latest/_static/doctools.js index 61ac9d26..d06a71d7 100644 --- a/docs/code_documentation/latest/_static/doctools.js +++ b/docs/code_documentation/latest/_static/doctools.js @@ -2,320 +2,155 @@ * doctools.js * ~~~~~~~~~~~ * - * Sphinx JavaScript utilities for all documentation. + * Base JavaScript utilities for all Sphinx HTML documentation. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); } - return result; }; -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - /** * Small JavaScript module for the documentation. */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { - this.initOnKeyListeners(); - } +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); }, /** * i18n support */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } }, - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; }, - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; }, /** - * add context elements like header anchor links + * helper function to focus on search bar */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); }, /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + * Initialise the domain index toggle buttons */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, + }; - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); }, - initOnKeyListeners: function() { - $(document).keydown(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box, textarea, dropdown or button - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' - && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey - && !event.shiftKey) { - switch (event.keyCode) { - case 37: // left - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); } - case 39: // right - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); } + break; } } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } }); - } + }, }; // quick alias for translations -_ = Documentation.gettext; +const _ = Documentation.gettext; -$(document).ready(function() { - Documentation.init(); -}); +_ready(Documentation.init); diff --git a/docs/code_documentation/latest/_static/documentation_options.js b/docs/code_documentation/latest/_static/documentation_options.js index c857016b..b1611d5c 100644 --- a/docs/code_documentation/latest/_static/documentation_options.js +++ b/docs/code_documentation/latest/_static/documentation_options.js @@ -1,12 +1,13 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '2.21.0', - LANGUAGE: 'None', +const DOCUMENTATION_OPTIONS = { + VERSION: '3.2.0', + LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', FILE_SUFFIX: '.html', LINK_SUFFIX: '.html', HAS_SOURCE: true, SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, }; \ No newline at end of file diff --git a/docs/code_documentation/latest/_static/fonts/Inconsolata-Bold.ttf b/docs/code_documentation/latest/_static/fonts/Inconsolata-Bold.ttf deleted file mode 100644 index 809c1f58..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/Inconsolata-Bold.ttf and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/Inconsolata-Regular.ttf b/docs/code_documentation/latest/_static/fonts/Inconsolata-Regular.ttf deleted file mode 100644 index fc981ce7..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/Inconsolata-Regular.ttf and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/Inconsolata.ttf b/docs/code_documentation/latest/_static/fonts/Inconsolata.ttf deleted file mode 100644 index 4b8a36d2..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/Inconsolata.ttf and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/Lato-Bold.ttf b/docs/code_documentation/latest/_static/fonts/Lato-Bold.ttf deleted file mode 100644 index 1d23c706..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/Lato-Bold.ttf and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/Lato-Regular.ttf b/docs/code_documentation/latest/_static/fonts/Lato-Regular.ttf deleted file mode 100644 index 0f3d0f83..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/Lato-Regular.ttf and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/Lato/lato-bold.eot b/docs/code_documentation/latest/_static/fonts/Lato/lato-bold.eot deleted file mode 100644 index 3361183a..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/Lato/lato-bold.eot and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/Lato/lato-bold.ttf b/docs/code_documentation/latest/_static/fonts/Lato/lato-bold.ttf deleted file mode 100644 index 29f691d5..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/Lato/lato-bold.ttf and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/Lato/lato-bolditalic.eot b/docs/code_documentation/latest/_static/fonts/Lato/lato-bolditalic.eot deleted file mode 100644 index 3d415493..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/Lato/lato-bolditalic.eot and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/Lato/lato-bolditalic.ttf b/docs/code_documentation/latest/_static/fonts/Lato/lato-bolditalic.ttf deleted file mode 100644 index f402040b..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/Lato/lato-bolditalic.ttf and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/Lato/lato-italic.eot b/docs/code_documentation/latest/_static/fonts/Lato/lato-italic.eot deleted file mode 100644 index 3f826421..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/Lato/lato-italic.eot and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/Lato/lato-italic.ttf b/docs/code_documentation/latest/_static/fonts/Lato/lato-italic.ttf deleted file mode 100644 index b4bfc9b2..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/Lato/lato-italic.ttf and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/Lato/lato-regular.eot b/docs/code_documentation/latest/_static/fonts/Lato/lato-regular.eot deleted file mode 100644 index 11e3f2a5..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/Lato/lato-regular.eot and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/Lato/lato-regular.ttf b/docs/code_documentation/latest/_static/fonts/Lato/lato-regular.ttf deleted file mode 100644 index 74decd9e..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/Lato/lato-regular.ttf and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/RobotoSlab-Bold.ttf b/docs/code_documentation/latest/_static/fonts/RobotoSlab-Bold.ttf deleted file mode 100644 index df5d1df2..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/RobotoSlab-Bold.ttf and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/RobotoSlab-Regular.ttf b/docs/code_documentation/latest/_static/fonts/RobotoSlab-Regular.ttf deleted file mode 100644 index eb52a790..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/RobotoSlab-Regular.ttf and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot deleted file mode 100644 index 79dc8efe..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf deleted file mode 100644 index df5d1df2..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot deleted file mode 100644 index 2f7ca78a..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot and /dev/null differ diff --git a/docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf deleted file mode 100644 index eb52a790..00000000 Binary files a/docs/code_documentation/latest/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf and /dev/null differ diff --git a/docs/code_documentation/latest/_static/graphviz.css b/docs/code_documentation/latest/_static/graphviz.css index b340734c..8d81c02e 100644 --- a/docs/code_documentation/latest/_static/graphviz.css +++ b/docs/code_documentation/latest/_static/graphviz.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- graphviz extension. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ diff --git a/docs/code_documentation/latest/_static/jquery-3.5.1.js b/docs/code_documentation/latest/_static/jquery-3.5.1.js deleted file mode 100644 index 50937333..00000000 --- a/docs/code_documentation/latest/_static/jquery-3.5.1.js +++ /dev/null @@ -1,10872 +0,0 @@ -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.5.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - - - - + - - - - - + + + + + + - - - +
- -
- - -