From 83c4922fd52ed61dbb2fcc4735fbad554ea6a868 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Sun, 17 Oct 2021 06:56:19 -0500 Subject: [PATCH 01/88] Add initial NLP app, spaCy libraries, nlp entity script Begin to incorporate NLP (Natural Language Processing) into GovReady-Q-private. Create a Django app 'nlp' for NLP-related code. Create a draft Django admin command script for running spaCy entity identifiation on test data. Add spaCy and other NLP libraries, assets to Docker build. --- .../images/backend/docker-entrypoint.sh | 3 + nlp/__init__.py | 0 nlp/admin.py | 3 + nlp/apps.py | 5 + nlp/data/mock_ssp_data.xlsx | Bin 0 -> 22120 bytes .../commands/CandidateEntity_pandas.py | 216 ++++ nlp/migrations/__init__.py | 0 nlp/models.py | 3 + nlp/tests.py | 3 + nlp/urls.py | 35 + nlp/views.py | 68 ++ requirements.in | 11 + requirements.txt | 943 ++++++++++++++---- siteapp/settings_application.py | 1 + siteapp/urls.py | 3 + templates/nlp/index.html | 69 ++ 16 files changed, 1156 insertions(+), 207 deletions(-) create mode 100644 nlp/__init__.py create mode 100644 nlp/admin.py create mode 100644 nlp/apps.py create mode 100644 nlp/data/mock_ssp_data.xlsx create mode 100644 nlp/management/commands/CandidateEntity_pandas.py create mode 100644 nlp/migrations/__init__.py create mode 100644 nlp/models.py create mode 100644 nlp/tests.py create mode 100644 nlp/urls.py create mode 100644 nlp/views.py create mode 100644 templates/nlp/index.html diff --git a/dev_env/docker/images/backend/docker-entrypoint.sh b/dev_env/docker/images/backend/docker-entrypoint.sh index df0ea2c03..a8fea3b2f 100755 --- a/dev_env/docker/images/backend/docker-entrypoint.sh +++ b/dev_env/docker/images/backend/docker-entrypoint.sh @@ -21,6 +21,9 @@ ln -sf /usr/src/app/dev_env/docker/environment.json /usr/src/app/local/environme echo "[ + ] Running checks" pip3 install -r requirements.txt --ignore-installed +echo "[ + ] Installing NLP tools" +python3 -m spacy download en_core_web_sm + echo "[ + ] Migrating Database" ./manage.py migrate diff --git a/nlp/__init__.py b/nlp/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/nlp/admin.py b/nlp/admin.py new file mode 100644 index 000000000..8c38f3f3d --- /dev/null +++ b/nlp/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/nlp/apps.py b/nlp/apps.py new file mode 100644 index 000000000..e58332435 --- /dev/null +++ b/nlp/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class NlpConfig(AppConfig): + name = 'nlp' diff --git a/nlp/data/mock_ssp_data.xlsx b/nlp/data/mock_ssp_data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..af338af6fb587063423baa0d583593f2a4f6ee07 GIT binary patch literal 22120 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.*)/controls/selected/export/xacta/xlsx$', views.controls_selected_export_xacta_xslx, name="controls_selected"), + + # Catalogs + # url(r'^$', views.catalogs), + # url(r'^catalogs$', views.catalogs), + # url(r'^catalogs/(?P.*)/$', views.catalog), + + +] diff --git a/nlp/views.py b/nlp/views.py new file mode 100644 index 000000000..c3a4984f6 --- /dev/null +++ b/nlp/views.py @@ -0,0 +1,68 @@ +import functools +import logging +import operator +import pathlib +import shutil +import tempfile +from collections import defaultdict +from datetime import datetime +from itertools import groupby +from pathlib import PurePath +from urllib.parse import quote, urlunparse +from uuid import uuid4 + +import rtyaml +import trestle.oscal.component as trestlecomponent +import trestle.oscal.ssp as trestlessp +from django.conf import settings +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.core.exceptions import ObjectDoesNotExist +from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger +from django.db.models import Q +from django.db.models.functions import Lower +from django.http import Http404, HttpResponse, HttpResponseRedirect, HttpResponseForbidden, JsonResponse, \ + HttpResponseNotAllowed +from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse +from django.utils.text import slugify +from django.views import View +from django.views.generic import ListView +from django.urls import reverse +from jsonschema import validate +from jsonschema.exceptions import SchemaError, ValidationError as SchemaValidationError +from urllib.parse import quote + +from api.siteapp.serializers.tags import SimpleTagSerializer +from guidedmodules.models import Task, Module, AppVersion, AppSource +from siteapp.model_mixins.tags import TagView +from simple_history.utils import update_change_reason + +from siteapp.models import Project, Organization, Tag +from siteapp.settings import GOVREADY_URL +from system_settings.models import SystemSettings +from .models import * +from .utilities import * + +logging.basicConfig() +import structlog +from structlog import get_logger +from structlog.stdlib import LoggerFactory +structlog.configure(logger_factory=LoggerFactory()) +structlog.configure(processors=[structlog.processors.JSONRenderer()]) +logger = get_logger() + +# Create your views here. + +def index(request): + """Index page for controls""" + + # Get catalog + # catalog = Catalog() + + context = { + # "catalog": catalog, + "data": None, + } + return render(request, "nlp/index.html", context) + diff --git a/requirements.in b/requirements.in index 27fb964ac..1a0732397 100644 --- a/requirements.in +++ b/requirements.in @@ -54,6 +54,17 @@ djangorestframework-recursive==0.1.2 # ISC License drf-nested-routers==0.93.3 # Apache License 2.0 mozilla-django-oidc==1.2.4 # Mozilla Public License Version 2.0 +# NLP +dataset # MIT License +click # BSD License (BSD-3-Clause) +# more-itertools # MIT License +simplejson # Academic Free License (AFL), MIT License +pandas # BSD License (BSD-3-Clause) +spacy # MIT License +Unidecode # GNU General Public License +wordcloud # MIT License + + # Python Packages Developed by GovReady and/or Josh rtyaml # CC0 email-validator # CC0 diff --git a/requirements.txt b/requirements.txt index 8965b738a..854381a22 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,10 @@ -anyio==3.3.3 \ - --hash=sha256:56ceaeed2877723578b1341f4f68c29081db189cfb40a97d1922b9513f6d7db6 \ - --hash=sha256:8eccec339cb4a856c94a75d50fc1d451faf32a05ef406be462e2efc59c9838b0 +alembic==1.7.4 \ + --hash=sha256:9d33f3ff1488c4bfab1e1a6dfebbf085e8a8e1a3e047a43ad29ad1f67f012a1d \ + --hash=sha256:e3cab9e59778b3b6726bb2da9ced451c6622d558199fd3ef914f3b1e8f4ef704 + # via dataset +anyio==3.3.4 \ + --hash=sha256:4fd09a25ab7fa01d34512b7249e366cd10358cdafc95022c7ff8c8f8a5026d66 \ + --hash=sha256:67da67b5b21f96b9d3d65daa6ea99f5d5282cb09f50eb4456f8fb51dffefc3ff # via httpcore appdirs==1.4.4 \ --hash=sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41 \ @@ -14,12 +18,20 @@ asgiref==3.4.1 \ --hash=sha256:4ef1ab46b484e3c706329cedeff284a5d40824200638503f5768edb6de7d58e9 \ --hash=sha256:ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214 # via django +async-generator==1.10 \ + --hash=sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b \ + --hash=sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144 + # via + # trio + # trio-websocket attrs==19.3.0 \ --hash=sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c \ --hash=sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72 # via # compliance-trestle # jsonschema + # outcome + # trio backports.zoneinfo==0.2.1 \ --hash=sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf \ --hash=sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328 \ @@ -38,6 +50,10 @@ backports.zoneinfo==0.2.1 \ --hash=sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac \ --hash=sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2 # via tzlocal +banal==1.0.6 \ + --hash=sha256:2fe02c9305f53168441948f4a03dfbfa2eacc73db30db4a93309083cb0e250a5 \ + --hash=sha256:877aacb16b17f8fa4fd29a7c44515c5a23dc1a7b26078bc41dd34829117d85e1 + # via dataset bandit==1.7.0 \ --hash=sha256:216be4d044209fa06cf2a3e51b319769a51be8318140659719aa7a115c35ed07 \ --hash=sha256:8a4c7415254d75df8ff3c3b15cfe9042ecee628a1e40b44c15a98890fbfc2608 @@ -58,58 +74,88 @@ black==21.9b0 \ blinker==1.4 \ --hash=sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6 # via nplusone +blis==0.7.4 \ + --hash=sha256:168fd7bd763ebe529aa25a066d3a6b89f4c3f492f6297f881df6942741b95787 \ + --hash=sha256:4222bbc7b9c47bc3cf6f36f2241862c1512ca7ebac3828267a2e05ef6c47fc54 \ + --hash=sha256:445e4838b809e99677f5c0982fb9af320f0d91328fb28c8097e5f1173c4df9d6 \ + --hash=sha256:5b403deb2ad5515e1edb3c0867bccb5b974b461f24283d9219a3a761fd6dacc6 \ + --hash=sha256:5c1a2023f7d8431daa8d87d32f539bb23e1a009500c37f9eba0ac7b3f20f73eb \ + --hash=sha256:5ecddc4c6daf80558154b091db0a9839bb15dbe65d2906a543a73b93fbce4f73 \ + --hash=sha256:6814991b3e3193db4f9b2417174c6f24b9c0197409d864fa7628583bd2df1f0f \ + --hash=sha256:78a8e0ee72a42c3b2f5b9114500a781119995f76fa6c21d4b02c6fb9c21df2cc \ + --hash=sha256:7daa615a97d4f28db0f332b710bfe1900b15d0c25841c6d727965e4fd91e09cf \ + --hash=sha256:94890b2296f1449baa56aede46627ea7fc8de11c788f9c261ee38c2eb4a2cc7d \ + --hash=sha256:9f9b829480c12fc834549306821e5c51cb28b216ca5f88c5b2cfedbeb9daf67d \ + --hash=sha256:c2d8064217c326dd9a0dcbae294ffe8557263e2a00d76101ffa222b9c9d9c62d \ + --hash=sha256:d717b5dea407aac89a646908e7d9849105abab9c88a539c120518c200f899f4e + # via + # spacy + # thinc +catalogue==2.0.6 \ + --hash=sha256:336a35603f447167042ef504114d6befa46688f03f4c14dabdc633a44587b245 \ + --hash=sha256:34ebb5cd2b98f7fa7421fa0eead3b84e577243532509b3fa8cd04abcc9f61d3c + # via + # spacy + # srsly + # thinc certifi==2021.10.8 \ --hash=sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872 \ --hash=sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569 # via # httpx # requests -cffi==1.14.6 \ - --hash=sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d \ - --hash=sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771 \ - --hash=sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872 \ - --hash=sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c \ - --hash=sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc \ - --hash=sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762 \ - --hash=sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202 \ - --hash=sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5 \ - --hash=sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548 \ - --hash=sha256:48916e459c54c4a70e52745639f1db524542140433599e13911b2f329834276a \ - --hash=sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f \ - --hash=sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20 \ - --hash=sha256:57e555a9feb4a8460415f1aac331a2dc833b1115284f7ded7278b54afc5bd218 \ - --hash=sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c \ - --hash=sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e \ - --hash=sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56 \ - --hash=sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224 \ - --hash=sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a \ - --hash=sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2 \ - --hash=sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a \ - --hash=sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819 \ - --hash=sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346 \ - --hash=sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b \ - --hash=sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e \ - --hash=sha256:aedb15f0a5a5949ecb129a82b72b19df97bbbca024081ed2ef88bd5c0a610534 \ - --hash=sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb \ - --hash=sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0 \ - --hash=sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156 \ - --hash=sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd \ - --hash=sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87 \ - --hash=sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc \ - --hash=sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195 \ - --hash=sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33 \ - --hash=sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f \ - --hash=sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d \ - --hash=sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd \ - --hash=sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728 \ - --hash=sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7 \ - --hash=sha256:f0010c6f9d1a4011e429109fda55a225921e3206e7f62a0c22a35344bfd13cca \ - --hash=sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99 \ - --hash=sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf \ - --hash=sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e \ - --hash=sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c \ - --hash=sha256:f627688813d0a4140153ff532537fbe4afea5a3dffce1f9deb7f91f848a832b5 \ - --hash=sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69 + # urllib3 +cffi==1.15.0 \ + --hash=sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3 \ + --hash=sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2 \ + --hash=sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636 \ + --hash=sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20 \ + --hash=sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728 \ + --hash=sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27 \ + --hash=sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66 \ + --hash=sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443 \ + --hash=sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0 \ + --hash=sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7 \ + --hash=sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39 \ + --hash=sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605 \ + --hash=sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a \ + --hash=sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37 \ + --hash=sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029 \ + --hash=sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139 \ + --hash=sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc \ + --hash=sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df \ + --hash=sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14 \ + --hash=sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880 \ + --hash=sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2 \ + --hash=sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a \ + --hash=sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e \ + --hash=sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474 \ + --hash=sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024 \ + --hash=sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8 \ + --hash=sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0 \ + --hash=sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e \ + --hash=sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a \ + --hash=sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e \ + --hash=sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032 \ + --hash=sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6 \ + --hash=sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e \ + --hash=sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b \ + --hash=sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e \ + --hash=sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954 \ + --hash=sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962 \ + --hash=sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c \ + --hash=sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4 \ + --hash=sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55 \ + --hash=sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962 \ + --hash=sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023 \ + --hash=sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c \ + --hash=sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6 \ + --hash=sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8 \ + --hash=sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382 \ + --hash=sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7 \ + --hash=sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc \ + --hash=sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997 \ + --hash=sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796 # via # bcrypt # cryptography @@ -128,8 +174,10 @@ click==8.0.3 \ --hash=sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3 \ --hash=sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b # via + # -r requirements.in # black # safety + # typer commonmark==0.9.1 \ --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 @@ -216,6 +264,7 @@ cryptography==35.0.0 \ # paramiko # pyjwt # pyopenssl + # urllib3 cssselect==1.1.0 \ --hash=sha256:f612ee47b749c877ebae5bb77035d8f4202c6ad0f0fc1271b3c18ad6c4468ecf \ --hash=sha256:f95f8dedd925fd8f54edb3d2dfb44c190d9d18512377d3c1e2388d16126879bc @@ -224,10 +273,36 @@ cssutils==2.3.0 \ --hash=sha256:0cf1f6086b020dee18048ff3999339499f725934017ef9ae2cd5bb77f9ab5f46 \ --hash=sha256:b2d3b16047caae82e5c590036935bafa1b621cf45c2f38885af4be4838f0fd00 # via inlinestyler +cycler==0.10.0 \ + --hash=sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d \ + --hash=sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8 + # via matplotlib +cymem==2.0.5 \ + --hash=sha256:01d3ea159f7a3f3192b1e800ed8207dac7586794d903a153198b9ea317f144bc \ + --hash=sha256:190e15d9cf2c3bde60ae37bddbae6568a36044dc4a326d84081a5fa08818eee0 \ + --hash=sha256:1f0eb9b3d03623dcfc746cf8bff0663b0e347f4aea759965c8932087a0307ee9 \ + --hash=sha256:3d48902d7441645835fefc7832df49feb5362c7300d182475b63a01d25ae44ef \ + --hash=sha256:4bd023c2477198b39b660c2a6b0242880649765ecee8461688a57fd4afd2bfc0 \ + --hash=sha256:734d82d0d03c2ceb929bc1744c04dbe0a105e68a4947c8406056a36f86c41830 \ + --hash=sha256:8ea57e6923f40eb51012352161bb5707c14a5a5ce901ff72021e59df06221655 \ + --hash=sha256:9d72d69f7a62a280199c3aa7bc550685c47d6d0689b2d299e6492253b86d2437 \ + --hash=sha256:a440d63577fcdc9c528c9cc026b7b4f8648193bac462bc0596c9eac10f9fba62 \ + --hash=sha256:ce1e81c1d031f56b67bac2136e73b4512cbc794706cd570178972d54ba6115d8 \ + --hash=sha256:d19f68b90411e02ab33b1654118337f96f41c13a3cd00c4f44f7abed2bc712e7 \ + --hash=sha256:d307f7f6230d861a938837cae4b855226b6845a21c010242a15e9ce6853856cd \ + --hash=sha256:f2167c9959fcd639b95d51fa5efaa7c61eef8d686cb75a25412a914f428ce980 + # via + # preshed + # spacy + # thinc datamodel-code-generator[http]==0.11.14 \ --hash=sha256:5de6b51b5775852c9afdc346fc84ba72adcd5607a3c3e0ad28c9dcb626e5f4d2 \ --hash=sha256:dc3f8b2b09b7a3e154a8e6ca4fd6c7af1b1370deb07b92586e4bff28ed1f11a3 # via compliance-trestle +dataset==1.5.0 \ + --hash=sha256:0c3e3226b1bbd79d6499892d78af0242d9dff114fd1174a0826243db8adeef60 \ + --hash=sha256:bd51e889b0342411d187e07c9a64153c5b398c7a92cc4fbb449f83e858855d04 + # via -r requirements.in defusedxml==0.7.1 \ --hash=sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69 \ --hash=sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61 @@ -299,9 +374,9 @@ django-html-emailer==0.1.0 \ django-json-widget==1.1.1 \ --hash=sha256:ec948a4c379687f9c854748ba540fdbeb1b1730846ca953f186818521de7e696 # via -r requirements.in -django-model-utils==4.1.1 \ - --hash=sha256:eb5dd05ef7d7ce6bc79cae54ea7c4a221f6f81e2aad7722933aee66489e7264b \ - --hash=sha256:ef7c440024e797796a3811432abdd2be8b5225ae64ef346f8bfc6de7d8e5d73c +django-model-utils==4.2.0 \ + --hash=sha256:a768a25c80514e0ad4e4a6f9c02c44498985f36c5dfdea47b5b1e8cf994beba6 \ + --hash=sha256:e7a95e102f9c9653427eadab980d5d59e1dea972913b9c9e01ac37f86bba0ddf # via django-notifications-hq django-notifications-hq==1.6 \ --hash=sha256:debeb71b7076b08487b40bf07664d1cc43b9977c4480bbc969b30236dda7a461 \ @@ -477,7 +552,9 @@ greenlet==1.1.2 \ --hash=sha256:f9d29ca8a77117315101425ec7ec2a47a22ccf59f5593378fc4077ac5b754fce \ --hash=sha256:fa877ca7f6b48054f847b61d6fa7bed5cebb663ebc55e018fda12db09dcc664c \ --hash=sha256:fdcec0b8399108577ec290f55551d926d9a1fa6cad45882093a7a07ac5ec147b - # via gevent + # via + # gevent + # sqlalchemy gunicorn==20.1.0 \ --hash=sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e \ --hash=sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8 @@ -485,7 +562,9 @@ gunicorn==20.1.0 \ h11==0.12.0 \ --hash=sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6 \ --hash=sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042 - # via httpcore + # via + # httpcore + # wsproto html5lib==1.1 \ --hash=sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d \ --hash=sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f @@ -494,18 +573,20 @@ httpcore==0.13.7 \ --hash=sha256:036f960468759e633574d7c121afba48af6419615d36ab8ede979f1ad6276fa3 \ --hash=sha256:369aa481b014cf046f7067fddd67d00560f2f00426e79569d99cb11245134af0 # via httpx -httpx==0.19.0 \ - --hash=sha256:92ecd2c00c688b529eda11cedb15161eaf02dee9116712f621c70d9a40b2cdd0 \ - --hash=sha256:9bd728a6c5ec0a9e243932a9983d57d3cc4a87bb4f554e1360fce407f78f9435 +httpx==0.20.0 \ + --hash=sha256:09606d630f070d07f9ff28104fbcea429ea0014c1e89ac90b4d8de8286c40e7b \ + --hash=sha256:33af5aad9bdc82ef1fc89219c1e36f5693bf9cd0ebe330884df563445682c0f8 # via datamodel-code-generator -idna==3.2 \ - --hash=sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a \ - --hash=sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3 +idna==3.3 \ + --hash=sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff \ + --hash=sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d # via # anyio # email-validator # requests # rfc3986 + # trio + # urllib3 ilcli==0.3.2 \ --hash=sha256:8a56b053836f8b0e1bbbdda884288d18dc966bd8e90fdf9b340914dba625cd7f \ --hash=sha256:dfb7d2da49c63ef92c5a589eb5f765d073d7ea83275c3dd2aea8ae5cbe4c5be2 @@ -513,11 +594,23 @@ ilcli==0.3.2 \ importlib-metadata==1.7.0 \ --hash=sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83 \ --hash=sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070 - # via -r requirements.in + # via + # -r requirements.in + # alembic + # argcomplete + # click + # cssutils + # django-bootstrap3 + # importlib-resources + # jsonschema + # sqlalchemy + # stevedore importlib-resources==1.5.0 \ --hash=sha256:6f87df66833e1942667108628ec48900e02a4ab4ad850e25fbf07cb17cf734ca \ --hash=sha256:85dc0b9b325ff78c8bef2e4ff42616094e16b98ebd5e3b50fe7e2f0bbcdcde49 - # via -r requirements.in + # via + # -r requirements.in + # alembic inflect==5.3.0 \ --hash=sha256:41a23f6788962e9775e40e2ecfb1d6455d02de315022afeedd3c5dc070019d73 \ --hash=sha256:42560be16af702a21d43d59427f276b5aed79efb1ded9b713468c081f4353d10 @@ -549,6 +642,7 @@ jinja2==2.11.3 \ # -r requirements.in # coreschema # datamodel-code-generator + # spacy josepy==1.10.0 \ --hash=sha256:0c91623287db4cde4fe77c38be6bc9122faf137f78680978aa3e96bb0f10f2e8 \ --hash=sha256:e9bcaf605411cadaec04841ae2d5f77ebb178b7b6df7c9aed1d97399ac18685b @@ -570,6 +664,52 @@ jsonschema==4.1.0 \ # -r requirements.in # openapi-schema-validator # openapi-spec-validator +kiwisolver==1.3.2 \ + --hash=sha256:0007840186bacfaa0aba4466d5890334ea5938e0bb7e28078a0eb0e63b5b59d5 \ + --hash=sha256:19554bd8d54cf41139f376753af1a644b63c9ca93f8f72009d50a2080f870f77 \ + --hash=sha256:1d45d1c74f88b9f41062716c727f78f2a59a5476ecbe74956fafb423c5c87a76 \ + --hash=sha256:1d819553730d3c2724582124aee8a03c846ec4362ded1034c16fb3ef309264e6 \ + --hash=sha256:2210f28778c7d2ee13f3c2a20a3a22db889e75f4ec13a21072eabb5693801e84 \ + --hash=sha256:22521219ca739654a296eea6d4367703558fba16f98688bd8ce65abff36eaa84 \ + --hash=sha256:25405f88a37c5f5bcba01c6e350086d65e7465fd1caaf986333d2a045045a223 \ + --hash=sha256:2b65bd35f3e06a47b5c30ea99e0c2b88f72c6476eedaf8cfbc8e66adb5479dcf \ + --hash=sha256:2ddb500a2808c100e72c075cbb00bf32e62763c82b6a882d403f01a119e3f402 \ + --hash=sha256:2f8f6c8f4f1cff93ca5058d6ec5f0efda922ecb3f4c5fb76181f327decff98b8 \ + --hash=sha256:30fa008c172355c7768159983a7270cb23838c4d7db73d6c0f6b60dde0d432c6 \ + --hash=sha256:3dbb3cea20b4af4f49f84cffaf45dd5f88e8594d18568e0225e6ad9dec0e7967 \ + --hash=sha256:4116ba9a58109ed5e4cb315bdcbff9838f3159d099ba5259c7c7fb77f8537492 \ + --hash=sha256:44e6adf67577dbdfa2d9f06db9fbc5639afefdb5bf2b4dfec25c3a7fbc619536 \ + --hash=sha256:5326ddfacbe51abf9469fe668944bc2e399181a2158cb5d45e1d40856b2a0589 \ + --hash=sha256:70adc3658138bc77a36ce769f5f183169bc0a2906a4f61f09673f7181255ac9b \ + --hash=sha256:72be6ebb4e92520b9726d7146bc9c9b277513a57a38efcf66db0620aec0097e0 \ + --hash=sha256:7843b1624d6ccca403a610d1277f7c28ad184c5aa88a1750c1a999754e65b439 \ + --hash=sha256:7ba5a1041480c6e0a8b11a9544d53562abc2d19220bfa14133e0cdd9967e97af \ + --hash=sha256:80efd202108c3a4150e042b269f7c78643420cc232a0a771743bb96b742f838f \ + --hash=sha256:82f49c5a79d3839bc8f38cb5f4bfc87e15f04cbafa5fbd12fb32c941cb529cfb \ + --hash=sha256:83d2c9db5dfc537d0171e32de160461230eb14663299b7e6d18ca6dca21e4977 \ + --hash=sha256:8d93a1095f83e908fc253f2fb569c2711414c0bfd451cab580466465b235b470 \ + --hash=sha256:8dc3d842fa41a33fe83d9f5c66c0cc1f28756530cd89944b63b072281e852031 \ + --hash=sha256:9661a04ca3c950a8ac8c47f53cbc0b530bce1b52f516a1e87b7736fec24bfff0 \ + --hash=sha256:a498bcd005e8a3fedd0022bb30ee0ad92728154a8798b703f394484452550507 \ + --hash=sha256:a7a4cf5bbdc861987a7745aed7a536c6405256853c94abc9f3287c3fa401b174 \ + --hash=sha256:b5074fb09429f2b7bc82b6fb4be8645dcbac14e592128beeff5461dcde0af09f \ + --hash=sha256:b6a5431940f28b6de123de42f0eb47b84a073ee3c3345dc109ad550a3307dd28 \ + --hash=sha256:ba677bcaff9429fd1bf01648ad0901cea56c0d068df383d5f5856d88221fe75b \ + --hash=sha256:bcadb05c3d4794eb9eee1dddf1c24215c92fb7b55a80beae7a60530a91060560 \ + --hash=sha256:bf7eb45d14fc036514c09554bf983f2a72323254912ed0c3c8e697b62c4c158f \ + --hash=sha256:c358721aebd40c243894298f685a19eb0491a5c3e0b923b9f887ef1193ddf829 \ + --hash=sha256:c4550a359c5157aaf8507e6820d98682872b9100ce7607f8aa070b4b8af6c298 \ + --hash=sha256:c6572c2dab23c86a14e82c245473d45b4c515314f1f859e92608dcafbd2f19b8 \ + --hash=sha256:cba430db673c29376135e695c6e2501c44c256a81495da849e85d1793ee975ad \ + --hash=sha256:dedc71c8eb9c5096037766390172c34fb86ef048b8e8958b4e484b9e505d66bc \ + --hash=sha256:e6f5eb2f53fac7d408a45fbcdeda7224b1cfff64919d0f95473420a931347ae9 \ + --hash=sha256:ec2eba188c1906b05b9b49ae55aae4efd8150c61ba450e6721f64620c50b59eb \ + --hash=sha256:ee040a7de8d295dbd261ef2d6d3192f13e2b08ec4a954de34a6fb8ff6422e24c \ + --hash=sha256:eedd3b59190885d1ebdf6c5e0ca56828beb1949b4dfe6e5d0256a461429ac386 \ + --hash=sha256:f441422bb313ab25de7b3dbfd388e790eceb76ce01a18199ec4944b369017009 \ + --hash=sha256:f8eb7b6716f5b50e9c06207a14172cf2de201e41912ebe732846c02c830455b9 \ + --hash=sha256:fc4453705b81d03568d5b808ad8f09c77c47534f6ac2e72e733f9ca4714aa75c + # via matplotlib lxml==4.6.3 \ --hash=sha256:079f3ae844f38982d156efce585bc540c16a926d4436712cf4baee0cce487a3d \ --hash=sha256:0fbcf5565ac01dff87cbfc0ff323515c823081c5777a9fc7703ff58388c258c3 \ @@ -622,6 +762,10 @@ lxml==4.6.3 \ # via # inlinestyler # parsel +mako==1.1.5 \ + --hash=sha256:169fa52af22a91900d852e937400e79f535496191c63712e3b9fda5a9bed6fc3 \ + --hash=sha256:6804ee66a7f6a6416910463b00d76a7b25194cd27f1918500c5bd7be2a088a23 + # via alembic markupsafe==1.1.1 \ --hash=sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473 \ --hash=sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161 \ @@ -679,6 +823,30 @@ markupsafe==1.1.1 \ # -r requirements.in # compliance-trestle # jinja2 + # mako +matplotlib==3.4.3 \ + --hash=sha256:01c9de93a2ca0d128c9064f23709362e7fefb34910c7c9e0b8ab0de8258d5eda \ + --hash=sha256:41b6e307458988891fcdea2d8ecf84a8c92d53f84190aa32da65f9505546e684 \ + --hash=sha256:48e1e0859b54d5f2e29bb78ca179fd59b971c6ceb29977fb52735bfd280eb0f5 \ + --hash=sha256:54a026055d5f8614f184e588f6e29064019a0aa8448450214c0b60926d62d919 \ + --hash=sha256:556965514b259204637c360d213de28d43a1f4aed1eca15596ce83f768c5a56f \ + --hash=sha256:5c988bb43414c7c2b0a31bd5187b4d27fd625c080371b463a6d422047df78913 \ + --hash=sha256:6a724e3a48a54b8b6e7c4ae38cd3d07084508fa47c410c8757e9db9791421838 \ + --hash=sha256:6be8df61b1626e1a142c57e065405e869e9429b4a6dab4a324757d0dc4d42235 \ + --hash=sha256:844a7b0233e4ff7fba57e90b8799edaa40b9e31e300b8d5efc350937fa8b1bea \ + --hash=sha256:85f0c9cf724715e75243a7b3087cf4a3de056b55e05d4d76cc58d610d62894f3 \ + --hash=sha256:a78a3b51f29448c7f4d4575e561f6b0dbb8d01c13c2046ab6c5220eb25c06506 \ + --hash=sha256:b884715a59fec9ad3b6048ecf3860f3b2ce965e676ef52593d6fa29abcf7d330 \ + --hash=sha256:b8b53f336a4688cfce615887505d7e41fd79b3594bf21dd300531a4f5b4f746a \ + --hash=sha256:c70b6311dda3e27672f1bf48851a0de816d1ca6aaf3d49365fbdd8e959b33d2b \ + --hash=sha256:ebfb01a65c3f5d53a8c2a8133fec2b5221281c053d944ae81ff5822a68266617 \ + --hash=sha256:eeb1859efe7754b1460e1d4991bbd4a60a56f366bc422ef3a9c5ae05f0bc70b5 \ + --hash=sha256:f15edcb0629a0801738925fe27070480f446fcaa15de65946ff946ad99a59a40 \ + --hash=sha256:f1c5efc278d996af8a251b2ce0b07bbeccb821f25c8c9846bdcb00ffc7f158aa \ + --hash=sha256:f72657f1596199dc1e4e7a10f52a4784ead8a711f4e5b59bea95bdb97cf0e4fd \ + --hash=sha256:fc4f526dfdb31c9bd6b8ca06bf9fab663ca12f3ec9cdf4496fb44bc680140318 \ + --hash=sha256:fcd6f1954943c0c192bfbebbac263f839d7055409f1173f80d8b11a224d236da + # via wordcloud mistune==2.0.0rc1 \ --hash=sha256:02437870a8d594e61e4f6cff2f56f5104d17d56e3fea5fb234070ede5e7c2eae \ --hash=sha256:452bdba97c27efc7c1a83823ed0d6a08a9ad6ea5c67648248509f618b68aa7d9 @@ -687,6 +855,28 @@ mozilla-django-oidc==1.2.4 \ --hash=sha256:6f1064ec35c0dc42a7f6487e8649c9b51db04df52c424f48ebad6fe35e7481c8 \ --hash=sha256:a5130790bc71096b864d67486bbdabbbd4efc9bf1a755fb50d1f51891c11f423 # via -r requirements.in +murmurhash==1.0.5 \ + --hash=sha256:023391cfefe584ac544c1ea0936976c0119b17dd27bb8280652cef1704f76428 \ + --hash=sha256:23c56182822a1ed88e2a098ac56958dfec380696a9a943df203b9b41e4bcf5e4 \ + --hash=sha256:76251513a2acad6c2e4b7aeffc5fcb807ee97a66cad5c2990557556555a6b7e9 \ + --hash=sha256:81474a45c4074637a6dfc8fea4cdebf091ab5aa781c2cfcb94c43b16030badd7 \ + --hash=sha256:8381172e03c5f6f947005fb146a53c5e5a9e0d630be4a40cbf8838e9324bfe1c \ + --hash=sha256:892749023da26420d194f37bfa30df1368aaac0149cfa3b2105db36b66549e37 \ + --hash=sha256:98ec9d727bd998a35385abd56b062cf0cca216725ea7ec5068604ab566f7e97f \ + --hash=sha256:99e55488476a5f70e8d305fd31258f140e52f724f788bcc50c31ec846a2b3766 \ + --hash=sha256:a9bd2312996e6e47605af305a1e5f091eba1bdd637cdd9986aec4885cb4c5530 \ + --hash=sha256:add366944eb8ec73013a4f36e166c5a4f0f7628ffe1746bc5fe031347489e5e8 \ + --hash=sha256:b9292c532538cf47846ca81056cfeab08b877c35fe7521d6524aa92ddcd833e2 \ + --hash=sha256:d4c3a0242014cf4c84e9ea0ba3f13b48f02a3992de3da7b1116d11b816451195 \ + --hash=sha256:d58315961dc5a5e740f41f2ac5c3a0ebc61ef472f8afeb4db7eeb3b863243105 \ + --hash=sha256:ef8819d15973e0d6f69688bafc097a1fae081675c1de39807028869a1320b1a9 \ + --hash=sha256:f00321998f0a6bad3fd068babf448a296d4b0b1f4dd424cab863ebe5ed54182f \ + --hash=sha256:fd17973fd4554715efd8d86b3e9200358e49e437fdb92a897ca127aced48b61c \ + --hash=sha256:fed7578fbaa6c301f27ed80834c1f7494ea7d335e269e98b9aee477cf0b3b487 + # via + # preshed + # spacy + # thinc mypy-extensions==0.4.3 \ --hash=sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d \ --hash=sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8 @@ -699,6 +889,44 @@ nplusone==1.0.0 \ --hash=sha256:1726c0a10c0aa7eabb04e24db2882ff97b6b7ee29d729a8d97dcbd12ef5a5651 \ --hash=sha256:96b1e6e29e6af3e71b67d0cc012a5ec8c97c6a2f5399f4ba41a2bbe0e253a9ac # via -r requirements.in +numpy==1.21.2 \ + --hash=sha256:09858463db6dd9f78b2a1a05c93f3b33d4f65975771e90d2cf7aadb7c2f66edf \ + --hash=sha256:209666ce9d4a817e8a4597cd475b71b4878a85fa4b8db41d79fdb4fdee01dde2 \ + --hash=sha256:298156f4d3d46815eaf0fcf0a03f9625fc7631692bd1ad851517ab93c3168fc6 \ + --hash=sha256:30fc68307c0155d2a75ad19844224be0f2c6f06572d958db4e2053f816b859ad \ + --hash=sha256:423216d8afc5923b15df86037c6053bf030d15cc9e3224206ef868c2d63dd6dc \ + --hash=sha256:426a00b68b0d21f2deb2ace3c6d677e611ad5a612d2c76494e24a562a930c254 \ + --hash=sha256:466e682264b14982012887e90346d33435c984b7fead7b85e634903795c8fdb0 \ + --hash=sha256:51a7b9db0a2941434cd930dacaafe0fc9da8f3d6157f9d12f761bbde93f46218 \ + --hash=sha256:52a664323273c08f3b473548bf87c8145b7513afd63e4ebba8496ecd3853df13 \ + --hash=sha256:550564024dc5ceee9421a86fc0fb378aa9d222d4d0f858f6669eff7410c89bef \ + --hash=sha256:5de64950137f3a50b76ce93556db392e8f1f954c2d8207f78a92d1f79aa9f737 \ + --hash=sha256:640c1ccfd56724f2955c237b6ccce2e5b8607c3bc1cc51d3933b8c48d1da3723 \ + --hash=sha256:7fdc7689daf3b845934d67cb221ba8d250fdca20ac0334fea32f7091b93f00d3 \ + --hash=sha256:805459ad8baaf815883d0d6f86e45b3b0b67d823a8f3fa39b1ed9c45eaf5edf1 \ + --hash=sha256:92a0ab128b07799dd5b9077a9af075a63467d03ebac6f8a93e6440abfea4120d \ + --hash=sha256:9f2dc79c093f6c5113718d3d90c283f11463d77daa4e83aeeac088ec6a0bda52 \ + --hash=sha256:a5109345f5ce7ddb3840f5970de71c34a0ff7fceb133c9441283bb8250f532a3 \ + --hash=sha256:a55e4d81c4260386f71d22294795c87609164e22b28ba0d435850fbdf82fc0c5 \ + --hash=sha256:a9da45b748caad72ea4a4ed57e9cd382089f33c5ec330a804eb420a496fa760f \ + --hash=sha256:b160b9a99ecc6559d9e6d461b95c8eec21461b332f80267ad2c10394b9503496 \ + --hash=sha256:b342064e647d099ca765f19672696ad50c953cac95b566af1492fd142283580f \ + --hash=sha256:b5e8590b9245803c849e09bae070a8e1ff444f45e3f0bed558dd722119eea724 \ + --hash=sha256:bf75d5825ef47aa51d669b03ce635ecb84d69311e05eccea083f31c7570c9931 \ + --hash=sha256:c01b59b33c7c3ba90744f2c695be571a3bd40ab2ba7f3d169ffa6db3cfba614f \ + --hash=sha256:d96a6a7d74af56feb11e9a443150216578ea07b7450f7c05df40eec90af7f4a7 \ + --hash=sha256:dd0e3651d210068d13e18503d75aaa45656eef51ef0b261f891788589db2cc38 \ + --hash=sha256:e167b9805de54367dcb2043519382be541117503ce99e3291cc9b41ca0a83557 \ + --hash=sha256:e42029e184008a5fd3d819323345e25e2337b0ac7f5c135b7623308530209d57 \ + --hash=sha256:f545c082eeb09ae678dd451a1b1dbf17babd8a0d7adea02897a76e639afca310 \ + --hash=sha256:fde50062d67d805bc96f1a9ecc0d37bfc2a8f02b937d2c50824d186aa91f2419 + # via + # blis + # matplotlib + # pandas + # spacy + # thinc + # wordcloud oauthlib==3.1.1 \ --hash=sha256:42bf6354c2ed8c6acb54d971fce6f88193d97297e18602a3a886603f9d7730cc \ --hash=sha256:8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3 @@ -721,6 +949,10 @@ orderedmultidict==1.0.1 \ --hash=sha256:04070bbb5e87291cc9bfa51df413677faf2141c73c61d2a5f7b26bea3cd882ad \ --hash=sha256:43c839a17ee3cdd62234c47deca1a8508a3f2ca1d0678a3bf791c87cf84adbf3 # via furl +outcome==1.1.0 \ + --hash=sha256:c7dd9375cfd3c12db9801d080a3b63d4b0a261aa996c4c13152380587288d958 \ + --hash=sha256:e862f01d4e626e63e8f92c38d1f8d5546d3f9cce989263c521b2e7990d186967 + # via trio packaging==21.0 \ --hash=sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7 \ --hash=sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14 @@ -728,6 +960,30 @@ packaging==21.0 \ # dparse # drf-yasg # safety + # spacy +pandas==1.3.3 \ + --hash=sha256:272c8cb14aa9793eada6b1ebe81994616e647b5892a370c7135efb2924b701df \ + --hash=sha256:3334a5a9eeaca953b9db1b2b165dcdc5180b5011f3bec3a57a3580c9c22eae68 \ + --hash=sha256:37d63e78e87eb3791da7be4100a65da0383670c2b59e493d9e73098d7a879226 \ + --hash=sha256:3f5020613c1d8e304840c34aeb171377dc755521bf5e69804991030c2a48aec3 \ + --hash=sha256:45649503e167d45360aa7c52f18d1591a6d5c70d2f3a26bc90a3297a30ce9a66 \ + --hash=sha256:49fd2889d8116d7acef0709e4c82b8560a8b22b0f77471391d12c27596e90267 \ + --hash=sha256:4def2ef2fb7fcd62f2aa51bacb817ee9029e5c8efe42fe527ba21f6a3ddf1a9f \ + --hash=sha256:53e2fb11f86f6253bb1df26e3aeab3bf2e000aaa32a953ec394571bec5dc6fd6 \ + --hash=sha256:629138b7cf81a2e55aa29ce7b04c1cece20485271d1f6c469c6a0c03857db6a4 \ + --hash=sha256:68408a39a54ebadb9014ee5a4fae27b2fe524317bc80adf56c9ac59e8f8ea431 \ + --hash=sha256:7326b37de08d42dd3fff5b7ef7691d0fd0bf2428f4ba5a2bdc3b3247e9a52e4c \ + --hash=sha256:7557b39c8e86eb0543a17a002ac1ea0f38911c3c17095bc9350d0a65b32d801c \ + --hash=sha256:86b16b1b920c4cb27fdd65a2c20258bcd9c794be491290660722bb0ea765054d \ + --hash=sha256:a800df4e101b721e94d04c355e611863cc31887f24c0b019572e26518cbbcab6 \ + --hash=sha256:a9f1b54d7efc9df05320b14a48fb18686f781aa66cc7b47bb62fabfc67a0985c \ + --hash=sha256:c399200631db9bd9335d013ec7fce4edb98651035c249d532945c78ad453f23a \ + --hash=sha256:e574c2637c9d27f322e911650b36e858c885702c5996eda8a5a60e35e6648cf2 \ + --hash=sha256:e9bc59855598cb57f68fdabd4897d3ed2bc3a3b3bef7b868a0153c4cd03f3207 \ + --hash=sha256:ebbed7312547a924df0cbe133ff1250eeb94cdff3c09a794dc991c5621c8c735 \ + --hash=sha256:ed2f29b4da6f6ae7c68f4b3708d9d9e59fa89b2f9e87c2b64ce055cbd39f729e \ + --hash=sha256:f7d84f321674c2f0f31887ee6d5755c54ca1ea5e144d6d54b3bbf566dd9ea0cc + # via -r requirements.in paramiko==2.8.0 \ --hash=sha256:def3ec612399bab4e9f5eb66b0ae5983980db9dd9120d9e9c6ea3ff673865d1c \ --hash=sha256:e673b10ee0f1c80d46182d3af7751d033d9b573dd7054d2d0aa46be186c3c1d2 @@ -740,65 +996,60 @@ pathspec==0.9.0 \ --hash=sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a \ --hash=sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1 # via black +pathy==0.6.0 \ + --hash=sha256:bffa0bd74c66575cf51c96d3ab312f34d08d6bff54aabb8c7a2b9f8b701fe6ef \ + --hash=sha256:f83f1eddf77dd86e824143eef8d9adbe0785c3cdd5ec0ed6c0edea3227385048 + # via spacy pbr==5.6.0 \ --hash=sha256:42df03e7797b796625b1029c0400279c7c34fd7df24a7d7818a1abb5b38710dd \ --hash=sha256:c68c661ac5cc81058ac94247278eeda6d2e6aecb3e227b0387c30d277e7ef8d4 # via stevedore -pillow==8.3.2 \ - --hash=sha256:0412516dcc9de9b0a1e0ae25a280015809de8270f134cc2c1e32c4eeb397cf30 \ - --hash=sha256:04835e68ef12904bc3e1fd002b33eea0779320d4346082bd5b24bec12ad9c3e9 \ - --hash=sha256:06d1adaa284696785375fa80a6a8eb309be722cf4ef8949518beb34487a3df71 \ - --hash=sha256:085a90a99404b859a4b6c3daa42afde17cb3ad3115e44a75f0d7b4a32f06a6c9 \ - --hash=sha256:0b9911ec70731711c3b6ebcde26caea620cbdd9dcb73c67b0730c8817f24711b \ - --hash=sha256:10e00f7336780ca7d3653cf3ac26f068fa11b5a96894ea29a64d3dc4b810d630 \ - --hash=sha256:11c27e74bab423eb3c9232d97553111cc0be81b74b47165f07ebfdd29d825875 \ - --hash=sha256:11eb7f98165d56042545c9e6db3ce394ed8b45089a67124298f0473b29cb60b2 \ - --hash=sha256:13654b521fb98abdecec105ea3fb5ba863d1548c9b58831dd5105bb3873569f1 \ - --hash=sha256:15ccb81a6ffc57ea0137f9f3ac2737ffa1d11f786244d719639df17476d399a7 \ - --hash=sha256:18a07a683805d32826c09acfce44a90bf474e6a66ce482b1c7fcd3757d588df3 \ - --hash=sha256:19ec4cfe4b961edc249b0e04b5618666c23a83bc35842dea2bfd5dfa0157f81b \ - --hash=sha256:1c3ff00110835bdda2b1e2b07f4a2548a39744bb7de5946dc8e95517c4fb2ca6 \ - --hash=sha256:27a330bf7014ee034046db43ccbb05c766aa9e70b8d6c5260bfc38d73103b0ba \ - --hash=sha256:2b11c9d310a3522b0fd3c35667914271f570576a0e387701f370eb39d45f08a4 \ - --hash=sha256:2c661542c6f71dfd9dc82d9d29a8386287e82813b0375b3a02983feac69ef864 \ - --hash=sha256:2cde7a4d3687f21cffdf5bb171172070bb95e02af448c4c8b2f223d783214056 \ - --hash=sha256:2d5e9dc0bf1b5d9048a94c48d0813b6c96fccfa4ccf276d9c36308840f40c228 \ - --hash=sha256:2f23b2d3079522fdf3c09de6517f625f7a964f916c956527bed805ac043799b8 \ - --hash=sha256:35d27687f027ad25a8d0ef45dd5208ef044c588003cdcedf05afb00dbc5c2deb \ - --hash=sha256:35d409030bf3bd05fa66fb5fdedc39c521b397f61ad04309c90444e893d05f7d \ - --hash=sha256:4326ea1e2722f3dc00ed77c36d3b5354b8fb7399fb59230249ea6d59cbed90da \ - --hash=sha256:4abc247b31a98f29e5224f2d31ef15f86a71f79c7f4d2ac345a5d551d6393073 \ - --hash=sha256:4d89a2e9219a526401015153c0e9dd48319ea6ab9fe3b066a20aa9aee23d9fd3 \ - --hash=sha256:4e59e99fd680e2b8b11bbd463f3c9450ab799305d5f2bafb74fefba6ac058616 \ - --hash=sha256:548794f99ff52a73a156771a0402f5e1c35285bd981046a502d7e4793e8facaa \ - --hash=sha256:56fd98c8294f57636084f4b076b75f86c57b2a63a8410c0cd172bc93695ee979 \ - --hash=sha256:59697568a0455764a094585b2551fd76bfd6b959c9f92d4bdec9d0e14616303a \ - --hash=sha256:6bff50ba9891be0a004ef48828e012babaaf7da204d81ab9be37480b9020a82b \ - --hash=sha256:6cb3dd7f23b044b0737317f892d399f9e2f0b3a02b22b2c692851fb8120d82c6 \ - --hash=sha256:7dbfbc0020aa1d9bc1b0b8bcf255a7d73f4ad0336f8fd2533fcc54a4ccfb9441 \ - --hash=sha256:838eb85de6d9307c19c655c726f8d13b8b646f144ca6b3771fa62b711ebf7624 \ - --hash=sha256:8b68f565a4175e12e68ca900af8910e8fe48aaa48fd3ca853494f384e11c8bcd \ - --hash=sha256:8f284dc1695caf71a74f24993b7c7473d77bc760be45f776a2c2f4e04c170550 \ - --hash=sha256:963ebdc5365d748185fdb06daf2ac758116deecb2277ec5ae98139f93844bc09 \ - --hash=sha256:a048dad5ed6ad1fad338c02c609b862dfaa921fcd065d747194a6805f91f2196 \ - --hash=sha256:a1bd983c565f92779be456ece2479840ec39d386007cd4ae83382646293d681b \ - --hash=sha256:a66566f8a22561fc1a88dc87606c69b84fa9ce724f99522cf922c801ec68f5c1 \ - --hash=sha256:bcb04ff12e79b28be6c9988f275e7ab69f01cc2ba319fb3114f87817bb7c74b6 \ - --hash=sha256:bd24054aaf21e70a51e2a2a5ed1183560d3a69e6f9594a4bfe360a46f94eba83 \ - --hash=sha256:be25cb93442c6d2f8702c599b51184bd3ccd83adebd08886b682173e09ef0c3f \ - --hash=sha256:c691b26283c3a31594683217d746f1dad59a7ae1d4cfc24626d7a064a11197d4 \ - --hash=sha256:cc9d0dec711c914ed500f1d0d3822868760954dce98dfb0b7382a854aee55d19 \ - --hash=sha256:ce2e5e04bb86da6187f96d7bab3f93a7877830981b37f0287dd6479e27a10341 \ - --hash=sha256:ce651ca46d0202c302a535d3047c55a0131a720cf554a578fc1b8a2aff0e7d96 \ - --hash=sha256:d0c8ebbfd439c37624db98f3877d9ed12c137cadd99dde2d2eae0dab0bbfc355 \ - --hash=sha256:d675a876b295afa114ca8bf42d7f86b5fb1298e1b6bb9a24405a3f6c8338811c \ - --hash=sha256:dde3f3ed8d00c72631bc19cbfff8ad3b6215062a5eed402381ad365f82f0c18c \ - --hash=sha256:e5a31c07cea5edbaeb4bdba6f2b87db7d3dc0f446f379d907e51cc70ea375629 \ - --hash=sha256:f514c2717012859ccb349c97862568fdc0479aad85b0270d6b5a6509dbc142e2 \ - --hash=sha256:fc0db32f7223b094964e71729c0361f93db43664dd1ec86d3df217853cedda87 \ - --hash=sha256:fd4fd83aa912d7b89b4b4a1580d30e2a4242f3936882a3f433586e5ab97ed0d5 \ - --hash=sha256:feb5db446e96bfecfec078b943cc07744cc759893cef045aa8b8b6d6aaa8274e - # via -r requirements.in +pillow==8.4.0 \ + --hash=sha256:066f3999cb3b070a95c3652712cffa1a748cd02d60ad7b4e485c3748a04d9d76 \ + --hash=sha256:0a0956fdc5defc34462bb1c765ee88d933239f9a94bc37d132004775241a7585 \ + --hash=sha256:0b052a619a8bfcf26bd8b3f48f45283f9e977890263e4571f2393ed8898d331b \ + --hash=sha256:1394a6ad5abc838c5cd8a92c5a07535648cdf6d09e8e2d6df916dfa9ea86ead8 \ + --hash=sha256:1bc723b434fbc4ab50bb68e11e93ce5fb69866ad621e3c2c9bdb0cd70e345f55 \ + --hash=sha256:244cf3b97802c34c41905d22810846802a3329ddcb93ccc432870243211c79fc \ + --hash=sha256:25a49dc2e2f74e65efaa32b153527fc5ac98508d502fa46e74fa4fd678ed6645 \ + --hash=sha256:2e4440b8f00f504ee4b53fe30f4e381aae30b0568193be305256b1462216feff \ + --hash=sha256:3862b7256046fcd950618ed22d1d60b842e3a40a48236a5498746f21189afbbc \ + --hash=sha256:3eb1ce5f65908556c2d8685a8f0a6e989d887ec4057326f6c22b24e8a172c66b \ + --hash=sha256:3f97cfb1e5a392d75dd8b9fd274d205404729923840ca94ca45a0af57e13dbe6 \ + --hash=sha256:493cb4e415f44cd601fcec11c99836f707bb714ab03f5ed46ac25713baf0ff20 \ + --hash=sha256:4acc0985ddf39d1bc969a9220b51d94ed51695d455c228d8ac29fcdb25810e6e \ + --hash=sha256:5503c86916d27c2e101b7f71c2ae2cddba01a2cf55b8395b0255fd33fa4d1f1a \ + --hash=sha256:5b7bb9de00197fb4261825c15551adf7605cf14a80badf1761d61e59da347779 \ + --hash=sha256:5e9ac5f66616b87d4da618a20ab0a38324dbe88d8a39b55be8964eb520021e02 \ + --hash=sha256:620582db2a85b2df5f8a82ddeb52116560d7e5e6b055095f04ad828d1b0baa39 \ + --hash=sha256:62cc1afda735a8d109007164714e73771b499768b9bb5afcbbee9d0ff374b43f \ + --hash=sha256:70ad9e5c6cb9b8487280a02c0ad8a51581dcbbe8484ce058477692a27c151c0a \ + --hash=sha256:72b9e656e340447f827885b8d7a15fc8c4e68d410dc2297ef6787eec0f0ea409 \ + --hash=sha256:72cbcfd54df6caf85cc35264c77ede902452d6df41166010262374155947460c \ + --hash=sha256:792e5c12376594bfcb986ebf3855aa4b7c225754e9a9521298e460e92fb4a488 \ + --hash=sha256:7b7017b61bbcdd7f6363aeceb881e23c46583739cb69a3ab39cb384f6ec82e5b \ + --hash=sha256:81f8d5c81e483a9442d72d182e1fb6dcb9723f289a57e8030811bac9ea3fef8d \ + --hash=sha256:82aafa8d5eb68c8463b6e9baeb4f19043bb31fefc03eb7b216b51e6a9981ae09 \ + --hash=sha256:84c471a734240653a0ec91dec0996696eea227eafe72a33bd06c92697728046b \ + --hash=sha256:8c803ac3c28bbc53763e6825746f05cc407b20e4a69d0122e526a582e3b5e153 \ + --hash=sha256:93ce9e955cc95959df98505e4608ad98281fff037350d8c2671c9aa86bcf10a9 \ + --hash=sha256:9a3e5ddc44c14042f0844b8cf7d2cd455f6cc80fd7f5eefbe657292cf601d9ad \ + --hash=sha256:a4901622493f88b1a29bd30ec1a2f683782e57c3c16a2dbc7f2595ba01f639df \ + --hash=sha256:a5a4532a12314149d8b4e4ad8ff09dde7427731fcfa5917ff16d0291f13609df \ + --hash=sha256:b8831cb7332eda5dc89b21a7bce7ef6ad305548820595033a4b03cf3091235ed \ + --hash=sha256:b8e2f83c56e141920c39464b852de3719dfbfb6e3c99a2d8da0edf4fb33176ed \ + --hash=sha256:c70e94281588ef053ae8998039610dbd71bc509e4acbc77ab59d7d2937b10698 \ + --hash=sha256:c8a17b5d948f4ceeceb66384727dde11b240736fddeda54ca740b9b8b1556b29 \ + --hash=sha256:d82cdb63100ef5eedb8391732375e6d05993b765f72cb34311fab92103314649 \ + --hash=sha256:d89363f02658e253dbd171f7c3716a5d340a24ee82d38aab9183f7fdf0cdca49 \ + --hash=sha256:d99ec152570e4196772e7a8e4ba5320d2d27bf22fdf11743dd882936ed64305b \ + --hash=sha256:ddc4d832a0f0b4c52fff973a0d44b6c99839a9d016fe4e6a1cb8f3eea96479c2 \ + --hash=sha256:e3dacecfbeec9a33e932f00c6cd7996e62f53ad46fbe677577394aaa90ee419a \ + --hash=sha256:eb9fc393f3c61f9054e1ed26e6fe912c7321af2f41ff49d3f83d05bacf22cc78 + # via + # -r requirements.in + # matplotlib + # wordcloud platformdirs==2.4.0 \ --hash=sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2 \ --hash=sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d @@ -807,6 +1058,27 @@ prance==0.21.8.0 \ --hash=sha256:51ec41d10b317bf5d4e74782a7f7f0c0488c6042433b5b4fde2a988cd069d235 \ --hash=sha256:ce06feef8814c3436645f3b094e91067b1a111bc860a51f239f93437a8d4b00e # via datamodel-code-generator +preshed==3.0.5 \ + --hash=sha256:12cbe1e378b4f1c6b06f5e4130408befe916e55ea1616e6aa63c5cd0ccd9c927 \ + --hash=sha256:1bdededa7fd81f26a42bc9d11d542657c74746b7ea7fc2b2ca6d0ddbf1f93792 \ + --hash=sha256:1ce0846cb7ebb2ea913d44ec2e296098c285443ecdea80ddf02656bbef4deacb \ + --hash=sha256:30f0c8ea85113d0565a1e3eb6222d00513ec39b56f3f9a2615e304575e65422e \ + --hash=sha256:56b9603517bb2a364418163236d6a147a1d722ff7546cbe085e76e25ae118e89 \ + --hash=sha256:572899224578d30f6a67fadecb3d62b824866b4d2b6bad73f71abf7585db1389 \ + --hash=sha256:5e06a49477bd257eea02bf823b5d3e201d00a19d6976523a58da8606b2358481 \ + --hash=sha256:67c11e384ce4c008bc487ba3a29bafdfe038b9a2546ccfe0fe2160480b356fed \ + --hash=sha256:6e833f1632a1d0232bdc6df6c3542fb130ef044d8656b24576d9fd19e5f1e0d1 \ + --hash=sha256:6f126bcc414a0304b54956f9dac2628a0f9bef1657d1b3a3837fc82b791aa2a1 \ + --hash=sha256:85074eebf90a858a6b68242f1ae265ca99e1af45bf9dafcb9a83d49b0815a2e1 \ + --hash=sha256:8a3adffde3126c2a0ab7d57cab1d605cb5f63da1ba88088ad3cf8debfd9aa4dc \ + --hash=sha256:8a560850b8c53c1487ba51c2b0f5769535512b36d3b129ad5796b64653abe2f9 \ + --hash=sha256:9ebf444f8487782c84d7b5acb1d7195e603155882fafc4697344199eeeafbe5f \ + --hash=sha256:c6d3dba39ed5059aaf99767017b9568c75b2d0780c3481e204b1daecde00360e \ + --hash=sha256:ca4a7681b643b8356e7dfdab9cf668b2b34bd07ef4b09ebed44c8aeb3b1626ee \ + --hash=sha256:fb4d2e82add82d63b2c97802b759a58ff200d06b632e2edc48a9ced1e6472faf + # via + # spacy + # thinc psycopg2-binary==2.9.1 \ --hash=sha256:0b7dae87f0b729922e06f85f667de7bf16455d411971b2043bbd9577af9d1975 \ --hash=sha256:0f2e04bd2a2ab54fa44ee67fe2d002bb90cee1c0f1cc0ebc3148af7b02034cbd \ @@ -873,6 +1145,8 @@ pydantic[email]==1.8.2 \ # via # compliance-trestle # datamodel-code-generator + # spacy + # thinc pygithub==1.55 \ --hash=sha256:1bbfff9372047ff3f21d5cd8e07720f3dbfdaf6462fcaed9d815f528f1ba7283 \ --hash=sha256:2caf0054ea079b71e539741ae56c5a95e073b81fa472ce222e81667381b9601b @@ -935,9 +1209,9 @@ pyinstrument-cext==0.2.4 \ --hash=sha256:fe2eaf64e09b59c7579c775fd3ec075a0728d9be55eef673b2cdb35531b4005b \ --hash=sha256:fe611732306651d0a10e99bbd1f174d4e0a0572b68b74f0673a5665146507a26 # via pyinstrument -pyjwt[crypto]==2.2.0 \ - --hash=sha256:a0b9a3b4e5ca5517cac9f1a6e9cd30bf1aa80be74fcdf4e28eded582ecfcfbae \ - --hash=sha256:b0ed5824c8ecc5362e540c65dc6247567db130c4226670bf7699aec92fb4dae1 +pyjwt[crypto]==2.3.0 \ + --hash=sha256:b888b4d56f06f6dcd777210c334e69c737be74755d3e5e9ee3fe67dc18a0ee41 \ + --hash=sha256:e0c4bb8d9f0af0c7f5b1ec4c5036309617d03d56932877f2f7a0beeb5318322f # via # django-allauth # pygithub @@ -966,11 +1240,15 @@ pynacl==1.4.0 \ pyopenssl==21.0.0 \ --hash=sha256:5e2d8c5e46d0d865ae933bef5230090bdaf5506281e9eec60fa250ee80600cb3 \ --hash=sha256:8935bd4920ab9abfebb07c41a4f58296407ed77f04bd1a92914044b848ba1ed6 - # via josepy + # via + # josepy + # urllib3 pyparsing==2.4.7 \ --hash=sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1 \ --hash=sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b - # via packaging + # via + # matplotlib + # packaging pyrsistent==0.18.0 \ --hash=sha256:097b96f129dd36a8c9e33594e7ebb151b1515eb52cceb08474c10a5479e799f2 \ --hash=sha256:2aaf19dc8ce517a8653746d98e962ef480ff34b6bc563fc067be6401ffb457c7 \ @@ -1001,7 +1279,10 @@ pysnooper==0.5.0 \ python-dateutil==2.8.2 \ --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 - # via -r requirements.in + # via + # -r requirements.in + # matplotlib + # pandas python-dotenv==0.19.1 \ --hash=sha256:14f8185cc8d494662683e6914addcb7e95374771e707601dfc70166946b4c4b8 \ --hash=sha256:bbd3da593fc49c249397cbfbcc449cf36cb02e75afc8157fcc6a81df6fb7750a @@ -1040,37 +1321,42 @@ pytz==2021.3 \ # django # django-notifications-hq # fs + # pandas # rfc5424-logging-handler -pyyaml==5.4.1 \ - --hash=sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf \ - --hash=sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696 \ - --hash=sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393 \ - --hash=sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77 \ - --hash=sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922 \ - --hash=sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5 \ - --hash=sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8 \ - --hash=sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10 \ - --hash=sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc \ - --hash=sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018 \ - --hash=sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e \ - --hash=sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253 \ - --hash=sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347 \ - --hash=sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183 \ - --hash=sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541 \ - --hash=sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb \ - --hash=sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185 \ - --hash=sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc \ - --hash=sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db \ - --hash=sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa \ - --hash=sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46 \ - --hash=sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122 \ - --hash=sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b \ - --hash=sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63 \ - --hash=sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df \ - --hash=sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc \ - --hash=sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247 \ - --hash=sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6 \ - --hash=sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0 +pyyaml==6.0 \ + --hash=sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293 \ + --hash=sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b \ + --hash=sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57 \ + --hash=sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b \ + --hash=sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4 \ + --hash=sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07 \ + --hash=sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba \ + --hash=sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9 \ + --hash=sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287 \ + --hash=sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513 \ + --hash=sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0 \ + --hash=sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0 \ + --hash=sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92 \ + --hash=sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f \ + --hash=sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2 \ + --hash=sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc \ + --hash=sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c \ + --hash=sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86 \ + --hash=sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4 \ + --hash=sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c \ + --hash=sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34 \ + --hash=sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b \ + --hash=sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c \ + --hash=sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb \ + --hash=sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737 \ + --hash=sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3 \ + --hash=sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d \ + --hash=sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53 \ + --hash=sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78 \ + --hash=sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803 \ + --hash=sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a \ + --hash=sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174 \ + --hash=sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5 # via # bandit # dparse @@ -1078,8 +1364,10 @@ pyyaml==5.4.1 \ # python-frontmatter # rtyaml regex==2021.10.8 \ + --hash=sha256:094a905e87a4171508c2a0e10217795f83c636ccc05ddf86e7272c26e14056ae \ --hash=sha256:09e1031e2059abd91177c302da392a7b6859ceda038be9e015b522a182c89e4f \ --hash=sha256:176796cb7f82a7098b0c436d6daac82f57b9101bb17b8e8119c36eecf06a60a3 \ + --hash=sha256:19b8f6d23b2dc93e8e1e7e288d3010e58fafed323474cf7f27ab9451635136d9 \ --hash=sha256:1abbd95cbe9e2467cac65c77b6abd9223df717c7ae91a628502de67c73bf6838 \ --hash=sha256:1ce02f420a7ec3b2480fe6746d756530f69769292eca363218c2291d0b116a01 \ --hash=sha256:1f51926db492440e66c89cd2be042f2396cf91e5b05383acd7372b8cb7da373f \ @@ -1095,11 +1383,13 @@ regex==2021.10.8 \ --hash=sha256:5e5796d2f36d3c48875514c5cd9e4325a1ca172fc6c78b469faa8ddd3d770593 \ --hash=sha256:5f199419a81c1016e0560c39773c12f0bd924c37715bffc64b97140d2c314354 \ --hash=sha256:5f55c4804797ef7381518e683249310f7f9646da271b71cb6b3552416c7894ee \ + --hash=sha256:6dcf53d35850ce938b4f044a43b33015ebde292840cef3af2c8eb4c860730fff \ --hash=sha256:74e55f8d66f1b41d44bc44c891bcf2c7fad252f8f323ee86fba99d71fd1ad5e3 \ --hash=sha256:7f125fce0a0ae4fd5c3388d369d7a7d78f185f904c90dd235f7ecf8fe13fa741 \ --hash=sha256:82cfb97a36b1a53de32b642482c6c46b6ce80803854445e19bc49993655ebf3b \ --hash=sha256:88dc3c1acd3f0ecfde5f95c32fcb9beda709dbdf5012acdcf66acbc4794468eb \ --hash=sha256:924079d5590979c0e961681507eb1773a142553564ccae18d36f1de7324e71ca \ + --hash=sha256:951be934dc25d8779d92b530e922de44dda3c82a509cdb5d619f3a0b1491fafa \ --hash=sha256:973499dac63625a5ef9dfa4c791aa33a502ddb7615d992bdc89cf2cc2285daa3 \ --hash=sha256:981c786293a3115bc14c103086ae54e5ee50ca57f4c02ce7cf1b60318d1e8072 \ --hash=sha256:9c070d5895ac6aeb665bd3cd79f673775caf8d33a0b569e98ac434617ecea57d \ @@ -1109,9 +1399,11 @@ regex==2021.10.8 \ --hash=sha256:aa0ab3530a279a3b7f50f852f1bab41bc304f098350b03e30a3876b7dd89840e \ --hash=sha256:b04e512eb628ea82ed86eb31c0f7fc6842b46bf2601b66b1356a7008327f7700 \ --hash=sha256:b09d3904bf312d11308d9a2867427479d277365b1617e48ad09696fa7dfcdf59 \ + --hash=sha256:b0f2f874c6a157c91708ac352470cb3bef8e8814f5325e3c5c7a0533064c6a24 \ --hash=sha256:b8b6ee6555b6fbae578f1468b3f685cdfe7940a65675611365a7ea1f8d724991 \ --hash=sha256:b9b5c215f3870aa9b011c00daeb7be7e1ae4ecd628e9beb6d7e6107e07d81287 \ --hash=sha256:c6569ba7b948c3d61d27f04e2b08ebee24fec9ff8e9ea154d8d1e975b175bfa7 \ + --hash=sha256:e2ec1c106d3f754444abf63b31e5c4f9b5d272272a491fa4320475aba9e8157c \ --hash=sha256:e4204708fa116dd03436a337e8e84261bc8051d058221ec63535c9403a1582a1 \ --hash=sha256:ea8de658d7db5987b11097445f2b1f134400e2232cb40e614e5f7b6f5428710e \ --hash=sha256:f540f153c4f5617bc4ba6433534f8916d96366a08797cbbe4132c37b70403e92 \ @@ -1134,6 +1426,7 @@ requests==2.26.0 \ # pygithub # requests-oauthlib # safety + # spacy requests-oauthlib==1.3.0 \ --hash=sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d \ --hash=sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a @@ -1184,20 +1477,68 @@ safety==1.10.3 \ --hash=sha256:30e394d02a20ac49b7f65292d19d38fa927a8f9582cdfd3ad1adbbc66c641ad5 \ --hash=sha256:5f802ad5df5614f9622d8d71fedec2757099705c2356f862847c58c6dfe13e84 # via -r requirements.in -selenium==3.141.0 \ - --hash=sha256:2d7131d7bc5a5b99a2d9b04aaf2612c411b03b8ca1b1ee8d3de5845a9be2cb3c \ - --hash=sha256:deaf32b60ad91a4611b98d8002757f29e6f2c2d5fcaf202e1c9ad06d6772300d +selenium==4.0.0 \ + --hash=sha256:c942b166a21ce9c9065ad249b54059e926d39f9000167b5ca0fa4950d2ef9a82 # via -r requirements.in semver==2.13.0 \ --hash=sha256:ced8b23dceb22134307c1b8abfa523da14198793d9787ac838e70e29e77458d4 \ --hash=sha256:fa0fe2722ee1c3f57eac478820c3a5ae2f624af8264cbdf9000c980ff7f75e3f # via prance +simplejson==3.17.5 \ + --hash=sha256:065230b9659ac38c8021fa512802562d122afb0cf8d4b89e257014dcddb5730a \ + --hash=sha256:07707ba69324eaf58f0c6f59d289acc3e0ed9ec528dae5b0d4219c0d6da27dc5 \ + --hash=sha256:10defa88dd10a0a4763f16c1b5504e96ae6dc68953cfe5fc572b4a8fcaf9409b \ + --hash=sha256:140eb58809f24d843736edb8080b220417e22c82ac07a3dfa473f57e78216b5f \ + --hash=sha256:188f2c78a8ac1eb7a70a4b2b7b9ad11f52181044957bf981fb3e399c719e30ee \ + --hash=sha256:1c2688365743b0f190392e674af5e313ebe9d621813d15f9332e874b7c1f2d04 \ + --hash=sha256:24e413bd845bd17d4d72063d64e053898543fb7abc81afeae13e5c43cef9c171 \ + --hash=sha256:2b59acd09b02da97728d0bae8ff48876d7efcbbb08e569c55e2d0c2e018324f5 \ + --hash=sha256:2df15814529a4625ea6f7b354a083609b3944c269b954ece0d0e7455872e1b2a \ + --hash=sha256:352c11582aa1e49a2f0f7f7d8fd5ec5311da890d1354287e83c63ab6af857cf5 \ + --hash=sha256:36b08b886027eac67e7a0e822e3a5bf419429efad7612e69501669d6252a21f2 \ + --hash=sha256:376023f51edaf7290332dacfb055bc00ce864cb013c0338d0dea48731f37e42f \ + --hash=sha256:3ba82f8b421886f4a2311c43fb98faaf36c581976192349fef2a89ed0fcdbdef \ + --hash=sha256:3d72aa9e73134dacd049a2d6f9bd219f7be9c004d03d52395831611d66cedb71 \ + --hash=sha256:40ece8fa730d1a947bff792bcc7824bd02d3ce6105432798e9a04a360c8c07b0 \ + --hash=sha256:417b7e119d66085dc45bdd563dcb2c575ee10a3b1c492dd3502a029448d4be1c \ + --hash=sha256:42b7c7264229860fe879be961877f7466d9f7173bd6427b3ba98144a031d49fb \ + --hash=sha256:457d9cfe7ece1571770381edccdad7fc255b12cd7b5b813219441146d4f47595 \ + --hash=sha256:4a6943816e10028eeed512ea03be52b54ea83108b408d1049b999f58a760089b \ + --hash=sha256:5b94df70bd34a3b946c0eb272022fb0f8a9eb27cad76e7f313fedbee2ebe4317 \ + --hash=sha256:5f5051a13e7d53430a990604b532c9124253c5f348857e2d5106d45fc8533860 \ + --hash=sha256:5f7f53b1edd4b23fb112b89208377480c0bcee45d43a03ffacf30f3290e0ed85 \ + --hash=sha256:5fe8c6dcb9e6f7066bdc07d3c410a2fca78c0d0b4e0e72510ffd20a60a20eb8e \ + --hash=sha256:71a54815ec0212b0cba23adc1b2a731bdd2df7b9e4432718b2ed20e8aaf7f01a \ + --hash=sha256:7332f7b06d42153255f7bfeb10266141c08d48cc1a022a35473c95238ff2aebc \ + --hash=sha256:78c6f0ed72b440ebe1892d273c1e5f91e55e6861bea611d3b904e673152a7a4c \ + --hash=sha256:7c9b30a2524ae6983b708f12741a31fbc2fb8d6fecd0b6c8584a62fd59f59e09 \ + --hash=sha256:86fcffc06f1125cb443e2bed812805739d64ceb78597ac3c1b2d439471a09717 \ + --hash=sha256:87572213965fd8a4fb7a97f837221e01d8fddcfb558363c671b8aa93477fb6a2 \ + --hash=sha256:8e595de17178dd3bbeb2c5b8ea97536341c63b7278639cb8ee2681a84c0ef037 \ + --hash=sha256:917f01db71d5e720b731effa3ff4a2c702a1b6dacad9bcdc580d86a018dfc3ca \ + --hash=sha256:91cfb43fb91ff6d1e4258be04eee84b51a4ef40a28d899679b9ea2556322fb50 \ + --hash=sha256:aa86cfdeb118795875855589934013e32895715ec2d9e8eb7a59be3e7e07a7e1 \ + --hash=sha256:ade09aa3c284d11f39640aebdcbb748e1996f0c60504f8c4a0c5a9fec821e67a \ + --hash=sha256:b2a5688606dffbe95e1347a05b77eb90489fe337edde888e23bbb7fd81b0d93b \ + --hash=sha256:b92fbc2bc549c5045c8233d954f3260ccf99e0f3ec9edfd2372b74b350917752 \ + --hash=sha256:c2d5334d935af711f6d6dfeec2d34e071cdf73ec0df8e8bd35ac435b26d8da97 \ + --hash=sha256:cb0afc3bad49eb89a579103616574a54b523856d20fc539a4f7a513a0a8ba4b2 \ + --hash=sha256:ce66f730031b9b3683b2fc6ad4160a18db86557c004c3d490a29bf8d450d7ab9 \ + --hash=sha256:e29b9cea4216ec130df85d8c36efb9985fda1c9039e4706fb30e0fb6a67602ff \ + --hash=sha256:e2cc4b68e59319e3de778325e34fbff487bfdb2225530e89995402989898d681 \ + --hash=sha256:e90d2e219c3dce1500dda95f5b893c293c4d53c4e330c968afbd4e7a90ff4a5b \ + --hash=sha256:f13c48cc4363829bdfecc0c181b6ddf28008931de54908a492dc8ccd0066cd60 \ + --hash=sha256:f550730d18edec4ff9d4252784b62adfe885d4542946b6d5a54c8a6521b56afd \ + --hash=sha256:fa843ee0d34c7193f5a816e79df8142faff851549cab31e84b526f04878ac778 \ + --hash=sha256:fe1c33f78d2060719d52ea9459d97d7ae3a5b707ec02548575c4fbed1d1d345b + # via -r requirements.in six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 # via # bandit # bcrypt + # cycler # fs # furl # html5lib @@ -1213,6 +1554,10 @@ six==1.16.0 \ # pyopenssl # python-dateutil # w3lib +smart-open==5.2.1 \ + --hash=sha256:71d14489da58b60ce12fc3ecb823facc59a8b23cd1b58edb97175640350d3a62 \ + --hash=sha256:75abf758717a92a8f53aa96953f0c245c8cedf8e1e4184903db3659b419d4c17 + # via pathy smmap==4.0.0 \ --hash=sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182 \ --hash=sha256:a9a7479e4c572e2e775c404dcd3080c8dc49f39918c2cf74913d30c4c478e3c2 @@ -1224,12 +1569,87 @@ sniffio==1.2.0 \ # anyio # httpcore # httpx + # trio +sortedcontainers==2.4.0 \ + --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ + --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 + # via trio +spacy==3.1.3 \ + --hash=sha256:0a8791b54ab4a6b92e07ba6bf1d1b1dbbc5dd9311e90a003fac4274fff5fb847 \ + --hash=sha256:1c7b721663d884412a57c499fab3d8ee9be8a614bbb20fcbbbdf0e9e7ad52c33 \ + --hash=sha256:2930683257e228acd7c3294895a1681cc38e4d91b06d43bdd03721aa277dd9d4 \ + --hash=sha256:4a91237bf8eafb23f61e4d07953c94c8f187e3169c5563b0972bf23f52996c3d \ + --hash=sha256:58084e64a27997192ea48f18abb30ec148c5bbe79d04d17ba4d2fc262100c2a2 \ + --hash=sha256:5937d05aad1f699c60ccc53b49f3f5b4aa4e12cce4b1dca6f5a015592b49565c \ + --hash=sha256:7465a2c0950cf9ea2fcfeb63a093fb0dc2557b0c3e2f96b89c163477b160f6be \ + --hash=sha256:838372223e605beff9a0bb563263cf6c3aa0eed1b58c1fa795f20d6938902d5c \ + --hash=sha256:b51effb8423e0190f22d29d5b98e31a38c9a20b6908d305c5f62d8790f2d0ab3 \ + --hash=sha256:b69e83f4fc4e936735f285dbf452288f6bcb627be824ea6aff41703c2847ddc1 \ + --hash=sha256:b73287620ca6532f95b97111036ba8f4d82ee28ce113acf9b9adbf42b968ef3d \ + --hash=sha256:ca719d352b13c2d37db8567eb88cda598dfc37fd8465c6187002ff3d020bab86 \ + --hash=sha256:e8342ce5e095f57dd53127a429d9cac38c36e1a353ed9747ef92751216fcd42a + # via -r requirements.in +spacy-legacy==3.0.8 \ + --hash=sha256:b4725c5c161f0685ab4fce3fc912bc68aefdb7e102ba9848e852bb5842256c2f \ + --hash=sha256:eb37a3540bb461b5fe9348d4976784f18a0e345982e41e2c5c7cd8229889e825 + # via spacy +sqlalchemy==1.4.25 \ + --hash=sha256:0566a6e90951590c0307c75f9176597c88ef4be2724958ca1d28e8ae05ec8822 \ + --hash=sha256:08d9396a2a38e672133266b31ed39b2b1f2b5ec712b5bff5e08033970563316a \ + --hash=sha256:0b08a53e40b34205acfeb5328b832f44437956d673a6c09fce55c66ab0e54916 \ + --hash=sha256:16ef07e102d2d4f974ba9b0d4ac46345a411ad20ad988b3654d59ff08e553b1c \ + --hash=sha256:1adf3d25e2e33afbcd48cfad8076f9378793be43e7fec3e4334306cac6bec138 \ + --hash=sha256:1b38db2417b9f7005d6ceba7ce2a526bf10e3f6f635c0f163e6ed6a42b5b62b2 \ + --hash=sha256:1ebd69365717becaa1b618220a3df97f7c08aa68e759491de516d1c3667bba54 \ + --hash=sha256:26b0cd2d5c7ea96d3230cb20acac3d89de3b593339c1447b4d64bfcf4eac1110 \ + --hash=sha256:2ed67aae8cde4d32aacbdba4f7f38183d14443b714498eada5e5a7a37769c0b7 \ + --hash=sha256:33a1e86abad782e90976de36150d910748b58e02cd7d35680d441f9a76806c18 \ + --hash=sha256:41a916d815a3a23cb7fff8d11ad0c9b93369ac074e91e428075e088fe57d5358 \ + --hash=sha256:6003771ea597346ab1e97f2f58405c6cacbf6a308af3d28a9201a643c0ac7bb3 \ + --hash=sha256:6400b22e4e41cc27623a9a75630b7719579cd9a3a2027bcf16ad5aaa9a7806c0 \ + --hash=sha256:6b602e3351f59f3999e9fb8b87e5b95cb2faab6a6ecdb482382ac6fdfbee5266 \ + --hash=sha256:75cd5d48389a7635393ff5a9214b90695c06b3d74912109c3b00ce7392b69c6c \ + --hash=sha256:7ad59e2e16578b6c1a2873e4888134112365605b08a6067dd91e899e026efa1c \ + --hash=sha256:7b7778a205f956755e05721eebf9f11a6ac18b2409bff5db53ce5fe7ede79831 \ + --hash=sha256:842c49dd584aedd75c2ee05f6c950730c3ffcddd21c5824ed0f820808387e1e3 \ + --hash=sha256:90fe429285b171bcc252e21515703bdc2a4721008d1f13aa5b7150336f8a8493 \ + --hash=sha256:91cd87d1de0111eaca11ccc3d31af441c753fa2bc22df72e5009cfb0a1af5b03 \ + --hash=sha256:9a1df8c93a0dd9cef0839917f0c6c49f46c75810cf8852be49884da4a7de3c59 \ + --hash=sha256:9ebe49c3960aa2219292ea2e5df6acdc425fc828f2f3d50b4cfae1692bcb5f02 \ + --hash=sha256:a28fe28c359835f3be20c89efd517b35e8f97dbb2ca09c6cf0d9ac07f62d7ef6 \ + --hash=sha256:a36ea43919e51b0de0c0bc52bcfdad7683f6ea9fb81b340cdabb9df0e045e0f7 \ + --hash=sha256:a505ecc0642f52e7c65afb02cc6181377d833b7df0994ecde15943b18d0fa89c \ + --hash=sha256:a79abdb404d9256afb8aeaa0d3a4bc7d3b6d8b66103d8b0f2f91febd3909976e \ + --hash=sha256:c211e8ec81522ce87b0b39f0cf0712c998d4305a030459a0e115a2b3dc71598f \ + --hash=sha256:dd4ed12a775f2cde4519f4267d3601990a97d8ecde5c944ab06bfd6e8e8ea177 \ + --hash=sha256:e37621b37c73b034997b5116678862f38ee70e5a054821c7b19d0e55df270dec \ + --hash=sha256:e93978993a2ad0af43f132be3ea8805f56b2f2cd223403ec28d3e7d5c6d39ed1 + # via + # alembic + # dataset sqlparse==0.4.2 \ --hash=sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae \ --hash=sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d # via # django # django-debug-toolbar +srsly==2.4.1 \ + --hash=sha256:129c85db752b5945c6398a1952294e03b7d20fa111eb7fd1083c4a6b1d02f7c7 \ + --hash=sha256:178aa6d350c9cfedb8adadb5e1f96b7aadde203d088917063415fcd689eb6e42 \ + --hash=sha256:20f11d5d6ae29e3cc97e93c862d7bf8b75023668daf1ac5892598c512302e5d3 \ + --hash=sha256:76b11e0ec0056bda4ad009b6e0db37f3ad0005a0501d587080023d4312ad2ada \ + --hash=sha256:867d1154ff7b60043584fe048de9b6d9a7d5a7fc61437850922ae4bd46d3be16 \ + --hash=sha256:869fdcf664edf20cd374cf1add869d67960061276478025a5887e080d8f99e1c \ + --hash=sha256:9625a584b26e522b6afb7c24be8783228ff44d7ac624e500020b0b888e09c6b6 \ + --hash=sha256:b0f2aec0a329e6e7e742a0a60e99a74968ca29be71f35c5c4de221e328176926 \ + --hash=sha256:b1bd4a55bafbb8cf86be15bf18aa2ba2c953161ad71ce7d2dae0c141201a7d89 \ + --hash=sha256:cefe06912f3944b5729d555ee110f434a0787843c6676b90f4987ff7a0a69500 \ + --hash=sha256:e896d516ca2e2e89cc01df8c9c8b1528701d6f49e9c814332582cc701af64a91 \ + --hash=sha256:f7c3374184bfb1aa852bcb8e45747b02f2dde0ebe62b4ddf4b0141affeab32e1 \ + --hash=sha256:ff36dc01df8890a239e5d15cffa3ae3b272c19e5ae279840f2d30085d361c20a + # via + # spacy + # thinc stevedore==3.4.0 \ --hash=sha256:59b58edb7f57b11897f150475e7bc0c39c5381f0b8e3fa9f5c20ce6c89ec4aa1 \ --hash=sha256:920ce6259f0b2498aaa4545989536a27e4e4607b8318802d7ddc3a533d3d069e @@ -1245,6 +1665,21 @@ swapper==1.1.2.post1 \ termcolor==1.1.0 \ --hash=sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b # via -r requirements.in +thinc==8.0.10 \ + --hash=sha256:1019c7e4715d95ebf482d0fed0557b2cae266faed84185d5fd955e9269847f35 \ + --hash=sha256:128f4f98d85b3657036387cf2886c3b871a4fb5a099198d7c8911b19167302a6 \ + --hash=sha256:1b3c523f85bf7d546446e8f0c71f3da35d2595cbef300fccca80004f64cd0b49 \ + --hash=sha256:1ec20c02c731846c76197270e6780fd06050dbce317d7b5532a4cd659ce5abd0 \ + --hash=sha256:5ef232642683268bc90d609dba9be9cc1e811fdea5a93b371d04afd8523c0418 \ + --hash=sha256:5f2fcbc805b27b55d31ad865450ec97433a667c2ddcc3c8a56a664425e52df37 \ + --hash=sha256:6740d750f69cbfc11c4c5e76d2c77616e3cae6a7b2778f6a680767c816407648 \ + --hash=sha256:908912f2d36cf7826d7b2c466e7faa5922972c2a4f0c3a5a7d8f3dd791c80921 \ + --hash=sha256:933ebbb417d3f0fe35376500f8f068ba4bcc9528b63bd71bfa0ed0a9e137a9c2 \ + --hash=sha256:99fedb3350366a70fa09de6fd2fab1c0affc58892febd9c42dac57e8364f3b8c \ + --hash=sha256:b5e4db8d24e6be8a5f1e4a17854772b79a2b560224519f50a21f3951ca24001f \ + --hash=sha256:c3553601642a4e27c4ec9d205941948bf913d34779f0b075d48790a02df4c7fb \ + --hash=sha256:df40bf1e07bcc72278939c9af831257bb7932b74b824cef27e38b6634a103699 + # via spacy toml==0.10.2 \ --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b \ --hash=sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f @@ -1255,26 +1690,88 @@ tomli==1.2.1 \ --hash=sha256:8dd0e9524d6f386271a36b41dbf6c57d8e32fd96fd22b6584679dc569d20899f \ --hash=sha256:a5b75cb6f3968abb47af1b40c1819dc519ea82bcc065776a866e8d74c5ca9442 # via black +tqdm==4.62.3 \ + --hash=sha256:8dd278a422499cd6b727e6ae4061c40b48fce8b76d1ccbf5d34fca9b7f925b0c \ + --hash=sha256:d359de7217506c9851b7869f3708d8ee53ed70a1b8edbba4dbcb47442592920d + # via spacy +trio==0.19.0 \ + --hash=sha256:895e318e5ec5e8cea9f60b473b6edb95b215e82d99556a03eb2d20c5e027efe1 \ + --hash=sha256:c27c231e66336183c484fbfe080fa6cc954149366c15dc21db8b7290081ec7b8 + # via + # selenium + # trio-websocket +trio-websocket==0.9.2 \ + --hash=sha256:5b558f6e83cc20a37c3b61202476c5295d1addf57bd65543364e0337e37ed2bc \ + --hash=sha256:a3d34de8fac26023eee701ed1e7bf4da9a8326b61a62934ec9e53b64970fd8fe + # via selenium +typed-ast==1.4.3 \ + --hash=sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace \ + --hash=sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff \ + --hash=sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266 \ + --hash=sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528 \ + --hash=sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6 \ + --hash=sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808 \ + --hash=sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4 \ + --hash=sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363 \ + --hash=sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341 \ + --hash=sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04 \ + --hash=sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41 \ + --hash=sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e \ + --hash=sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3 \ + --hash=sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899 \ + --hash=sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805 \ + --hash=sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c \ + --hash=sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c \ + --hash=sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39 \ + --hash=sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a \ + --hash=sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3 \ + --hash=sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7 \ + --hash=sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f \ + --hash=sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075 \ + --hash=sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0 \ + --hash=sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40 \ + --hash=sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428 \ + --hash=sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927 \ + --hash=sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3 \ + --hash=sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f \ + --hash=sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65 + # via black +typer==0.4.0 \ + --hash=sha256:63c3aeab0549750ffe40da79a1b524f60e08a2cbc3126c520ebf2eeaf507f5dd \ + --hash=sha256:d81169725140423d072df464cad1ff25ee154ef381aaf5b8225352ea187ca338 + # via + # pathy + # spacy typing-extensions==3.10.0.2 \ --hash=sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e \ --hash=sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7 \ --hash=sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34 # via # -r requirements.in + # anyio + # asgiref # black + # catalogue # gitpython # pydantic + # spacy + # structlog + # thinc tzlocal==3.0 \ --hash=sha256:c736f2540713deb5938d789ca7c3fc25391e9a20803f05b60ec64987cf086559 \ --hash=sha256:f4e6e36db50499e0d92f79b67361041f048e2609d166e93456b50746dc4aef12 # via rfc5424-logging-handler -uritemplate==4.0.0 \ - --hash=sha256:6f4c5b093c915d269df69f291028a72dfdcaf68c8345b92e180f31daf53c4971 \ - --hash=sha256:9de62e39c3f7f7584982a4159d70e6aafda5a479a91cccc18e89ae865eab4ae4 +unidecode==1.3.2 \ + --hash=sha256:215fe33c9d1c889fa823ccb66df91b02524eb8cc8c9c80f9c5b8129754d27829 \ + --hash=sha256:669898c1528912bcf07f9819dc60df18d057f7528271e31f8ec28cc88ef27504 + # via -r requirements.in +uritemplate==4.1.1 \ + --hash=sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0 \ + --hash=sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e # via # coreapi # drf-yasg -urllib3==1.26.7 \ +urllib3[secure]==1.26.7 \ --hash=sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece \ --hash=sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844 # via @@ -1284,6 +1781,12 @@ w3lib==1.22.0 \ --hash=sha256:0161d55537063e00d95a241663ede3395c4c6d7b777972ba2fd58bbab2001e53 \ --hash=sha256:0ad6d0203157d61149fd45aaed2e24f53902989c32fc1dccc2e2bfba371560df # via parsel +wasabi==0.8.2 \ + --hash=sha256:a493e09d86109ec6d9e70d040472f9facc44634d4ae6327182f94091ca73a490 \ + --hash=sha256:b4a36aaa9ca3a151f0c558f269d442afbb3526f0160fd541acd8a0d5e5712054 + # via + # spacy + # thinc webencodings==0.5.1 \ --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 @@ -1292,53 +1795,74 @@ whitenoise==5.3.0 \ --hash=sha256:d234b871b52271ae7ed6d9da47ffe857c76568f11dd30e28e18c5869dbd11e12 \ --hash=sha256:d963ef25639d1417e8a247be36e6aedd8c7c6f0a08adcb5a89146980a96b577c # via -r requirements.in -wrapt==1.13.1 \ - --hash=sha256:04312fbf51e9dd15261228e6b4bed0c0ed5723ccf986645d2c7308511dccba35 \ - --hash=sha256:04a00cef5d1b9e0e8db997816437b436e859106283c4771a40c4de4759344765 \ - --hash=sha256:0b2cbe418beeff3aadb3afc39a67d3f5f6a3eb020ceb5f2bcf56bef14b33629a \ - --hash=sha256:19b2c992668c9ca764899bae52987a04041ebc21859d2646db0b27e089c2fd6b \ - --hash=sha256:1b46e4fe0f9efbfaf1ee82fc79f9cb044c69b67b181c58370440d396fe40736e \ - --hash=sha256:21c1710f61aa95b4be83a32b6d6facbb0efdfac22dee65e1caa72a83deed7cda \ - --hash=sha256:2d18618440df6bc072762625e9c843d32a7328347c321b89f8df3a7c4a72ce6c \ - --hash=sha256:2f6fbea8936ba862425664fc689182a8ef50a6d88cd49f3cd073eccd3e78c930 \ - --hash=sha256:3658ae9c704906cab5865a00c1aa9e1fd3555074d1a4462fa1742d7fea8260ae \ - --hash=sha256:3816922f0941f1637869a04e25d1e5261dfa55cc6b39c73872cbf192ea562443 \ - --hash=sha256:40fd2cebad4010787de4221ec27a650635eed3e49e4bbfa8244fc34836cc2457 \ - --hash=sha256:4f3f99bb8eed5d394bbb898c5191ed91ebf21187d52b2c45895733ae2798f373 \ - --hash=sha256:5dc6c8cfaf4ff2a4632f8f97d29f555d6951eb0f905d3d47b3fd69bddb653214 \ - --hash=sha256:6aa687da5565674c9696fafd2b8d44a04fb697ec2431af21c3def9cbedc4082a \ - --hash=sha256:6b81913fdba96e286f0c6007eb61f0158e64a1941bfc72fee61b34a4f8f9877f \ - --hash=sha256:6c241b4ef0744590ae0ee89305743977e478200cff961bdcc6b3d0530aea3377 \ - --hash=sha256:77fef0bfdc612f5f30e43392a9f67dddaf4f48f299421bf25f910d0f47173f3d \ - --hash=sha256:7929ce97be2f7c49f454a6f8e014225e53cc3767fe48cce94b188de2225232ac \ - --hash=sha256:8055f8cc9a80dc1db01f31af6399b83f597ec164f07b7251d2a1bf1c6c025190 \ - --hash=sha256:836c73f53a0cefc7ba10c6f4a0d78894cb4876f56035fe500b029e0a1ae0ffe9 \ - --hash=sha256:8a184c655bb41295a9b0c28745a1b762c0c86025e43808b7e814f9cedc6c563d \ - --hash=sha256:8a6ba1b00d07f5a90a2d2eb1804a42e2067a6145b7745a8297664a75a8a232ba \ - --hash=sha256:909a80ce028821c7ad01bdcaa588126825931d177cdccd00b3545818d4a195ce \ - --hash=sha256:947a8d9d7829364e11eca88af18394713c8f98571cbc672b12545977d837f054 \ - --hash=sha256:95c9fcfc326fdd3e2fd264e808f6474ca7ffd253feb3a505ee5ceb4d78216ef7 \ - --hash=sha256:972099fa9cf4e43c255701c78ec5098c2fec4d6ea669a110b3414a158e772b0a \ - --hash=sha256:97f016514ceac524832e7d1bd41cf928b992ebe0324d59736f84ad5f4bbe0632 \ - --hash=sha256:9d200716eb4bb1d73f47f3ccc4f98fdf979dcc82d752183828f1be2e332b6874 \ - --hash=sha256:9f839c47698052ef5c2c094e21f8a06d0828aebe52d20cdb505faa318c62e886 \ - --hash=sha256:aa637733f1d599077522f6a1f0c6c40389aa90a44cba37afcefef26f8e53d28f \ - --hash=sha256:b0eed9b295039a619f64667f27cffbffcfc0559073d562700912ca6266bc8b28 \ - --hash=sha256:b1137e6aef3ac267c2af7d3af0266ef3f8dd1e5cde67b8eac9fa3b94e7fa0ada \ - --hash=sha256:b41ce8ee3825634e67883dd4dab336f95d0cc9d223fb7e224dcd36d66af93694 \ - --hash=sha256:bc42803987eb46b5fc67ec9a072df15a72ee9db61e3b7dd955d82581bf141f60 \ - --hash=sha256:bd705e341baccc3d1ef20e790b1f6383bd4ae92a77ba87a86ece8189fab8793c \ - --hash=sha256:c803526c0d3fa426e06de379b4eb56102234f2dc3c3a24a500d7962a83ca6166 \ - --hash=sha256:cb0b12b365b054bee2a53078a67df81781be0686cc3f3ab8bbdd16b2e188570a \ - --hash=sha256:d0ae90fd60c7473e437b0dd48ae323c11f631fe47c243056f9e7505d26e8e2f6 \ - --hash=sha256:db0daf2afca9f3b3a76e96ecb5f55ba82615ec584471d7aa27c1bdeb9e3888bb \ - --hash=sha256:e2eb4f38441b56698b4d40d48fd331e4e8a0477264785d08cbced63813d4bd29 \ - --hash=sha256:e5a0727ea56de6e9a17693589bcf913d6bf1ec49f12d4671993321f3325fda4f \ - --hash=sha256:ec803c9d6e4ce037201132d903ff8b0dd26c9688be50ce4c77c420c076e78ff7 \ - --hash=sha256:f1e2cea943192e24070b65bda862901c02bdf7c6abcd66ef5381ad6511921067 \ - --hash=sha256:f4377eda306b488255ea4336662cd9015a902d6dc2ed77a3e4c1e3b42387453a \ - --hash=sha256:fd5320bf61a2e8d3b46d9e183323293c9a695df8f38c98d17c45e1846758f9a9 +wordcloud==1.8.1 \ + --hash=sha256:2d5f63cf1f65126d6d1b8d55acae15961c5bd55e6ef8978bf269831dafcd1408 \ + --hash=sha256:2e1fc5991f52a0e191873025f5d8cf852eb1c39f2579d43e6d2589dc04d620d9 \ + --hash=sha256:2e85b1a6b8211436d47f902837c866c682c5d00046706f1d8e72cc0cd9210d64 \ + --hash=sha256:41dafafe3768675ba8285d21ac68bd53191b50da85aba2a7fb35964d1649156f \ + --hash=sha256:6450f67c207f2ab4513c4aac803226427b39f7fc8d3498c0b41a03834b2fc426 \ + --hash=sha256:6ff0ca777c801cd2a38deef30019f02fe35df1be9c31f6c301a34bd45006e26b \ + --hash=sha256:90e9cff2c6939b5e1fa87d2a2c5d79c8ac2eafc4c9b9bc1bcb865ca5fde7e758 \ + --hash=sha256:9ed09d2d2916514845e42b0cc5dd86f65d4f0f89ab4bf164cc9a628d9db5a76b \ + --hash=sha256:a02b27400bc4b2e4efdd8377e8cd138496b6b6e15a082d9c7b7c7b74a9ee8a55 \ + --hash=sha256:a4a626df47eacec207988e1ffdb5bd16b2b62ac83ea2442a0043080c0c5103ac \ + --hash=sha256:cd8c44a21a3207da813c7b7e486ed41fe517eb7b8535deef945437f4cea2b245 \ + --hash=sha256:daa7d72f0004fcfea5f649f1683dbe47c4a9c5f721aabeb41278a4ee33f21424 \ + --hash=sha256:e0d3f03e4f27faf543859b4bcd229d320361d065cf4786f149081adea4ee68e8 \ + --hash=sha256:e6ef771aac17c1cf8558c8d5ef025796184066d7b78f8118aefe011fb0d22952 \ + --hash=sha256:f190eb3efcc17765a4ed9d78001fdb713988886b93e54b2758fcf4f6c519ad51 \ + --hash=sha256:f49f5213e978fb5d8ff8f6e6067de657e81ca863cab549b198579f58e1430e7c + # via -r requirements.in +wrapt==1.13.2 \ + --hash=sha256:0473d1558b93e314e84313cc611f6c86be779369f9d3734302bf185a4d2625b1 \ + --hash=sha256:0582180566e7a13030f896c2f1ac6a56134ab5f3c3f4c5538086f758b1caf3f2 \ + --hash=sha256:15eee0e6fd07f48af2f66d0e6f2ff1916ffe9732d464d5e2390695296872cad9 \ + --hash=sha256:1c5c4cf188b5643a97e87e2110bbd4f5bc491d54a5b90633837b34d5df6a03fe \ + --hash=sha256:1eb657ed84f4d3e6ad648483c8a80a0cf0a78922ef94caa87d327e2e1ad49b48 \ + --hash=sha256:22142afab65daffc95863d78effcbd31c19a8003eca73de59f321ee77f73cadb \ + --hash=sha256:283e402e5357e104ac1e3fba5791220648e9af6fb14ad7d9cc059091af2b31d2 \ + --hash=sha256:3de7b4d3066cc610054e7aa2c005645e308df2f92be730aae3a47d42e910566a \ + --hash=sha256:3e0d16eedc242d01a6f8cf0623e9cdc3b869329da3f97a15961d8864111d8cf0 \ + --hash=sha256:3e33c138d1e3620b1e0cc6fd21e46c266393ed5dae0d595b7ed5a6b73ed57aa0 \ + --hash=sha256:3f87042623530bcffea038f824b63084180513c21e2e977291a9a7e65a66f13b \ + --hash=sha256:53c6706a1bcfb6436f1625511b95b812798a6d2ccc51359cd791e33722b5ea32 \ + --hash=sha256:593cb049ce1c391e0288523b30426c4430b26e74c7e6f6e2844bd99ac7ecc831 \ + --hash=sha256:6e6d1a8eeef415d7fb29fe017de0e48f45e45efd2d1bfda28fc50b7b330859ef \ + --hash=sha256:724ed2bc9c91a2b9026e5adce310fa60c6e7c8760b03391445730b9789b9d108 \ + --hash=sha256:728e2d9b7a99dd955d3426f237b940fc74017c4a39b125fec913f575619ddfe9 \ + --hash=sha256:7574de567dcd4858a2ffdf403088d6df8738b0e1eabea220553abf7c9048f59e \ + --hash=sha256:8164069f775c698d15582bf6320a4f308c50d048c1c10cf7d7a341feaccf5df7 \ + --hash=sha256:81a4cf257263b299263472d669692785f9c647e7dca01c18286b8f116dbf6b38 \ + --hash=sha256:82223f72eba6f63eafca87a0f614495ae5aa0126fe54947e2b8c023969e9f2d7 \ + --hash=sha256:8318088860968c07e741537030b1abdd8908ee2c71fbe4facdaade624a09e006 \ + --hash=sha256:83f2793ec6f3ef513ad8d5b9586f5ee6081cad132e6eae2ecb7eac1cc3decae0 \ + --hash=sha256:87ee3c73bdfb4367b26c57259995935501829f00c7b3eed373e2ad19ec21e4e4 \ + --hash=sha256:8860c8011a6961a651b1b9f46fdbc589ab63b0a50d645f7d92659618a3655867 \ + --hash=sha256:9adee1891253670575028279de8365c3a02d3489a74a66d774c321472939a0b1 \ + --hash=sha256:a0cdedf681db878416c05e1831ec69691b0e6577ac7dca9d4f815632e3549580 \ + --hash=sha256:a70d876c9aba12d3bd7f8f1b05b419322c6789beb717044eea2c8690d35cb91b \ + --hash=sha256:ada5e29e59e2feb710589ca1c79fd989b1dd94d27079dc1d199ec954a6ecc724 \ + --hash=sha256:af9480de8e63c5f959a092047aaf3d7077422ded84695b3398f5d49254af3e90 \ + --hash=sha256:b20703356cae1799080d0ad15085dc3213c1ac3f45e95afb9f12769b98231528 \ + --hash=sha256:bc85d17d90201afd88e3d25421da805e4e135012b5d1f149e4de2981394b2a52 \ + --hash=sha256:bff0a59387a0a2951cb869251257b6553663329a1b5525b5226cab8c88dcbe7e \ + --hash=sha256:c65e623ea7556e39c4f0818200a046cbba7575a6b570ff36122c276fdd30ab0a \ + --hash=sha256:c6ee5f8734820c21b9b8bf705e99faba87f21566d20626568eeb0d62cbeaf23c \ + --hash=sha256:c7ac2c7a8e34bd06710605b21dd1f3576764443d68e069d2afba9b116014d072 \ + --hash=sha256:ccb34ce599cab7f36a4c90318697ead18312c67a9a76327b3f4f902af8f68ea1 \ + --hash=sha256:d0d717e10f952df7ea41200c507cc7e24458f4c45b56c36ad418d2e79dacd1d4 \ + --hash=sha256:d90520616fce71c05dedeac3a0fe9991605f0acacd276e5f821842e454485a70 \ + --hash=sha256:dca56cc5963a5fd7c2aa8607017753f534ee514e09103a6c55d2db70b50e7447 \ + --hash=sha256:df3eae297a5f1594d1feb790338120f717dac1fa7d6feed7b411f87e0f2401c7 \ + --hash=sha256:e634136f700a21e1fcead0c137f433dde928979538c14907640607d43537d468 \ + --hash=sha256:fbad5ba74c46517e6488149514b2e2348d40df88cd6b52a83855b7a8bf04723f \ + --hash=sha256:fbe6aebc9559fed7ea27de51c2bf5c25ba2a4156cf0017556f72883f2496ee9a \ + --hash=sha256:fdede980273aeca591ad354608778365a3a310e0ecdd7a3587b38bc5be9b1808 # via deprecated +wsproto==1.0.0 \ + --hash=sha256:868776f8456997ad0d9720f7322b746bbe9193751b5b290b7f924659377c8c38 \ + --hash=sha256:d8345d1808dd599b5ffb352c25a367adb6157e664e140dbecba3f9bc007edb9f + # via trio-websocket xxhash==2.0.2 \ --hash=sha256:00aaf882036d2a0fa7652cf9aeaaf2ad077b784c09ef8d60f5d97ebf0d47ffa1 \ --hash=sha256:04ae5706ddfe0fd2b46cd0b6487d3edae7e724e27d732b055ffd0f9539c4afc5 \ @@ -1408,7 +1932,10 @@ xxhash==2.0.2 \ zipp==3.6.0 \ --hash=sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832 \ --hash=sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc - # via importlib-metadata + # via + # catalogue + # importlib-metadata + # importlib-resources zope.event==4.5.0 \ --hash=sha256:2666401939cdaa5f4e0c08cf7f20c9b21423b95e88f4675b1443973bdb080c42 \ --hash=sha256:5e76517f5b9b119acf37ca8819781db6c16ea433f7e2062c4afc2b6fbedb1330 @@ -1477,5 +2004,7 @@ setuptools==58.2.0 \ # gunicorn # josepy # safety + # spacy + # thinc # zope.event # zope.interface diff --git a/siteapp/settings_application.py b/siteapp/settings_application.py index 9ae81ace3..bab17d8ce 100644 --- a/siteapp/settings_application.py +++ b/siteapp/settings_application.py @@ -15,6 +15,7 @@ 'discussion', 'controls', 'system_settings', + 'nlp', 'loadtesting', ] diff --git a/siteapp/urls.py b/siteapp/urls.py index ebfc17c7f..792f04670 100644 --- a/siteapp/urls.py +++ b/siteapp/urls.py @@ -31,6 +31,9 @@ # incoming email hook for responses to notifications url(r'^notification_reply_email_hook$', views_landing.notification_reply_email_hook, name='notifications'), + # NLP + url(r"^nlp/", include("nlp.urls")), + # Django rest framework # path('api/', include(router.urls)), path('api-auth/', include('rest_framework.urls', namespace='rest_framework')), diff --git a/templates/nlp/index.html b/templates/nlp/index.html new file mode 100644 index 000000000..675933aec --- /dev/null +++ b/templates/nlp/index.html @@ -0,0 +1,69 @@ +{% extends "base.html" %} +{% load humanize %} +{% load guardian_tags %} +{% load static %} +{% load q %} + +{% block title %} +{{ portfolio.title }} NLP +{% endblock %} + +{% block head %} + +{% endblock %} + +Remove contextbar from top of page +{% block contextbar %}{% endblock %} + +% block body-wide % +{% block body %} + +
+
+ +
+
+ +
+

NLP Test page

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

 

+ +
+
{{ catalog.catalog_key_display }}
+
+ + +
+
+ +{{ block.super }} +{% endblock %} + +{% block scripts %} + +{% endblock %} From eed9f104b65c332e9c2ba6c9b0180397f55dbb7f Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Sun, 17 Oct 2021 08:44:39 -0500 Subject: [PATCH 02/88] Fixing references --- nlp/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nlp/views.py b/nlp/views.py index c3a4984f6..c2337df77 100644 --- a/nlp/views.py +++ b/nlp/views.py @@ -41,8 +41,8 @@ from siteapp.models import Project, Organization, Tag from siteapp.settings import GOVREADY_URL from system_settings.models import SystemSettings -from .models import * -from .utilities import * +# from .models import * +# from .utilities import * logging.basicConfig() import structlog From f4943478998164cf033241f47af6b8357c121827 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Sun, 17 Oct 2021 09:00:13 -0500 Subject: [PATCH 03/88] Fixing references 2 --- nlp/views.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/nlp/views.py b/nlp/views.py index c2337df77..7b2382e7d 100644 --- a/nlp/views.py +++ b/nlp/views.py @@ -41,8 +41,6 @@ from siteapp.models import Project, Organization, Tag from siteapp.settings import GOVREADY_URL from system_settings.models import SystemSettings -# from .models import * -# from .utilities import * logging.basicConfig() import structlog From 7f98b99b55f456c05cc64dbbe9a660e475cf32fb Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Sun, 17 Oct 2021 11:24:50 -0500 Subject: [PATCH 04/88] Update CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b20f9ebf..52342b761 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,11 @@ GovReady-Q Release Notes v0.9.11.7-dev (October xx, 2021) -------------------------------- +**Developer changes** +* Add Django `nlp` app to system to support Natural Language Processing of SSPs and statements. +* Include spaCy libraries as part of build. +* Include initial, simplified candidate entity recognition script. v0.9.11.6 (October 13, 2021) From c959766d0568e84df450f505cf024744b07ef4f7 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Mon, 18 Oct 2021 16:15:43 -0500 Subject: [PATCH 05/88] Fix settings.py for reactNavbar --- siteapp/settings.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/siteapp/settings.py b/siteapp/settings.py index 3b04f2cdc..463fe1e5d 100644 --- a/siteapp/settings.py +++ b/siteapp/settings.py @@ -500,6 +500,22 @@ def make_secret_key(): INSTALLED_APPS.append(environment["branding"]) TEMPLATES[0].setdefault('DIRS', []) \ .insert(0, os.path.join(environment["branding"], 'templates')) + + +def get_environment_bool(var, default=False): + return True if os.getenv(var, default) in [True, "True", "TRUE", "true"] else False + + +DOCKER = get_environment_bool("docker") + +if not DOCKER: + # Depreciated + HEADLESS = not get_environment_bool("test_visible") + SELENIUM_BROWSER = "chrome" +else: + HEADLESS = get_environment_bool("selenium-headless") + SELENIUM_BROWSER = environment.get("selenium-grid-browser", "chrome") + def get_environment_bool(var, default=False): return True if os.getenv(var, default) in [True, "True", "TRUE", "true"] else False From 659a0ea9daa93b31a310b83295fe11b8a6801dad Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Mon, 18 Oct 2021 16:17:15 -0500 Subject: [PATCH 06/88] Fix tests --- siteapp/tests.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/siteapp/tests.py b/siteapp/tests.py index 011f32eba..bb68b2e9a 100644 --- a/siteapp/tests.py +++ b/siteapp/tests.py @@ -25,7 +25,7 @@ import selenium.webdriver from selenium.webdriver.remote.command import Command from django.urls import reverse -from selenium.common.exceptions import WebDriverException, NoSuchElementException +from selenium.common.exceptions import WebDriverException from selenium.webdriver import DesiredCapabilities from django.contrib.auth.models import Permission from django.contrib.staticfiles.testing import StaticLiveServerTestCase @@ -62,7 +62,7 @@ def wait_for_sleep_after(fn): while True: try: return fn() - except (AssertionError, WebDriverException, NoSuchElementException) as e: + except (AssertionError, WebDriverException) as e: if time.time() - start_time > MAX_WAIT: raise e time.sleep(0.5) From aa005a724eac70f849b9a0f4ad42da8d0109836c Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Mon, 18 Oct 2021 19:10:41 -0500 Subject: [PATCH 07/88] Remove duplicate code block. Update requirements. --- requirements.txt | 119 +++++++++++++++----------------------------- siteapp/settings.py | 13 ----- 2 files changed, 40 insertions(+), 92 deletions(-) diff --git a/requirements.txt b/requirements.txt index 854381a22..7e85c8aa5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -49,7 +49,9 @@ backports.zoneinfo==0.2.1 \ --hash=sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08 \ --hash=sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac \ --hash=sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2 - # via tzlocal + # via + # pytz-deprecation-shim + # tzlocal banal==1.0.6 \ --hash=sha256:2fe02c9305f53168441948f4a03dfbfa2eacc73db30db4a93309083cb0e250a5 \ --hash=sha256:877aacb16b17f8fa4fd29a7c44515c5a23dc1a7b26078bc41dd34829117d85e1 @@ -597,14 +599,6 @@ importlib-metadata==1.7.0 \ # via # -r requirements.in # alembic - # argcomplete - # click - # cssutils - # django-bootstrap3 - # importlib-resources - # jsonschema - # sqlalchemy - # stevedore importlib-resources==1.5.0 \ --hash=sha256:6f87df66833e1942667108628ec48900e02a4ab4ad850e25fbf07cb17cf734ca \ --hash=sha256:85dc0b9b325ff78c8bef2e4ff42616094e16b98ebd5e3b50fe7e2f0bbcdcde49 @@ -961,28 +955,28 @@ packaging==21.0 \ # drf-yasg # safety # spacy -pandas==1.3.3 \ - --hash=sha256:272c8cb14aa9793eada6b1ebe81994616e647b5892a370c7135efb2924b701df \ - --hash=sha256:3334a5a9eeaca953b9db1b2b165dcdc5180b5011f3bec3a57a3580c9c22eae68 \ - --hash=sha256:37d63e78e87eb3791da7be4100a65da0383670c2b59e493d9e73098d7a879226 \ - --hash=sha256:3f5020613c1d8e304840c34aeb171377dc755521bf5e69804991030c2a48aec3 \ - --hash=sha256:45649503e167d45360aa7c52f18d1591a6d5c70d2f3a26bc90a3297a30ce9a66 \ - --hash=sha256:49fd2889d8116d7acef0709e4c82b8560a8b22b0f77471391d12c27596e90267 \ - --hash=sha256:4def2ef2fb7fcd62f2aa51bacb817ee9029e5c8efe42fe527ba21f6a3ddf1a9f \ - --hash=sha256:53e2fb11f86f6253bb1df26e3aeab3bf2e000aaa32a953ec394571bec5dc6fd6 \ - --hash=sha256:629138b7cf81a2e55aa29ce7b04c1cece20485271d1f6c469c6a0c03857db6a4 \ - --hash=sha256:68408a39a54ebadb9014ee5a4fae27b2fe524317bc80adf56c9ac59e8f8ea431 \ - --hash=sha256:7326b37de08d42dd3fff5b7ef7691d0fd0bf2428f4ba5a2bdc3b3247e9a52e4c \ - --hash=sha256:7557b39c8e86eb0543a17a002ac1ea0f38911c3c17095bc9350d0a65b32d801c \ - --hash=sha256:86b16b1b920c4cb27fdd65a2c20258bcd9c794be491290660722bb0ea765054d \ - --hash=sha256:a800df4e101b721e94d04c355e611863cc31887f24c0b019572e26518cbbcab6 \ - --hash=sha256:a9f1b54d7efc9df05320b14a48fb18686f781aa66cc7b47bb62fabfc67a0985c \ - --hash=sha256:c399200631db9bd9335d013ec7fce4edb98651035c249d532945c78ad453f23a \ - --hash=sha256:e574c2637c9d27f322e911650b36e858c885702c5996eda8a5a60e35e6648cf2 \ - --hash=sha256:e9bc59855598cb57f68fdabd4897d3ed2bc3a3b3bef7b868a0153c4cd03f3207 \ - --hash=sha256:ebbed7312547a924df0cbe133ff1250eeb94cdff3c09a794dc991c5621c8c735 \ - --hash=sha256:ed2f29b4da6f6ae7c68f4b3708d9d9e59fa89b2f9e87c2b64ce055cbd39f729e \ - --hash=sha256:f7d84f321674c2f0f31887ee6d5755c54ca1ea5e144d6d54b3bbf566dd9ea0cc +pandas==1.3.4 \ + --hash=sha256:003ba92db58b71a5f8add604a17a059f3068ef4e8c0c365b088468d0d64935fd \ + --hash=sha256:10e10a2527db79af6e830c3d5842a4d60383b162885270f8cffc15abca4ba4a9 \ + --hash=sha256:22808afb8f96e2269dcc5b846decacb2f526dd0b47baebc63d913bf847317c8f \ + --hash=sha256:2d1dc09c0013d8faa7474574d61b575f9af6257ab95c93dcf33a14fd8d2c1bab \ + --hash=sha256:35c77609acd2e4d517da41bae0c11c70d31c87aae8dd1aabd2670906c6d2c143 \ + --hash=sha256:372d72a3d8a5f2dbaf566a5fa5fa7f230842ac80f29a931fb4b071502cf86b9a \ + --hash=sha256:42493f8ae67918bf129869abea8204df899902287a7f5eaf596c8e54e0ac7ff4 \ + --hash=sha256:5298a733e5bfbb761181fd4672c36d0c627320eb999c59c65156c6a90c7e1b4f \ + --hash=sha256:5ba0aac1397e1d7b654fccf263a4798a9e84ef749866060d19e577e927d66e1b \ + --hash=sha256:a2aa18d3f0b7d538e21932f637fbfe8518d085238b429e4790a35e1e44a96ffc \ + --hash=sha256:a388960f979665b447f0847626e40f99af8cf191bce9dc571d716433130cb3a7 \ + --hash=sha256:a51528192755f7429c5bcc9e80832c517340317c861318fea9cea081b57c9afd \ + --hash=sha256:b528e126c13816a4374e56b7b18bfe91f7a7f6576d1aadba5dee6a87a7f479ae \ + --hash=sha256:c1aa4de4919358c5ef119f6377bc5964b3a7023c23e845d9db7d9016fa0c5b1c \ + --hash=sha256:c2646458e1dce44df9f71a01dc65f7e8fa4307f29e5c0f2f92c97f47a5bf22f5 \ + --hash=sha256:d47750cf07dee6b55d8423471be70d627314277976ff2edd1381f02d52dbadf9 \ + --hash=sha256:d99d2350adb7b6c3f7f8f0e5dfb7d34ff8dd4bc0a53e62c445b7e43e163fce63 \ + --hash=sha256:dd324f8ee05925ee85de0ea3f0d66e1362e8c80799eb4eb04927d32335a3e44a \ + --hash=sha256:eaca36a80acaacb8183930e2e5ad7f71539a66805d6204ea88736570b2876a7b \ + --hash=sha256:f567e972dce3bbc3a8076e0b675273b4a9e8576ac629149cf8286ee13c259ae5 \ + --hash=sha256:fe48e4925455c964db914b958f6e7032d285848b7538a5e1b19aeb26ffaea3ec # via -r requirements.in paramiko==2.8.0 \ --hash=sha256:def3ec612399bab4e9f5eb66b0ae5983980db9dd9120d9e9c6ea3ff673865d1c \ @@ -1323,6 +1317,10 @@ pytz==2021.3 \ # fs # pandas # rfc5424-logging-handler +pytz-deprecation-shim==0.1.0.post0 \ + --hash=sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6 \ + --hash=sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d + # via tzlocal pyyaml==6.0 \ --hash=sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293 \ --hash=sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b \ @@ -1650,9 +1648,9 @@ srsly==2.4.1 \ # via # spacy # thinc -stevedore==3.4.0 \ - --hash=sha256:59b58edb7f57b11897f150475e7bc0c39c5381f0b8e3fa9f5c20ce6c89ec4aa1 \ - --hash=sha256:920ce6259f0b2498aaa4545989536a27e4e4607b8318802d7ddc3a533d3d069e +stevedore==3.5.0 \ + --hash=sha256:a547de73308fd7e90075bb4d301405bebf705292fa90a90fc3bcf9133f58616c \ + --hash=sha256:f40253887d8712eaa2bb0ea3830374416736dc8ec0e22f5a65092c1174c44335 # via bandit structlog==21.2.0 \ --hash=sha256:63a7111a32e5b615671536bb745692ea02cebfea2b39dcb7d2617eed19437cfe \ @@ -1704,38 +1702,6 @@ trio-websocket==0.9.2 \ --hash=sha256:5b558f6e83cc20a37c3b61202476c5295d1addf57bd65543364e0337e37ed2bc \ --hash=sha256:a3d34de8fac26023eee701ed1e7bf4da9a8326b61a62934ec9e53b64970fd8fe # via selenium -typed-ast==1.4.3 \ - --hash=sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace \ - --hash=sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff \ - --hash=sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266 \ - --hash=sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528 \ - --hash=sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6 \ - --hash=sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808 \ - --hash=sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4 \ - --hash=sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363 \ - --hash=sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341 \ - --hash=sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04 \ - --hash=sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41 \ - --hash=sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e \ - --hash=sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3 \ - --hash=sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899 \ - --hash=sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805 \ - --hash=sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c \ - --hash=sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c \ - --hash=sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39 \ - --hash=sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a \ - --hash=sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3 \ - --hash=sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7 \ - --hash=sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f \ - --hash=sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075 \ - --hash=sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0 \ - --hash=sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40 \ - --hash=sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428 \ - --hash=sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927 \ - --hash=sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3 \ - --hash=sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f \ - --hash=sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65 - # via black typer==0.4.0 \ --hash=sha256:63c3aeab0549750ffe40da79a1b524f60e08a2cbc3126c520ebf2eeaf507f5dd \ --hash=sha256:d81169725140423d072df464cad1ff25ee154ef381aaf5b8225352ea187ca338 @@ -1748,18 +1714,16 @@ typing-extensions==3.10.0.2 \ --hash=sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34 # via # -r requirements.in - # anyio - # asgiref # black - # catalogue # gitpython # pydantic - # spacy - # structlog - # thinc -tzlocal==3.0 \ - --hash=sha256:c736f2540713deb5938d789ca7c3fc25391e9a20803f05b60ec64987cf086559 \ - --hash=sha256:f4e6e36db50499e0d92f79b67361041f048e2609d166e93456b50746dc4aef12 +tzdata==2021.2.post0 \ + --hash=sha256:99d30a01967bb8d7868c03dc924862b1ae8a0e649a322a1107bacc1723c430b9 \ + --hash=sha256:a843aabf67dea3dc6bbbc8853e1aee6563e74bcfe920e11a571a389155db1401 + # via pytz-deprecation-shim +tzlocal==4.0 \ + --hash=sha256:02a29b12b3bb30bc33d0f0184dcf32944bf41d3f0aa1c7c21a9621ca4326b260 \ + --hash=sha256:5db620b69afe121b5c640cb8914fb6303233284ac4b263660c4146f6248e2639 # via rfc5424-logging-handler unidecode==1.3.2 \ --hash=sha256:215fe33c9d1c889fa823ccb66df91b02524eb8cc8c9c80f9c5b8129754d27829 \ @@ -1932,10 +1896,7 @@ xxhash==2.0.2 \ zipp==3.6.0 \ --hash=sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832 \ --hash=sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc - # via - # catalogue - # importlib-metadata - # importlib-resources + # via importlib-metadata zope.event==4.5.0 \ --hash=sha256:2666401939cdaa5f4e0c08cf7f20c9b21423b95e88f4675b1443973bdb080c42 \ --hash=sha256:5e76517f5b9b119acf37ca8819781db6c16ea433f7e2062c4afc2b6fbedb1330 diff --git a/siteapp/settings.py b/siteapp/settings.py index 463fe1e5d..003fb74ff 100644 --- a/siteapp/settings.py +++ b/siteapp/settings.py @@ -505,7 +505,6 @@ def make_secret_key(): def get_environment_bool(var, default=False): return True if os.getenv(var, default) in [True, "True", "TRUE", "true"] else False - DOCKER = get_environment_bool("docker") if not DOCKER: @@ -516,18 +515,6 @@ def get_environment_bool(var, default=False): HEADLESS = get_environment_bool("selenium-headless") SELENIUM_BROWSER = environment.get("selenium-grid-browser", "chrome") -def get_environment_bool(var, default=False): - return True if os.getenv(var, default) in [True, "True", "TRUE", "true"] else False - - -DOCKER = get_environment_bool("docker") - -HEADLESS = not environment.get("test_visible") -if not DOCKER: - SELENIUM_BROWSER = "chrome" -else: - SELENIUM_BROWSER = environment.get("test_browser", "chrome") - DOS = True if system() == "Windows" or 'Microsoft' in uname().release else False # Load all additional settings from settings_application.py. from .settings_application import * From 700eca9226bbb5afcd4f8bacef78afaed8e3d92a Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Tue, 19 Oct 2021 19:57:17 -0500 Subject: [PATCH 08/88] Improve appearance of toast messages --- templates/base.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/base.html b/templates/base.html index 794924c06..8d3cf301f 100644 --- a/templates/base.html +++ b/templates/base.html @@ -70,9 +70,9 @@ {% for message in messages %} {# Django levels are: debug (map to Boostrap 'info'), info, success, warning, error (map to Boostrap 'danger') #} {% if message.level_tag != "success" %}{# Skip success messages #} -
+
- {{ message }}   + {{ message }} 
{% endif %} {% endfor %} From 722069631f54185347eef1094cc3840458ce2209 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Tue, 19 Oct 2021 19:58:45 -0500 Subject: [PATCH 09/88] Improve appearance of toast messages --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0491f8627..17fdbb3eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ v0.9.11.7-dev (October xx, 2021) **UI changes** * Use left side vertical React navigation menu for project. +* Improve toast message appearance by limiting width. v0.9.11.6 (October 13, 2021) From be4bd0c426f58e480201368ecb765bdd958bca22 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Tue, 19 Oct 2021 22:16:02 -0500 Subject: [PATCH 10/88] Improve appearance of toast messages - fix styles --- siteapp/static/css/govready-q.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/siteapp/static/css/govready-q.css b/siteapp/static/css/govready-q.css index d20557112..a5ed2efea 100644 --- a/siteapp/static/css/govready-q.css +++ b/siteapp/static/css/govready-q.css @@ -164,7 +164,8 @@ div.question-answer[data-reviewed] a { text-decoration: underline; } .dropdown-menu { width: 300px; } .nav-dropdown-item-text { margin: 0px 12px 8px 20px; } .nav-profile { margin: -5px 5px; } -.message-margin { margin-top: 0em; position:absolute; right: 0px; top: 52px; z-index: 100;} +.message-margin { margin-top: 0em; margin-bottom: 0px; padding: 0px; position:absolute; right: 0px; top: 52px; z-index: 100; width: 340px;} +.toast-msg { width: 340px; margin: 0px;} .footer-row { width: 768px; margin: auto; border-top: 1px solid #eee; padding-top: 24px; } .invite-message-size { width: 100%; height: 4em; } From 1c2ba01042d78818b1a0b1b1eb96fd561995e89c Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Wed, 20 Oct 2021 05:26:27 -0500 Subject: [PATCH 11/88] Rename speedy ssp module groups --- .../q-files/speedyssp/app.yaml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/q-files/vendors/govready/govready-q-files-startpack/q-files/speedyssp/app.yaml b/q-files/vendors/govready/govready-q-files-startpack/q-files/speedyssp/app.yaml index 65706ed72..d3439bcb1 100644 --- a/q-files/vendors/govready/govready-q-files-startpack/q-files/speedyssp/app.yaml +++ b/q-files/vendors/govready/govready-q-files-startpack/q-files/speedyssp/app.yaml @@ -1,7 +1,7 @@ id: app title: Speedy SSP type: project -version: 1.8 +version: 1.9 icon: speedy.png introduction: format: markdown @@ -20,7 +20,7 @@ catalog: status: stub vendor: GovReady vendor_url: ~ - version: 1.8 + version: 1.9 parameters: - id: catalog_key value: NIST_SP-800-53_rev4 @@ -34,7 +34,7 @@ questions: type: module icon: system_info.png module-id: speedy_ssp_basic_info - group: Speedy SSP + group: System Information #SSP Template - id: ssp_intro @@ -42,7 +42,7 @@ questions: icon: ssp_icon.png title: System Security Plan type: module - group: Speedy SSP + group: System Information #Additional Information for Speedy SSP - id: speedy_ssp_additional_info @@ -50,11 +50,11 @@ questions: type: module icon: test_plan_new.png module-id: speedy_ssp_additional_info - group: Speedy SSP + group: System Information - id: system_info_technical title: System Profile - Technical type: module icon: system_info.png module-id: system_info_technical - group: System Info + group: System Technical Information From a012f5ecfbff971f0419608fd1def5bf2d56e705 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Wed, 20 Oct 2021 05:52:44 -0500 Subject: [PATCH 12/88] Remove full text search of smts from compt library search --- CHANGELOG.md | 1 + controls/views.py | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17fdbb3eb..7b9e1582d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ v0.9.11.7-dev (October xx, 2021) * Add Django `nlp` app to system to support Natural Language Processing of SSPs and statements. * Include spaCy libraries as part of build. * Include initial, simplified candidate entity recognition script. +* Remove full text search of statements from component library search because it was slow and returned to many results. **UI changes** diff --git a/controls/views.py b/controls/views.py index 327ad6a88..8136bd95b 100644 --- a/controls/views.py +++ b/controls/views.py @@ -409,9 +409,7 @@ def component_library(request): query = request.GET.get('search') if query: try: - element_list = Element.objects.filter(Q(name__icontains=query) | Q(tags__label__icontains=query) - | Q(pk__in=set(Statement.objects.filter(body__search=query).values_list('producer_element', flat=True))) - ).exclude(element_type='system').distinct() + element_list = Element.objects.filter(Q(name__icontains=query) | Q(tags__label__icontains=query)).exclude(element_type='system').distinct() except: logger.info(f"Ah, you are not using Postgres for your Database!") element_list = Element.objects.filter(Q(name__icontains=query) | Q(tags__label__icontains=query)).exclude(element_type='system').distinct() From bf9b179c6bb064566923ad3d71d92871d476f3b3 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Sat, 23 Oct 2021 22:28:54 -0500 Subject: [PATCH 13/88] fixing tests on develop --- siteapp/settings.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/siteapp/settings.py b/siteapp/settings.py index 003fb74ff..3b04f2cdc 100644 --- a/siteapp/settings.py +++ b/siteapp/settings.py @@ -500,20 +500,17 @@ def make_secret_key(): INSTALLED_APPS.append(environment["branding"]) TEMPLATES[0].setdefault('DIRS', []) \ .insert(0, os.path.join(environment["branding"], 'templates')) - - def get_environment_bool(var, default=False): - return True if os.getenv(var, default) in [True, "True", "TRUE", "true"] else False + return True if os.getenv(var, default) in [True, "True", "TRUE", "true"] else False + DOCKER = get_environment_bool("docker") +HEADLESS = not environment.get("test_visible") if not DOCKER: - # Depreciated - HEADLESS = not get_environment_bool("test_visible") - SELENIUM_BROWSER = "chrome" + SELENIUM_BROWSER = "chrome" else: - HEADLESS = get_environment_bool("selenium-headless") - SELENIUM_BROWSER = environment.get("selenium-grid-browser", "chrome") + SELENIUM_BROWSER = environment.get("test_browser", "chrome") DOS = True if system() == "Windows" or 'Microsoft' in uname().release else False # Load all additional settings from settings_application.py. From cc59f45d2b47f38cde35e1623f1eaeb9f8bb5607 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Sat, 23 Oct 2021 22:48:17 -0500 Subject: [PATCH 14/88] Fix settings.py to fix tests --- siteapp/settings.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/siteapp/settings.py b/siteapp/settings.py index 003fb74ff..3b04f2cdc 100644 --- a/siteapp/settings.py +++ b/siteapp/settings.py @@ -500,20 +500,17 @@ def make_secret_key(): INSTALLED_APPS.append(environment["branding"]) TEMPLATES[0].setdefault('DIRS', []) \ .insert(0, os.path.join(environment["branding"], 'templates')) - - def get_environment_bool(var, default=False): - return True if os.getenv(var, default) in [True, "True", "TRUE", "true"] else False + return True if os.getenv(var, default) in [True, "True", "TRUE", "true"] else False + DOCKER = get_environment_bool("docker") +HEADLESS = not environment.get("test_visible") if not DOCKER: - # Depreciated - HEADLESS = not get_environment_bool("test_visible") - SELENIUM_BROWSER = "chrome" + SELENIUM_BROWSER = "chrome" else: - HEADLESS = get_environment_bool("selenium-headless") - SELENIUM_BROWSER = environment.get("selenium-grid-browser", "chrome") + SELENIUM_BROWSER = environment.get("test_browser", "chrome") DOS = True if system() == "Windows" or 'Microsoft' in uname().release else False # Load all additional settings from settings_application.py. From 72b1736e38a25165fe072a3e14e996c9875508d7 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Sat, 23 Oct 2021 23:12:32 -0500 Subject: [PATCH 15/88] Silent compliance app missing README warning --- guidedmodules/app_loading.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guidedmodules/app_loading.py b/guidedmodules/app_loading.py index 819c3665c..a601f6f33 100644 --- a/guidedmodules/app_loading.py +++ b/guidedmodules/app_loading.py @@ -105,7 +105,7 @@ def load_app_into_database(app, update_mode=AppImportUpdateMode.CreateInstance, appinst.catalog_metadata\ .setdefault("description", {})["long"] = readme except fs.errors.ResourceNotFound: - logger.error(event="read_from_readme.md", msg="Failed to read README.md") + pass # Update appinst. It may have been modified by extract_catalog_metadata # and by the loading of a README.md file. From e179a6ca4e7fce956e9fa40581a6ff0701b873b0 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Sun, 24 Oct 2021 11:42:46 -0500 Subject: [PATCH 16/88] Always display start project in app-store.html to fix tests --- siteapp/tests.py | 2 +- templates/app-store.html | 48 +++++++++++++++++++--------------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/siteapp/tests.py b/siteapp/tests.py index bb68b2e9a..ed224ea97 100644 --- a/siteapp/tests.py +++ b/siteapp/tests.py @@ -464,7 +464,7 @@ def _new_project(self): wait_for_sleep_after(lambda: self.click_element("#new-project")) - var_sleep(2) + var_sleep(1) # Click Add Button wait_for_sleep_after(lambda: self.click_element(".app[data-app='project/simple_project'] .start-app")) wait_for_sleep_after(lambda: self.assertRegex(self.browser.title, "I want to answer some questions on Q.")) diff --git a/templates/app-store.html b/templates/app-store.html index 787e97491..973ee3ca2 100644 --- a/templates/app-store.html +++ b/templates/app-store.html @@ -169,32 +169,30 @@

{{ app.title }}

- {% if app.icon %} -
- App Icon -
- {# Offer quick start button if user can only start the app in a single organization context. #} - {% if app.organizations|length >= 1 %} -
- {% csrf_token %} - {% if app.organizations|length > 1 %} - - {% endif %} - {% with app.organizations|first as first_org %} - - {% endwith %} - {% if 'portfolio' in forward_qsargs %}{% endif %} - -
+
+ {% if app.icon %}App Icon{% endif %} +
+ {# Offer quick start button if user can only start the app in a single organization context. #} + {% if app.organizations|length >= 1 %} +
+ {% csrf_token %} + {% if app.organizations|length > 1 %} + {% endif %} - More... -
-
- {% endif %} + {% with app.organizations|first as first_org %} + + {% endwith %} + {% if 'portfolio' in forward_qsargs %}{% endif %} + + + {% endif %} + More... +
+
From 5a7594314efba1a4eb52d4149f123131da8b3144 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Sun, 24 Oct 2021 12:20:38 -0500 Subject: [PATCH 17/88] Include disabling docker-compose v2 in docs for MacOS --- dev_env/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dev_env/README.md b/dev_env/README.md index ce938e754..722007bfc 100644 --- a/dev_env/README.md +++ b/dev_env/README.md @@ -10,6 +10,13 @@ This also assumes you can run as root/administrator. This is due to ports being Allocate to Docker as much Memory, Swap, and CPUS as you can. For example, GovReady-Q performs much better on a 2015 Quad-Core MacBook Pro with CPUs: 3, Memory: 9GB, SWAP: 4GB, and Disk image size: 50+GB. +## Docker on Mac Notes + +For Docker version 20.x on MacOS, disable docker-compose v-2 to avoid blocking automated restart of docker after code changes when in "dev" mode. + +```bash +docker-compose disable-v2 +``` ## How To 1. Configure From 742595267c6dde82054949c021563678ddb9f931 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Tue, 9 Nov 2021 05:11:48 -0600 Subject: [PATCH 18/88] Show module questions single page for better authoring --- guidedmodules/urls.py | 3 + guidedmodules/views.py | 43 ++++++++ templates/questions.html | 211 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 257 insertions(+) create mode 100644 templates/questions.html diff --git a/guidedmodules/urls.py b/guidedmodules/urls.py index 1a056bc8d..3b7390f66 100644 --- a/guidedmodules/urls.py +++ b/guidedmodules/urls.py @@ -7,6 +7,9 @@ urlpatterns = [ url(r'^(\d+)/([\w_-]+)(/_save)()$', guidedmodules.views.save_answer), + + url(r'^(\d+)/([\w_-]+)/questions/$', guidedmodules.views.show_questions), + url(r'^(\d+)/([\w_-]+)(/question/)([\w_-]+)$', guidedmodules.views.show_question), url(r'^(\d+)/([\w_-]+)(/question/)([\w_-]+)/history/(\d+)/media$', guidedmodules.views.download_answer_file), url(r'^(\d+)/([\w_-]+)(/finished)()$', guidedmodules.views.task_finished), diff --git a/guidedmodules/views.py b/guidedmodules/views.py index 0c37efbde..0ffb06762 100644 --- a/guidedmodules/views.py +++ b/guidedmodules/views.py @@ -625,6 +625,49 @@ def redirect_to(): # Return the response. return response +def show_questions(request, task_id, module): + + print(0, "====", f"request: {request.__dict__}") + print(1, "====", f"task_id: {task_id}") + print(2, "====", f"module: {module}") + + task = Task.objects.get(pk=task_id) + module_id = task.module_id + module = task.module + module_questions = module.questions.all() + import json + questions_list = "
".join([json.dumps(q.spec, indent=2) for q in module.questions.all()]) + # module_questions = task.module.questions.all() + + print(3, "====", f"module_questions: {module_questions}") + + + # quick hack to render prompt correctly + # What's the title/h1 of the page and the rest of the prompt? Render the + # prompt field. If it starts with a paragraph, turn that paragraph into + # the title. + for q in module_questions: + pass + # title = q.spec["title"] + # prompt = render_markdown_field("prompt", "html") + # m = re.match(r"^

([\w\W]*?)

\s*", prompt) + # if m: + # title = m.group(1) + # prompt = prompt[m.end():] + + context = {} + context.update({ + "module": module, + "module_questions": module_questions, + # "q": q, + # "title": title, + # "prompt": prompt, + }) + + # return HttpResponse(f"rendering show_questions
{task.__dict__}
{questions_list}
") + return render(request, "questions.html", context) + + @task_view def show_question(request, task, answered, context, q): # Let's talk about where the data is for this question. The 'q' diff --git a/templates/questions.html b/templates/questions.html new file mode 100644 index 000000000..26586143a --- /dev/null +++ b/templates/questions.html @@ -0,0 +1,211 @@ +{% extends "task-base.html" %} +{% load static %} +{% load q %} + +{% block title %} +Next Question: {{q.spec.title}} | {{task.title}} +{% endblock %} + +{% block head %} + + +{% if q.spec.type == "longtext" %} + +{% endif %} + +{{block.super}} + + +{% endblock %} + +{% block body %} +{{block.super}} + + +

{{ module.spec.title }}

+ +{% for q in module_questions %} +
+
+ + + + +
+
+ + + +

{{ forloop.counter }}

+
{{ q.spec.prompt|safe }}
+

{{ q.spec.type }}

+ + + + +
+
+
+
+{% endfor %} + +{% include "task-question-debug-links.html" %} + +{% if authoring_tool_enabled %} +{# should be in body so that it comes before the global error modal so that ajax errors show on top of this #} +{% include "authoring-tool-modal.html" %} +{% endif %} + +{% endblock %} + +{% block scripts %} + {{ block.super }} + + +{% endblock %} From 578dfbbe322fd309447661011bbc86047b5e60a9 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Fri, 12 Nov 2021 07:18:48 -0600 Subject: [PATCH 19/88] Simpler display question display; jquery target multiple forms. --- guidedmodules/views.py | 6 ++- templates/questions.html | 80 +++++++++++++++++++++++++++++++++------- 2 files changed, 72 insertions(+), 14 deletions(-) diff --git a/guidedmodules/views.py b/guidedmodules/views.py index 0ffb06762..7ee0c5f6f 100644 --- a/guidedmodules/views.py +++ b/guidedmodules/views.py @@ -634,7 +634,7 @@ def show_questions(request, task_id, module): task = Task.objects.get(pk=task_id) module_id = task.module_id module = task.module - module_questions = module.questions.all() + module_questions = module.questions.all().order_by('definition_order') import json questions_list = "
".join([json.dumps(q.spec, indent=2) for q in module.questions.all()]) # module_questions = task.module.questions.all() @@ -659,6 +659,10 @@ def show_questions(request, task_id, module): context.update({ "module": module, "module_questions": module_questions, + "authoring_tool_enabled": False, + "task": task, + "system": task.project.system, + "ADMIN_ROOT_URL": settings.SITE_ROOT_URL + "/admin", # "q": q, # "title": title, # "prompt": prompt, diff --git a/templates/questions.html b/templates/questions.html index 26586143a..b2161ce50 100644 --- a/templates/questions.html +++ b/templates/questions.html @@ -107,30 +107,49 @@ font-size: 1.0em; } + textarea { + padding: 12px 12px 12px 12px; + } + + input, textarea, select { + margin-bottom: 8px; + } + {% endblock %} {% block body %} {{block.super}} - -

{{ module.spec.title }}

+
{{ module_questions|length }} questions
{% for q in module_questions %} + +
 
-
- - - +
-
+ + +
+
-

{{ forloop.counter }}

-
{{ q.spec.prompt|safe }}
-

{{ q.spec.type }}

+
+ +
+ +
+
+ +
+ +
+ +
+
@@ -179,6 +198,7 @@

{{ module.spec.title }}

+ +
+ +
+ +
+
+ +

 

+
+ +
+ +
+ {% if user.is_staff %}{% endif %} +
DB Record
{% if user.is_staff %}
{% endif %} +
Add question
+
@@ -197,10 +234,27 @@

{{ module.spec.title }}

{% include "task-question-debug-links.html" %} -{% if authoring_tool_enabled %} +{# if authoring_tool_enabled #} {# should be in body so that it comes before the global error modal so that ajax errors show on top of this #} {% include "authoring-tool-modal.html" %} -{% endif %} + + + + + +{# endif #} {% endblock %} From c45e3b329145d303cbca07da98b4a9dda0b25b56 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Fri, 12 Nov 2021 07:24:18 -0600 Subject: [PATCH 20/88] clean up --- templates/questions.html | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/templates/questions.html b/templates/questions.html index b2161ce50..a6410b24c 100644 --- a/templates/questions.html +++ b/templates/questions.html @@ -121,7 +121,7 @@ {% block body %} {{block.super}} -
{{ module_questions|length }} questions
+
Edit "{{ task.title }}" module's {{ module_questions|length }} questions
{% for q in module_questions %} @@ -243,13 +243,10 @@ $('.comment-form').on('submit', function(e) { e.preventDefault(); - // var test2 = $(this).find('input[name="test2"]').val(); - // console.log(test2); var test2 = $(this).find('textarea[name="question_prompt"]').val(); console.log(test2); - // var question_prompt = $(this).find('.question-prompt').html(); - // console.log(question_prompt); + alert('question_prompt: '+test2); }); From ed1e0b689300ba7bebe0c893f14fdfd30ef73cee Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Fri, 12 Nov 2021 07:30:44 -0600 Subject: [PATCH 21/88] Fix label alignment --- templates/questions.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/templates/questions.html b/templates/questions.html index a6410b24c..9dd9a5d48 100644 --- a/templates/questions.html +++ b/templates/questions.html @@ -115,6 +115,10 @@ margin-bottom: 8px; } + label { + margin-top: 8px; + } + {% endblock %} From 422771abe5770f4622b71e2b5cb44fe17b27db8d Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Sat, 13 Nov 2021 08:47:38 -0600 Subject: [PATCH 22/88] Start serializing form data --- guidedmodules/views.py | 8 ++++---- templates/questions.html | 22 +++++++++++++++++++++- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/guidedmodules/views.py b/guidedmodules/views.py index 7ee0c5f6f..b843823f3 100644 --- a/guidedmodules/views.py +++ b/guidedmodules/views.py @@ -627,9 +627,9 @@ def redirect_to(): def show_questions(request, task_id, module): - print(0, "====", f"request: {request.__dict__}") - print(1, "====", f"task_id: {task_id}") - print(2, "====", f"module: {module}") + # print(0, "====", f"request: {request.__dict__}") + # print(1, "====", f"task_id: {task_id}") + # print(2, "====", f"module: {module}") task = Task.objects.get(pk=task_id) module_id = task.module_id @@ -639,7 +639,7 @@ def show_questions(request, task_id, module): questions_list = "
".join([json.dumps(q.spec, indent=2) for q in module.questions.all()]) # module_questions = task.module.questions.all() - print(3, "====", f"module_questions: {module_questions}") + # print(3, "====", f"module_questions: {module_questions}") # quick hack to render prompt correctly diff --git a/templates/questions.html b/templates/questions.html index 9dd9a5d48..1c4dd7f5e 100644 --- a/templates/questions.html +++ b/templates/questions.html @@ -250,7 +250,27 @@ var test2 = $(this).find('textarea[name="question_prompt"]').val(); console.log(test2); - alert('question_prompt: '+test2); + + + var data = $(this).serializeArray(); + console.log(data); + // alert('data: '+data); + data.push( { name: "task", value: {{ task.id }} } ); + // data.push( { name: "question", value: q_authoring_tool_state.current_question } ); + // ajax_with_indicator({ + // url: "/tasks/_authoring_tool/edit-question", + // method: "POST", + // data: data, + // keep_indicator_forever: true, // keep the ajax indicator up forever --- it'll go away when we issue the redirect + // success: function(res) { + // // Modal can stay up until the redirect finishes. + // window.location = res.redirect; + // if (window.location.hash.length > 1) + // window.location.reload(); // if there is a # in the URL, the browser won't actually reload + // } + // }) + + }); From 78589c60fc5b76874735e67a0f769784063e0516 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Sun, 14 Nov 2021 08:15:53 -0600 Subject: [PATCH 23/88] Basic saving of prompt changes --- guidedmodules/models.py | 4 +++ guidedmodules/urls.py | 7 +++-- guidedmodules/views.py | 51 +++++++++++++++++++++++++++++++++++ templates/questions.html | 57 +++++++++++++++++++++------------------- 4 files changed, 90 insertions(+), 29 deletions(-) diff --git a/guidedmodules/models.py b/guidedmodules/models.py index 54700d1d9..b41ef19a0 100644 --- a/guidedmodules/models.py +++ b/guidedmodules/models.py @@ -705,6 +705,10 @@ def get_absolute_url_to_question(self, question): import urllib.parse return self.get_absolute_url() + "/question/" + urllib.parse.quote(question.key) + def get_absolute_url_to_questions(self, question): + import urllib.parse + return self.get_absolute_url() + "/questions/" + def get_static_asset_url(self, asset_path, use_data_urls=False): if asset_path not in self.module.app.asset_paths: # This path is not an asset, so just return the path as it's probably an absolute URL. diff --git a/guidedmodules/urls.py b/guidedmodules/urls.py index 3b7390f66..01435c19c 100644 --- a/guidedmodules/urls.py +++ b/guidedmodules/urls.py @@ -6,10 +6,13 @@ import guidedmodules.views urlpatterns = [ - url(r'^(\d+)/([\w_-]+)(/_save)()$', guidedmodules.views.save_answer), - url(r'^(\d+)/([\w_-]+)/questions/$', guidedmodules.views.show_questions), + # multi-question authoring tool + url(r'^(\d+)/([\w_-]+)/questions/$', guidedmodules.views.show_questions, name="show_questions"), + url(r'^_authoring_tool/edit-question-new$', guidedmodules.views.authoring_edit_question_new), + # question management urls + url(r'^(\d+)/([\w_-]+)(/_save)()$', guidedmodules.views.save_answer), url(r'^(\d+)/([\w_-]+)(/question/)([\w_-]+)$', guidedmodules.views.show_question), url(r'^(\d+)/([\w_-]+)(/question/)([\w_-]+)/history/(\d+)/media$', guidedmodules.views.download_answer_file), url(r'^(\d+)/([\w_-]+)(/finished)()$', guidedmodules.views.task_finished), diff --git a/guidedmodules/views.py b/guidedmodules/views.py index b843823f3..22fcce99c 100644 --- a/guidedmodules/views.py +++ b/guidedmodules/views.py @@ -1762,6 +1762,57 @@ def authoring_new_question(request, task, mq): # changed, this sends the new key. return JsonResponse({ "status": "ok", "redirect": task.get_absolute_url_to_question(question) }) + +@transaction.atomic +def authoring_edit_question_new(request): + + # get task since we aren't using @authoring_tool_auth + task = get_object_or_404(Task, id=request.POST["task"]) + question = get_object_or_404(ModuleQuestion, module=task.module, key=request.POST['key']) + + print(1,"===","authoring_edit_question_new") + print(2,"===",request.POST) + print(3,"===question", question) + + try: + + # Get existing specification (json) for quesiton + spec = question.spec + # spec["id"] = request.POST['newid'] + for field in ("title", "prompt",): + value = request.POST.get(field, "").strip() + if value: + if field in ("min", "max"): + spec[field] = int(value) + elif field == "choices": + spec[field] = ModuleQuestion.choices_from_csv(value) + elif field == "protocol" and request.POST.get("module-id") != "/app/": + # The protocol value is only valid if "/app/" was chosen + # in the UI as the module type. It wasn't, so skip it. + continue + elif field == "protocol": + # The protocol value is given as a space-separated list of + # of protocols. + spec[field] = re.split(r"\s+", value) + else: + spec[field] = value + + # Save. + question.spec = spec + question.save() + + # Clear cache... + from .module_logic import clear_module_question_cache + clear_module_question_cache() + + # Return status. The browser will reload/redirect --- if the question key + # changed, this sends the new key. + return JsonResponse({ "status": "ok", "redirect": task.get_absolute_url_to_questions(question) }) + + except ValueError as e: + return JsonResponse({ "status": "error", "message": str(e) }) + + @authoring_tool_auth @transaction.atomic def authoring_edit_question(request, task): diff --git a/templates/questions.html b/templates/questions.html index 1c4dd7f5e..77655caa7 100644 --- a/templates/questions.html +++ b/templates/questions.html @@ -148,10 +148,18 @@
+
+ +
+ + Title for question shown in progress list and elsewhere. +
+
+
- +
- +
@@ -162,15 +170,8 @@ Prompt for question
- -
- -
- - Title for question shown in progress list and elsewhere. -
-
--> +
@@ -248,27 +249,29 @@ $('.comment-form').on('submit', function(e) { e.preventDefault(); - var test2 = $(this).find('textarea[name="question_prompt"]').val(); - console.log(test2); - + var prompt = $(this).find('textarea[name="prompt"]').val(); + console.log(prompt); var data = $(this).serializeArray(); - console.log(data); + // alert('data: '+data); data.push( { name: "task", value: {{ task.id }} } ); - // data.push( { name: "question", value: q_authoring_tool_state.current_question } ); - // ajax_with_indicator({ - // url: "/tasks/_authoring_tool/edit-question", - // method: "POST", - // data: data, - // keep_indicator_forever: true, // keep the ajax indicator up forever --- it'll go away when we issue the redirect - // success: function(res) { - // // Modal can stay up until the redirect finishes. - // window.location = res.redirect; - // if (window.location.hash.length > 1) - // window.location.reload(); // if there is a # in the URL, the browser won't actually reload - // } - // }) + data.push( { name: "question", value: $(this).find('input[name="key"]').val() } ); + + console.log(data); + + ajax_with_indicator({ + url: "/tasks/_authoring_tool/edit-question-new", + method: "POST", + data: data, + keep_indicator_forever: true, // keep the ajax indicator up forever --- it'll go away when we issue the redirect + success: function(res) { + // Modal can stay up until the redirect finishes. + window.location = res.redirect; + if (window.location.hash.length > 1) + window.location.reload(); // if there is a # in the URL, the browser won't actually reload + } + }) }); From b97d5e6f267432080ba0ecf8b129b3c9547d1498 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Sun, 14 Nov 2021 12:54:41 -0600 Subject: [PATCH 24/88] Save with AJAX working --- guidedmodules/views.py | 10 ++++------ templates/questions.html | 36 +++++++++++++++++++----------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/guidedmodules/views.py b/guidedmodules/views.py index 22fcce99c..6f23daa03 100644 --- a/guidedmodules/views.py +++ b/guidedmodules/views.py @@ -1770,10 +1770,6 @@ def authoring_edit_question_new(request): task = get_object_or_404(Task, id=request.POST["task"]) question = get_object_or_404(ModuleQuestion, module=task.module, key=request.POST['key']) - print(1,"===","authoring_edit_question_new") - print(2,"===",request.POST) - print(3,"===question", question) - try: # Get existing specification (json) for quesiton @@ -1797,7 +1793,7 @@ def authoring_edit_question_new(request): else: spec[field] = value - # Save. + # Save. question.spec = spec question.save() @@ -1807,7 +1803,9 @@ def authoring_edit_question_new(request): # Return status. The browser will reload/redirect --- if the question key # changed, this sends the new key. - return JsonResponse({ "status": "ok", "redirect": task.get_absolute_url_to_questions(question) }) + from django.core import serializers + serialized_obj = serializers.serialize('json', [question, ]) + return JsonResponse({ "status": "success", "message": "the message", "questionobj": serialized_obj }) except ValueError as e: return JsonResponse({ "status": "error", "message": str(e) }) diff --git a/templates/questions.html b/templates/questions.html index 77655caa7..1fc388dd5 100644 --- a/templates/questions.html +++ b/templates/questions.html @@ -135,7 +135,7 @@
-
+
@@ -223,6 +223,7 @@

 

+
@@ -248,32 +249,33 @@ $('.comment-form').on('submit', function(e) { e.preventDefault(); - - var prompt = $(this).find('textarea[name="prompt"]').val(); + var formElm = $(this) + var prompt = formElm.find('textarea[name="prompt"]').val(); console.log(prompt); - - var data = $(this).serializeArray(); - - // alert('data: '+data); + var data = formElm.serializeArray(); data.push( { name: "task", value: {{ task.id }} } ); - data.push( { name: "question", value: $(this).find('input[name="key"]').val() } ); - + data.push( { name: "question", value: formElm.find('input[name="key"]').val() } ); console.log(data); - ajax_with_indicator({ url: "/tasks/_authoring_tool/edit-question-new", method: "POST", data: data, - keep_indicator_forever: true, // keep the ajax indicator up forever --- it'll go away when we issue the redirect + keep_indicator_forever: false, // keep the ajax indicator up forever --- it'll go away when we issue the redirect success: function(res) { // Modal can stay up until the redirect finishes. - window.location = res.redirect; - if (window.location.hash.length > 1) - window.location.reload(); // if there is a # in the URL, the browser won't actually reload + console.log(res) + if (res['status'] == "success") { + formElm.find('.success-msg').fadeIn().text('saved') + } + // window.location = res.redirect; + // if (window.location.hash.length > 1) + // window.location.reload(); // if there is a # in the URL, the browser won't actually reload } - }) - - + }); + setTimeout(function () { + formElm.find('.success-msg').fadeOut().text(''); + }, 2000); + return false; // Stop form reloading page }); From c0129993917efec102b420da578b1278c0ec3b02 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Mon, 15 Nov 2021 06:03:35 -0600 Subject: [PATCH 25/88] Connect new authoring tool to store templates --- guidedmodules/models.py | 5 + guidedmodules/urls.py | 2 +- guidedmodules/views.py | 25 +--- siteapp/urls.py | 1 + siteapp/views.py | 11 ++ templates/app-store-item.html | 9 ++ templates/appversion_modules.html | 221 ++++++++++++++++++++++++++++++ templates/questions.html | 43 +++--- templates/task-base.html | 110 +++++++-------- 9 files changed, 329 insertions(+), 98 deletions(-) create mode 100644 templates/appversion_modules.html diff --git a/guidedmodules/models.py b/guidedmodules/models.py index b41ef19a0..2c0824314 100644 --- a/guidedmodules/models.py +++ b/guidedmodules/models.py @@ -182,6 +182,11 @@ def get_asset(self, asset_path): raise ValueError("{} is not an asset in {}.".format(asset_path, self)) return self.asset_files.get(source=self.source, content_hash=self.asset_paths[asset_path]).file + @property + def icon(self): + size = 128 + icon = image_to_dataurl(self.get_asset(self.catalog_metadata["icon"]), size) + def catalog_metadata_yaml(self): import rtyaml return rtyaml.dump(self.catalog_metadata) diff --git a/guidedmodules/urls.py b/guidedmodules/urls.py index 01435c19c..1b58a5114 100644 --- a/guidedmodules/urls.py +++ b/guidedmodules/urls.py @@ -8,7 +8,7 @@ urlpatterns = [ # multi-question authoring tool - url(r'^(\d+)/([\w_-]+)/questions/$', guidedmodules.views.show_questions, name="show_questions"), + url(r'^module/(\d+)/questions$', guidedmodules.views.show_module_questions, name="show_module_questions"), url(r'^_authoring_tool/edit-question-new$', guidedmodules.views.authoring_edit_question_new), # question management urls diff --git a/guidedmodules/views.py b/guidedmodules/views.py index 6f23daa03..775f0584d 100644 --- a/guidedmodules/views.py +++ b/guidedmodules/views.py @@ -625,15 +625,13 @@ def redirect_to(): # Return the response. return response -def show_questions(request, task_id, module): +def show_module_questions(request, module_id): + + module = Module.objects.get(pk=module_id) # print(0, "====", f"request: {request.__dict__}") - # print(1, "====", f"task_id: {task_id}") # print(2, "====", f"module: {module}") - task = Task.objects.get(pk=task_id) - module_id = task.module_id - module = task.module module_questions = module.questions.all().order_by('definition_order') import json questions_list = "
".join([json.dumps(q.spec, indent=2) for q in module.questions.all()]) @@ -641,11 +639,6 @@ def show_questions(request, task_id, module): # print(3, "====", f"module_questions: {module_questions}") - - # quick hack to render prompt correctly - # What's the title/h1 of the page and the rest of the prompt? Render the - # prompt field. If it starts with a paragraph, turn that paragraph into - # the title. for q in module_questions: pass # title = q.spec["title"] @@ -660,18 +653,12 @@ def show_questions(request, task_id, module): "module": module, "module_questions": module_questions, "authoring_tool_enabled": False, - "task": task, - "system": task.project.system, "ADMIN_ROOT_URL": settings.SITE_ROOT_URL + "/admin", - # "q": q, - # "title": title, - # "prompt": prompt, }) # return HttpResponse(f"rendering show_questions
{task.__dict__}
{questions_list}
") return render(request, "questions.html", context) - @task_view def show_question(request, task, answered, context, q): # Let's talk about where the data is for this question. The 'q' @@ -1766,9 +1753,9 @@ def authoring_new_question(request, task, mq): @transaction.atomic def authoring_edit_question_new(request): - # get task since we aren't using @authoring_tool_auth - task = get_object_or_404(Task, id=request.POST["task"]) - question = get_object_or_404(ModuleQuestion, module=task.module, key=request.POST['key']) + module = get_object_or_404(Module, id=request.POST["module_id"]) + # TODO: change to get use question id + question = get_object_or_404(ModuleQuestion, module=module, key=request.POST['key']) try: diff --git a/siteapp/urls.py b/siteapp/urls.py index 792f04670..d9ac9526f 100644 --- a/siteapp/urls.py +++ b/siteapp/urls.py @@ -52,6 +52,7 @@ # app store url(r'^store$', views.apps_catalog, name="store"), + url(r'^store/app/(?P.*)/modules$', views.apps_catalog_item_modules, name='apps_catalog_item_modules'), url(r'^store/(?P.*)/(?P.*)/zip$', views.apps_catalog_item_zip), url(r'^store/(?P.*)/(?P.*)$', views.apps_catalog_item), diff --git a/siteapp/views.py b/siteapp/views.py index 801fedaa9..e89017290 100644 --- a/siteapp/views.py +++ b/siteapp/views.py @@ -359,6 +359,7 @@ def get_compliance_apps_catalog_for_user(user): # Turn the organization sets into a list because the templates use |first. catalog = catalog.values() for app in catalog: + # print("\n\n app",app) app["organizations"] = sorted(app["organizations"], key=lambda org: org.name) return catalog @@ -408,6 +409,7 @@ def render_app_catalog_entry(appversion, appversions, organization): return { # app identification + "appversion_id": appversion.id, "appsource_id": appversion.source.id, "key": key, @@ -723,6 +725,15 @@ def apps_catalog_item(request, source_slug, app_name): "portfolio": portfolio }) +@login_required +def apps_catalog_item_modules(request, appversion_id): + + app = AppVersion.objects.get(pk=appversion_id) + + # Show the "app" modules + return render(request, "appversion_modules.html", { + "app": app, + }) @login_required def apps_catalog_item_zip(request, source_slug, app_name): diff --git a/templates/app-store-item.html b/templates/app-store-item.html index 76a166b73..964cd95a0 100644 --- a/templates/app-store-item.html +++ b/templates/app-store-item.html @@ -129,6 +129,9 @@

{{ app.title }}

+
@@ -180,6 +183,12 @@

{{ app.title }}

{% endif %}
+
+
AppVersion ID
+ {{app.appversion_id}} +
+
+
diff --git a/templates/appversion_modules.html b/templates/appversion_modules.html new file mode 100644 index 000000000..6a4591260 --- /dev/null +++ b/templates/appversion_modules.html @@ -0,0 +1,221 @@ +{% extends "base.html" %} +{% load static %} +{% load q %} + +{% block title %} +Modules +{% endblock %} + +{% block head %} + +{{block.super}} + + +{% endblock %} + +{% block body %} +{{block.super}} + +
+

+ {{ app.catalog_metadata.title }} + {% if app.icon %}App Icon{% endif %} +

+
Version {{ app.version_number }}
+
+
+

View and edit this template's {{ app.modules.all|length }} modules

+
+ +{% for m in app.modules.all %} +
+
+ +
+ + +
Module {{ forloop.counter0 }}
+
+ + +
+ +
+
+

{{m.spec.title}}

+
+
+ +

 

+
+
+ {{ m.questions.all|length }} question{{ m.questions.all|pluralize }} +
+
+ +

 

+
+
+ {{ m.spec.introduction.template }} +
+
+ +

 

+
+ {% if user.is_staff %}edit module questions{% endif %} +
+ + +
+
+
+{% endfor %} + + + + +{# endif #} + +{% endblock %} + +{% block scripts %} + {{ block.super }} + + +{% endblock %} diff --git a/templates/questions.html b/templates/questions.html index 1fc388dd5..e3e8a3f17 100644 --- a/templates/questions.html +++ b/templates/questions.html @@ -1,9 +1,9 @@ -{% extends "task-base.html" %} +{% extends "base.html" %} {% load static %} {% load q %} {% block title %} -Next Question: {{q.spec.title}} | {{task.title}} +Question editor {% endblock %} {% block head %} @@ -23,7 +23,7 @@ font-weight: bold; } -/* .form-control { + /* .form-control { font-size: 14pt; height: 34pt; }*/ @@ -125,17 +125,25 @@ {% block body %} {{block.super}} -
Edit "{{ task.title }}" module's {{ module_questions|length }} questions
-{% for q in module_questions %} - -
 
-
-
+
+

+ {{ module.app.catalog_metadata.title }} + {% if app.icon %}App Icon{% endif %} +

+
Version {{ module.app.version_number }}
+
+
+

Edit the {{ module_questions|length }} questions of module {{ module.title }}

+
+{% for q in module_questions %} +
+
+
Question {{ forloop.counter0 }}
@@ -152,7 +160,6 @@
- Title for question shown in progress list and elsewhere.
@@ -220,15 +227,16 @@
-

 

+

 

+
 
{% if user.is_staff %}{% endif %} -
DB Record
{% if user.is_staff %}
{% endif %} +
Edit database
{% if user.is_staff %}{% endif %}
Add question
@@ -238,13 +246,6 @@
{% endfor %} -{% include "task-question-debug-links.html" %} - -{# if authoring_tool_enabled #} -{# should be in body so that it comes before the global error modal so that ajax errors show on top of this #} -{% include "authoring-tool-modal.html" %} - - + {% endif %} +
+ {% endblock %} -
+ {% block scripts %} From 4eb189d4757dad457f4bc593ae6ba56a420156f7 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Wed, 17 Nov 2021 04:19:48 -0600 Subject: [PATCH 26/88] Improve performance displayin appversion modules --- siteapp/views.py | 8 +++++--- templates/appversion_modules.html | 10 +++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/siteapp/views.py b/siteapp/views.py index e89017290..be347092d 100644 --- a/siteapp/views.py +++ b/siteapp/views.py @@ -727,12 +727,14 @@ def apps_catalog_item(request, source_slug, app_name): @login_required def apps_catalog_item_modules(request, appversion_id): + """Reurn the modules for an appversion in catalog""" - app = AppVersion.objects.get(pk=appversion_id) + appversion = AppVersion.objects.get(pk=appversion_id) + modules = Module.objects.prefetch_related('questions').filter(app=appversion) - # Show the "app" modules return render(request, "appversion_modules.html", { - "app": app, + "appversion": appversion, + "modules": modules, }) @login_required diff --git a/templates/appversion_modules.html b/templates/appversion_modules.html index 6a4591260..3b1cb5198 100644 --- a/templates/appversion_modules.html +++ b/templates/appversion_modules.html @@ -122,16 +122,16 @@

- {{ app.catalog_metadata.title }} - {% if app.icon %}App Icon{% endif %} + {{ appversion.catalog_metadata.title }} + {% if appversion.icon %}App Icon{% endif %}

-
Version {{ app.version_number }}
+
Version {{ appversion.version_number }}
-

View and edit this template's {{ app.modules.all|length }} modules

+

View and edit this template's {{ appversion.modules.all|length }} modules

-{% for m in app.modules.all %} +{% for m in modules %}
From 7eb5dc21a764c60327698b329a00525cdcb1fe88 Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Wed, 17 Nov 2021 16:02:36 -0600 Subject: [PATCH 27/88] Serializers for Modules, ModuleQueestions --- api/base/urls.py | 2 +- api/guidedmodules/serializers/app.py | 3 ++ api/guidedmodules/serializers/modules.py | 39 ++++++++++++++++++--- api/guidedmodules/urls.py | 9 +++++ api/guidedmodules/views/module.py | 13 +++++++ api/guidedmodules/views/module_questions.py | 19 ++++++++++ 6 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 api/guidedmodules/views/module.py create mode 100644 api/guidedmodules/views/module_questions.py diff --git a/api/base/urls.py b/api/base/urls.py index a76c9cc09..07cdd952b 100644 --- a/api/base/urls.py +++ b/api/base/urls.py @@ -17,6 +17,6 @@ def get_swagger_urls(): return [ url(r'^docs/swagger(?P\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'), - url(r'^docs/swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui') + url(r'^docs/swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'), ] diff --git a/api/guidedmodules/serializers/app.py b/api/guidedmodules/serializers/app.py index 26bc7f6dc..266949415 100644 --- a/api/guidedmodules/serializers/app.py +++ b/api/guidedmodules/serializers/app.py @@ -24,6 +24,9 @@ class Meta: class SimpleAppVersionSourceSerializer(ReadOnlySerializer): + catalog_metadata = serializers.JSONField() + asset_paths = serializers.JSONField() + class Meta: model = AppVersion fields = ['appname', 'system_app', 'catalog_metadata', 'version_number', 'version_name', 'input_paths', diff --git a/api/guidedmodules/serializers/modules.py b/api/guidedmodules/serializers/modules.py index 434d4e6f0..e0f77ebe7 100644 --- a/api/guidedmodules/serializers/modules.py +++ b/api/guidedmodules/serializers/modules.py @@ -1,7 +1,7 @@ from rest_framework import serializers -from api.base.serializers.types import ReadOnlySerializer -from api.guidedmodules.serializers.app import DetailedAppVersionSerializer, SimpleAppSourceSerializer +from api.base.serializers.types import ReadOnlySerializer, WriteOnlySerializer +from api.guidedmodules.serializers.app import DetailedAppVersionSerializer, SimpleAppSourceSerializer, SimpleAppVersionSourceSerializer from guidedmodules.models import Module, ModuleAsset, ModuleQuestion from rest_framework_recursive.fields import RecursiveField @@ -16,7 +16,6 @@ class Meta: model = Module fields = ['module_name', 'spec'] - class DetailedModuleSerializer(SimpleModuleSerializer): source = SimpleAppSourceSerializer() app = DetailedAppVersionSerializer() @@ -42,15 +41,45 @@ class Meta: class SimpleModuleQuestionSerializer(ReadOnlySerializer): + spec = serializers.JSONField() + class Meta: model = ModuleQuestion fields = ['key', 'definition_order', 'spec'] class DetailedModuleQuestionSerializer(SimpleModuleQuestionSerializer): - module = DetailedModuleSerializer() + + class Meta: + model = ModuleQuestion + fields = SimpleModuleQuestionSerializer.Meta.fields + + +class ModuleQuestionListSerializer(SimpleModuleQuestionSerializer): answer_type_module = DetailedModuleSerializer() class Meta: model = ModuleQuestion - fields = SimpleModuleQuestionSerializer.Meta.fields + ['module', 'answer_type_module'] + fields = SimpleModuleQuestionSerializer.Meta.fields + +class ModuleReadSerializer(ReadOnlySerializer): + spec = serializers.JSONField() + app = SimpleAppVersionSourceSerializer() + questions = SimpleModuleQuestionSerializer(many=True) + + class Meta: + model = Module + fields = ['module_name', 'spec', 'app', 'questions'] + +class CreateModuleQuestionSerializer(WriteOnlySerializer): + spec = serializers.JSONField() + key = serializers.CharField() + definition_order = serializers.IntegerField() + + # module_id = serializers.PrimaryKeyRelatedField(source='module', allow_null=False, queryset=Module.objects) + + class Meta: + model = ModuleQuestion + fields = ['key', 'definition_order', 'spec' + ] + diff --git a/api/guidedmodules/urls.py b/api/guidedmodules/urls.py index aab5656b8..3a04cae45 100644 --- a/api/guidedmodules/urls.py +++ b/api/guidedmodules/urls.py @@ -1,9 +1,18 @@ from django.conf.urls import url from django.urls import include from rest_framework import routers +from rest_framework_nested.routers import NestedSimpleRouter +from api.guidedmodules.views.module import ModuleViewSet +from api.guidedmodules.views.module_questions import ModuleQuestionViewSet + router = routers.DefaultRouter() +router.register('modules', ModuleViewSet) + +module_router = NestedSimpleRouter(router, 'modules', lookup='modules') +module_router.register('questions', ModuleQuestionViewSet, basename='module-questions') urlpatterns = [ url(r'^', include(router.urls)), + url(r'^', include(module_router.urls)), ] diff --git a/api/guidedmodules/views/module.py b/api/guidedmodules/views/module.py new file mode 100644 index 000000000..bc3fe553f --- /dev/null +++ b/api/guidedmodules/views/module.py @@ -0,0 +1,13 @@ +from rest_framework.decorators import action +from rest_framework.response import Response + +from api.base.views.base import SerializerClasses +from api.base.views.viewsets import ReadOnlyViewSet +from api.guidedmodules.serializers.modules import ModuleReadSerializer +from guidedmodules.models import Module + + +class ModuleViewSet(ReadOnlyViewSet): + queryset = Module.objects.all() + serializer_classes = SerializerClasses(retrieve=ModuleReadSerializer, + list=ModuleReadSerializer) diff --git a/api/guidedmodules/views/module_questions.py b/api/guidedmodules/views/module_questions.py new file mode 100644 index 000000000..2092ba46a --- /dev/null +++ b/api/guidedmodules/views/module_questions.py @@ -0,0 +1,19 @@ +from rest_framework.decorators import action +from rest_framework.response import Response + +from api.base.views.base import SerializerClasses +from api.base.views.viewsets import ReadWriteViewSet +from api.guidedmodules.serializers.modules import SimpleModuleQuestionSerializer, CreateModuleQuestionSerializer +from guidedmodules.models import Module, ModuleQuestion + + +class ModuleQuestionViewSet(ReadWriteViewSet): + NESTED_ROUTER_PKS = [{'pk': 'modules_pk', 'model_field': 'module', 'model': Module}] + queryset = ModuleQuestion.objects.all() + ordering = ('definition_order',) + serializer_classes = SerializerClasses(retrieve=SimpleModuleQuestionSerializer, + list=SimpleModuleQuestionSerializer, + create=CreateModuleQuestionSerializer, + update=CreateModuleQuestionSerializer, + destroy=CreateModuleQuestionSerializer) + From ca86337bbff799cc3d89baf49c0a1b4593f0f02b Mon Sep 17 00:00:00 2001 From: Greg Elin Date: Wed, 17 Nov 2021 16:13:09 -0600 Subject: [PATCH 28/88] Work on cloning compliance app --- guidedmodules/models.py | 1 + guidedmodules/views.py | 113 +++++++++++++++++----------- siteapp/static/js/authoring_tool.js | 12 +++ siteapp/urls.py | 2 + siteapp/views.py | 7 +- templates/app-store-item.html | 45 ++++++++++- templates/authoring-tool-modal.html | 10 ++- 7 files changed, 142 insertions(+), 48 deletions(-) diff --git a/guidedmodules/models.py b/guidedmodules/models.py index 2c0824314..9b410102a 100644 --- a/guidedmodules/models.py +++ b/guidedmodules/models.py @@ -185,6 +185,7 @@ def get_asset(self, asset_path): @property def icon(self): size = 128 + print(50,"===== image") icon = image_to_dataurl(self.get_asset(self.catalog_metadata["icon"]), size) def catalog_metadata_yaml(self): diff --git a/guidedmodules/views.py b/guidedmodules/views.py index 775f0584d..b1862e361 100644 --- a/guidedmodules/views.py +++ b/guidedmodules/views.py @@ -1,4 +1,5 @@ import os +import json from datetime import datetime from zipfile import ZipFile @@ -627,36 +628,15 @@ def redirect_to(): def show_module_questions(request, module_id): - module = Module.objects.get(pk=module_id) + module = Module.objects.select_related('app').get(pk=module_id) + module_questions = ModuleQuestion.objects.filter(module=module).order_by('definition_order') - # print(0, "====", f"request: {request.__dict__}") - # print(2, "====", f"module: {module}") - - module_questions = module.questions.all().order_by('definition_order') - import json - questions_list = "
".join([json.dumps(q.spec, indent=2) for q in module.questions.all()]) - # module_questions = task.module.questions.all() - - # print(3, "====", f"module_questions: {module_questions}") - - for q in module_questions: - pass - # title = q.spec["title"] - # prompt = render_markdown_field("prompt", "html") - # m = re.match(r"^

([\w\W]*?)

\s*", prompt) - # if m: - # title = m.group(1) - # prompt = prompt[m.end():] - - context = {} - context.update({ + context = { "module": module, "module_questions": module_questions, "authoring_tool_enabled": False, "ADMIN_ROOT_URL": settings.SITE_ROOT_URL + "/admin", - }) - - # return HttpResponse(f"rendering show_questions
{task.__dict__}
{questions_list}
") + } return render(request, "questions.html", context) @task_view @@ -1522,37 +1502,82 @@ def authoring_create_q(request): from guidedmodules.models import AppSource from collections import OrderedDict - new_q_appsrc = AppSource.objects.get(slug="govready-q-files-stubs") - # Get the values from submitted form new_q = OrderedDict() for field in ( - "q_slug", "title", "short_description", "category"): + "app_id", "q_slug", "title", "short_description", "category"): value = request.POST.get(field, "").strip() # Example how we can test values and make changes - if value: - if field in ("min", "max"): + if field in ("q_slug", "title", "short_description", "category"): + new_q[field] = str(value) + elif field in ("app_id"): + if value: new_q[field] = int(value) - elif field == "protocol": - # The protocol value is given as a space-separated list of - # of protocols. - new_q[field] = re.split(r"\s+", value) else: - new_q[field] = value + new_q[field] = None + elif field == "protocol": + # The protocol value is given as a space-separated list of + # of protocols. + new_q[field] = re.split(r"\s+", value) + else: + new_q[field] = value - # Use stub_app to publish our new app try: - appver = new_q_appsrc.add_app_to_catalog("stub_app" ) - # Update app details - appver.appname = new_q["title"] - appver.catalog_metadata["title"] = new_q["title"] - appver.catalog_metadata["description"]["short"] = new_q['short_description'] - appver.catalog_metadata["category"] = new_q["category"] - # appver.spec.introduction.template = new_q['short_description'] - appver.save() + if new_q["app_id"] is None: + # Create a new stub questionnaire template + new_q_appsrc = AppSource.objects.get(slug="govready-q-files-stubs") + new_appversion = new_q_appsrc.add_app_to_catalog("stub_app") + # Update app details + new_appversion.appname = new_q["title"] + new_appversion.catalog_metadata["title"] = new_q["title"] + new_appversion.catalog_metadata["description"]["short"] = new_q['short_description'] + new_appversion.catalog_metadata["category"] = new_q["category"] + # new_appversion.spec.introduction.template = new_q['short_description'] + new_appversion.save() + else: + # Clone existing questionnaire template by copying all records + # TODO: Working out ModuleAsset Paths! + new_q_appsrc = AppSource.objects.get(slug="govready-q-files-startpack") + src_appversion = AppVersion.objects.get(pk=new_q["app_id"]) + + # copy Appversion record and change + new_appversion = src_appversion + new_appversion.pk = None + new_appversion.source = new_q_appsrc + new_appversion.appname = new_q["title"] + new_appversion.catalog_metadata["title"] = new_q["title"] + new_appversion.catalog_metadata["description"]["short"] = new_q['short_description'] + new_appversion.catalog_metadata["category"] = new_q["category"] + # new_appversion.spec.introduction.template = new_q['short_description'] + new_appversion.save() + + # appver = new_q_appsrc.add_app_to_catalog(appversion.appname) + + # Get src_appversion modules, copy, and associate with new_appversion + src_appversion = AppVersion.objects.get(pk=new_q["app_id"]) #Retrive again source AppVersion + modules = Module.objects.filter(app=src_appversion) + print(6,"=====", modules) + # for each src_appversion module, copy module and questions + + # Copy inputs + # Copy assets + # Copy components except Exception as e: raise + # # Use stub_app to publish our new app + # try: + # # appver = new_q_appsrc.add_app_to_catalog("stub_app") + # # Update app details + # appver.appname = new_q["title"] + # appver.catalog_metadata["title"] = new_q["title"] + # appver.catalog_metadata["description"]["short"] = new_q['short_description'] + # appver.catalog_metadata["category"] = new_q["category"] + # # appver.spec.introduction.template = new_q['short_description'] + # appver.save() + # except Exception as e: + # raise + messages.add_message(request, messages.INFO, 'New Project "{}" added into the catalog.'.format(new_q["title"])) return JsonResponse({ "status": "ok", "redirect": "/store" }) diff --git a/siteapp/static/js/authoring_tool.js b/siteapp/static/js/authoring_tool.js index ec330a022..774aa608b 100644 --- a/siteapp/static/js/authoring_tool.js +++ b/siteapp/static/js/authoring_tool.js @@ -296,7 +296,19 @@ function authoring_tool_save_module() { } function authoring_tool_create_q_form(argument) { + console.log(argument); $('#create_q_authoring_tool').modal(); + console.log(Object.keys(argument)) + if (Object.keys(argument).includes('app_id')) { + $('#authoring_tool_app_id').val(argument['app_id']); + } + if (Object.keys(argument).includes('app_title')) { + console.log(argument); + $('#authoring_tool_q_2_title').val(argument['app_title']+" Copy"); + var slug = $('#authoring_tool_q_2_title').val(); + slug = slug.toLowerCase().replace(/[^a-z0-9--]+/g, "_"); + $('#authoring_tool_q_name').val(slug); + } } function authoring_tool_create_q() { diff --git a/siteapp/urls.py b/siteapp/urls.py index d9ac9526f..e2d007620 100644 --- a/siteapp/urls.py +++ b/siteapp/urls.py @@ -46,6 +46,7 @@ url(r"^discussion/", include("discussion.urls")), # Controls and Systems + url(r"^system/", include("controls.urls")), url(r"^systems/", include("controls.urls")), url(r"^api/v1/systems/", include("controls.urls_api")), url(r"^controls/", include("controls.urls")), @@ -53,6 +54,7 @@ # app store url(r'^store$', views.apps_catalog, name="store"), url(r'^store/app/(?P.*)/modules$', views.apps_catalog_item_modules, name='apps_catalog_item_modules'), + # url(r'^store/app/(?P.*)/clone$', views.apps_catalog_item_clone, name='apps_catalog_item_clone'), url(r'^store/(?P.*)/(?P.*)/zip$', views.apps_catalog_item_zip), url(r'^store/(?P.*)/(?P.*)$', views.apps_catalog_item), diff --git a/siteapp/views.py b/siteapp/views.py index be347092d..d99247f19 100644 --- a/siteapp/views.py +++ b/siteapp/views.py @@ -640,6 +640,8 @@ def apps_catalog_item(request, source_slug, app_name): else: raise Http404() + app_catalog_info["id"] = app_catalog_info["versions"][0].id + # Get portfolio project should be included in. if request.GET.get("portfolio"): portfolio = Portfolio.objects.get(id=request.GET.get("portfolio")) @@ -722,12 +724,13 @@ def apps_catalog_item(request, source_slug, app_name): "app": app_catalog_info, "error": error, "source_slug": source_slug, - "portfolio": portfolio + "portfolio": portfolio, + "authoring_tool_enabled": True, }) @login_required def apps_catalog_item_modules(request, appversion_id): - """Reurn the modules for an appversion in catalog""" + """Return the modules for an appversion in catalog""" appversion = AppVersion.objects.get(pk=appversion_id) modules = Module.objects.prefetch_related('questions').filter(app=appversion) diff --git a/templates/app-store-item.html b/templates/app-store-item.html index 964cd95a0..35e83286c 100644 --- a/templates/app-store-item.html +++ b/templates/app-store-item.html @@ -1,4 +1,5 @@ {% extends "base.html" %} +{% load static %} {% block title %} {{app.title}} - Compliance Apps @@ -132,6 +133,12 @@

{{ app.title }}

+
@@ -193,7 +200,43 @@

{{ app.title }}

-
 
+ +{% include "authoring-tool-modal.html" %} +{% if authoring_tool_enabled %} + + + {# show over modal #} + +{% endif %} + + {% endblock %} diff --git a/templates/authoring-tool-modal.html b/templates/authoring-tool-modal.html index f7e45d742..742c256e1 100644 --- a/templates/authoring-tool-modal.html +++ b/templates/authoring-tool-modal.html @@ -360,10 +360,18 @@