conradlan před 3 roky
rodič
revize
5ca1417f65
3 změnil soubory, kde provedl 206 přidání a 199 odebrání
  1. 6 6
      app/email-templates/src/reset_password.mjml
  2. 21 15
      app/utils.py
  3. 179 178
      requirement.txt

+ 6 - 6
app/email-templates/src/reset_password.mjml

@@ -3,15 +3,15 @@
     <mj-section>
       <mj-column>
         <mj-divider border-color="#555"></mj-divider>
-        <mj-text font-size="20px" color="#555" font-family="helvetica">{{ project_name }} - Password Recovery</mj-text>
-        <mj-text font-size="16px" color="#555">We received a request to recover the password for user {{ username }}
-          with email {{ email }}</mj-text>
+        <mj-text font-size="20px" color="#555" font-family="helvetica">{{ settings.project_name }} - Password Recovery</mj-text>
+        <mj-text font-size="16px" color="#555">We received a request to recover the password for user {{ settings.username }}
+          with email {{ settings.email }}</mj-text>
         <mj-text font-size="16px" color="#555">Reset your password by clicking the button below:</mj-text>
-        <mj-button padding="50px 0px" href="{{ link }}">Reset Password</mj-button>
+        <mj-button padding="50px 0px" href="{{ settings.link }}">Reset Password</mj-button>
         <mj-text font-size="16px" color="#555">Or open the following link:</mj-text>
-        <mj-text font-size="16px" color="#555"><a href="{{ link }}">{{ link }}</a></mj-text>
+        <mj-text font-size="16px" color="#555"><a href="{{ settings.link }}">{{ settings.link }}</a></mj-text>
         <mj-divider border-color="#555" border-width="2px" />
-        <mj-text font-size="14px" color="#555">The reset password link / button will expire in {{ valid_hours }} hours.</mj-text>
+        <mj-text font-size="14px" color="#555">The reset password link / button will expire in {{ settings.valid_hours }} hours.</mj-text>
         <mj-text font-size="14px" color="#555">If you didn't request a password recovery you can disregard this email.</mj-text>
       </mj-column>
     </mj-section>

+ 21 - 15
app/utils.py

@@ -1,4 +1,7 @@
 import logging
+import smtplib
+import jinja2
+
 from datetime import datetime, timedelta
 from pathlib import Path
 from typing import Any, Dict, Optional
@@ -8,7 +11,14 @@ from emails.template import JinjaTemplate
 from jose import jwt
 
 from app.core.config import settings
+from email.mime.multipart import MIMEMultipart
+from email.mime.text import MIMEText
 
+# def render_template(template, kwargs):
+#     templateLoader = jinja2.FileSystemLoader(searchpath="./templates")
+#     templateEnv = jinja2.Environment(loader=templateLoader)
+#     templ = templateEnv.get_template(template)
+#     return templ.render(kwargs)
 
 def send_email(
     email_to: str,
@@ -17,20 +27,16 @@ def send_email(
     environment: Dict[str, Any] = {},
 ) -> None:
     assert settings.EMAILS_ENABLED, "no provided configuration for email variables"
-    message = emails.Message(
-        subject=JinjaTemplate(subject_template),
-        html=JinjaTemplate(html_template),
-        mail_from=(settings.EMAILS_FROM_NAME, settings.EMAILS_FROM_EMAIL),
-    )
-    smtp_options = {"host": settings.SMTP_HOST, "port": settings.SMTP_PORT}
-    if settings.SMTP_TLS:
-        smtp_options["tls"] = True
-    if settings.SMTP_USER:
-        smtp_options["user"] = settings.SMTP_USER
-    if settings.SMTP_PASSWORD:
-        smtp_options["password"] = settings.SMTP_PASSWORD
-    response = message.send(to=email_to, render=environment, smtp=smtp_options)
-    logging.info(f"send email result: {response}")
+    m_m = MIMEMultipart('mixed')
+    m_m['From'] = settings.EMAILS_FROM_EMAIL
+    m_m['Subject'] = (subject_template)
+    m_m['To'] = email_to
+    body = JinjaTemplate(html_template).render(**environment)
+    m_m.attach(MIMEText(body,'html'))
+    server = smtplib.SMTP_SSL(settings.SMTP_HOST, settings.SMTP_PORT)
+    server.login(settings.SMTP_USER, settings.SMTP_PASSWORD)
+    server.sendmail(settings.EMAILS_FROM_EMAIL, email_to, m_m.as_string())
+    server.quit()
 
 
 def send_test_email(email_to: str) -> None:
@@ -52,7 +58,7 @@ def send_reset_password_email(email_to: str, email: str, token: str) -> None:
     with open(Path(settings.EMAIL_TEMPLATES_DIR) / "reset_password.html") as f:
         template_str = f.read()
     server_host = settings.SERVER_HOST
-    link = f"{server_host}/reset-password?token={token}"
+    link = f"{server_host}/api/v1/reset-password?token={token}"
     send_email(
         email_to=email_to,
         subject_template=subject,

+ 179 - 178
requirement.txt

@@ -1,260 +1,260 @@
 absl-py==0.15.0
-alabaster @ file:///home/ktietz/src/ci/alabaster_1611921544520/work
-anaconda-client==1.7.2
-anaconda-navigator==2.0.3
-anaconda-project @ file:///tmp/build/80754af9/anaconda-project_1610472525955/work
+alabaster==0.7.12
+anaconda-client
 anyio==3.3.4
 appdirs==1.4.4
 argh==0.26.2
-argon2-cffi @ file:///tmp/build/80754af9/argon2-cffi_1613037097816/work
+argon2-cffi==20.1.0
 asgiref==3.4.1
-asn1crypto @ file:///tmp/build/80754af9/asn1crypto_1596577642040/work
-astroid @ file:///tmp/build/80754af9/astroid_1613500854201/work
-astropy @ file:///tmp/build/80754af9/astropy_1617745353437/work
+asn1crypto==1.4.0
+astroid==2.5
+astropy==4.2.1
 astunparse==1.6.3
-async-generator @ file:///home/ktietz/src/ci/async_generator_1611927993394/work
+async-generator==1.10
 atomicwrites==1.4.0
-attrs @ file:///tmp/build/80754af9/attrs_1604765588209/work
-autopep8 @ file:///tmp/build/80754af9/autopep8_1615918855173/work
-Babel @ file:///tmp/build/80754af9/babel_1607110387436/work
-backcall @ file:///home/ktietz/src/ci/backcall_1611930011877/work
-backports.functools-lru-cache @ file:///tmp/build/80754af9/backports.functools_lru_cache_1618170165463/work
-backports.shutil-get-terminal-size @ file:///tmp/build/80754af9/backports.shutil_get_terminal_size_1608222128777/work
-backports.tempfile @ file:///home/linux1/recipes/ci/backports.tempfile_1610991236607/work
+attrs==20.3.0
+autopep8==1.5.6
+Babel==2.9.0
+backcall==0.2.0
+backports.functools-lru-cache==1.6.4
+backports.shutil-get-terminal-size==1.0.0
+backports.tempfile==1.0
 backports.weakref==1.0.post1
-beautifulsoup4 @ file:///home/linux1/recipes/ci/beautifulsoup4_1610988766420/work
-bitarray @ file:///tmp/build/80754af9/bitarray_1620827551536/work
+beautifulsoup4==4.9.3
+bitarray==2.1.0
 bkcharts==0.2
 black==19.10b0
-bleach @ file:///tmp/build/80754af9/bleach_1612211392645/work
-bokeh @ file:///tmp/build/80754af9/bokeh_1620779595936/work
+bleach==3.3.0
+bokeh==2.3.2
 boto==2.49.0
 Bottleneck==1.3.2
 brotlipy==0.7.0
 cachetools==4.2.4
 certifi==2021.10.8
-cffi @ file:///tmp/build/80754af9/cffi_1613246945912/work
-chardet @ file:///tmp/build/80754af9/chardet_1607706746162/work
+cffi==1.14.5
+chardet==4.0.0
 charset-normalizer==2.0.7
 clang==5.0
 click==8.0.3
-cloudpickle @ file:///tmp/build/80754af9/cloudpickle_1598884132938/work
+cloudpickle==1.6.0
 clyent==1.2.2
-colorama @ file:///tmp/build/80754af9/colorama_1607707115595/work
+colorama==0.4.4
 conda==4.10.3
 conda-build==3.21.4
-conda-content-trust @ file:///tmp/build/80754af9/conda-content-trust_1617045594566/work
-conda-package-handling @ file:///tmp/build/80754af9/conda-package-handling_1618262148928/work
-conda-repo-cli @ file:///tmp/build/80754af9/conda-repo-cli_1620168426516/work
-conda-token @ file:///tmp/build/80754af9/conda-token_1620076980546/work
+conda-content-trust==0+unknown
+conda-package-handling==1.7.3
+conda-repo-cli==1.0.4
+conda-token==0.3.0
 conda-verify==3.4.2
 contextlib2==0.6.0.post1
-cryptography @ file:///tmp/build/80754af9/cryptography_1616769286105/work
+cryptography==3.4.7
 cssselect==1.1.0
 cssutils==2.3.0
 cycler==0.10.0
-Cython @ file:///tmp/build/80754af9/cython_1618435160151/work
+Cython==0.29.23
 cytoolz==0.11.0
-dask @ file:///tmp/build/80754af9/dask-core_1617390489108/work
-decorator @ file:///tmp/build/80754af9/decorator_1617916966915/work
-defusedxml @ file:///tmp/build/80754af9/defusedxml_1615228127516/work
-diff-match-patch @ file:///tmp/build/80754af9/diff-match-patch_1594828741838/work
-distributed @ file:///tmp/build/80754af9/distributed_1620902833129/work
-docutils @ file:///tmp/build/80754af9/docutils_1620827984873/work
+dask==2021.4.0
+decorator==5.0.6
+defusedxml==0.7.1
+diff-match-patch==20200713
+distributed==2021.4.1
+docutils==0.17.1
 ecdsa==0.17.0
 emails==0.6
 entrypoints==0.3
 et-xmlfile==1.0.1
 fastapi==0.70.0
 fastcache==1.1.0
-filelock @ file:///home/linux1/recipes/ci/filelock_1610993975404/work
-flake8 @ file:///tmp/build/80754af9/flake8_1615834841867/work
-Flask @ file:///home/ktietz/src/ci/flask_1611932660458/work
+filelock==3.0.12
+flake8==3.9.0
+Flask==1.1.2
 flatbuffers==1.12
-fsspec @ file:///tmp/build/80754af9/fsspec_1617959894824/work
+fsspec==0.9.0
 future==0.18.2
 gast==0.4.0
-gevent @ file:///tmp/build/80754af9/gevent_1616770671827/work
-glob2 @ file:///home/linux1/recipes/ci/glob2_1610991677669/work
+gevent==21.1.2
+glob2==0.7
 gmpy2==2.0.8
 google-auth==2.3.0
 google-auth-oauthlib==0.4.6
 google-pasta==0.2.0
-greenlet @ file:///tmp/build/80754af9/greenlet_1611957705398/work
+greenlet==1.0.0
 grpcio==1.41.0
 h5py==3.1.0
 HeapDict==1.0.1
-html5lib @ file:///tmp/build/80754af9/html5lib_1593446221756/work
+html5lib==1.1
 httptools==0.2.0
 idna==3.3
-imageio @ file:///tmp/build/80754af9/imageio_1617700267927/work
-imagesize @ file:///home/ktietz/src/ci/imagesize_1611921604382/work
-importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1617874469820/work
-iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
-intervaltree @ file:///tmp/build/80754af9/intervaltree_1598376443606/work
-ipykernel @ file:///tmp/build/80754af9/ipykernel_1596207638929/work/dist/ipykernel-5.3.4-py3-none-any.whl
-ipython @ file:///tmp/build/80754af9/ipython_1617120885885/work
-ipython-genutils @ file:///tmp/build/80754af9/ipython_genutils_1606773439826/work
-ipywidgets @ file:///tmp/build/80754af9/ipywidgets_1610481889018/work
-isort @ file:///tmp/build/80754af9/isort_1616355431277/work
-itsdangerous @ file:///home/ktietz/src/ci/itsdangerous_1611932585308/work
+imageio==2.9.0
+imagesize==1.2.0
+importlib-metadata==3.10.0
+iniconfig==1.1.1
+intervaltree==3.1.0
+ipykernel==5.3.4
+ipython==7.22.0
+ipython-genutils==0.2.0
+ipywidgets==7.6.3
+isort==5.8.0
+itsdangerous==1.1.0
 jdcal==1.4.1
-jedi @ file:///tmp/build/80754af9/jedi_1606932564285/work
-jeepney @ file:///tmp/build/80754af9/jeepney_1606148855031/work
+jedi==0.17.2
+jeepney==0.6.0
 Jinja2==3.0.2
-joblib @ file:///tmp/build/80754af9/joblib_1613502643832/work
+joblib==1.0.1
 json5==0.9.5
-jsonschema @ file:///tmp/build/80754af9/jsonschema_1602607155483/work
+jsonschema==3.2.0
 jupyter==1.0.0
-jupyter-client @ file:///tmp/build/80754af9/jupyter_client_1616770841739/work
-jupyter-console @ file:///tmp/build/80754af9/jupyter_console_1616615302928/work
-jupyter-core @ file:///tmp/build/80754af9/jupyter_core_1612213311222/work
-jupyter-packaging @ file:///tmp/build/80754af9/jupyter-packaging_1613502826984/work
-jupyter-server @ file:///tmp/build/80754af9/jupyter_server_1616083640759/work
-jupyterlab @ file:///tmp/build/80754af9/jupyterlab_1619133235951/work
-jupyterlab-pygments @ file:///tmp/build/80754af9/jupyterlab_pygments_1601490720602/work
-jupyterlab-server @ file:///tmp/build/80754af9/jupyterlab_server_1617134334258/work
-jupyterlab-widgets @ file:///tmp/build/80754af9/jupyterlab_widgets_1609884341231/work
+jupyter-client==6.1.12
+jupyter-console==6.4.0
+jupyter-core==4.7.1
+jupyter-packaging==0.7.12
+jupyter-server==1.4.1
+jupyterlab==3.0.14
+jupyterlab-pygments==0.1.2
+jupyterlab-server==2.4.0
+jupyterlab-widgets==1.0.0
 keras==2.6.0
 Keras-Preprocessing==1.1.2
-keyring @ file:///tmp/build/80754af9/keyring_1614616740399/work
-kiwisolver @ file:///tmp/build/80754af9/kiwisolver_1612282420641/work
-lazy-object-proxy @ file:///tmp/build/80754af9/lazy-object-proxy_1616526917483/work
-libarchive-c @ file:///tmp/build/80754af9/python-libarchive-c_1617780486945/work
+keyring==22.3.0
+kiwisolver==1.3.1
+lazy-object-proxy==1.6.0
+libarchive-c==2.9
 line-pay==0.2.0
 llvmlite==0.36.0
 locket==0.2.1
-lxml @ file:///tmp/build/80754af9/lxml_1616443220220/work
+lxml==4.6.3
 Markdown==3.3.4
 MarkupSafe==2.0.1
-matplotlib @ file:///tmp/build/80754af9/matplotlib-suite_1613407855456/work
+matplotlib==3.3.4
 mccabe==0.6.1
 mistune==0.8.4
 mkl-fft==1.3.0
-mkl-random @ file:///tmp/build/80754af9/mkl_random_1618853849286/work
+mkl-random==1.2.1
 mkl-service==2.3.0
-mock @ file:///tmp/build/80754af9/mock_1607622725907/work
-more-itertools @ file:///tmp/build/80754af9/more-itertools_1613676688952/work
+mock==4.0.3
+more-itertools==8.7.0
 mpmath==1.2.1
-msgpack @ file:///tmp/build/80754af9/msgpack-python_1612287151062/work
+msgpack==1.0.2
 multipledispatch==0.6.0
 mypy-extensions==0.4.3
 mysql==0.0.3
 mysql-connector-python==8.0.27
 mysqlclient==2.0.3
 navigator-updater==0.2.1
-nbclassic @ file:///tmp/build/80754af9/nbclassic_1616085367084/work
-nbclient @ file:///tmp/build/80754af9/nbclient_1614364831625/work
-nbconvert @ file:///tmp/build/80754af9/nbconvert_1601914830498/work
-nbformat @ file:///tmp/build/80754af9/nbformat_1617383369282/work
-nest-asyncio @ file:///tmp/build/80754af9/nest-asyncio_1613680548246/work
-networkx @ file:///tmp/build/80754af9/networkx_1598376031484/work
-nltk @ file:///tmp/build/80754af9/nltk_1618327084230/work
-nose @ file:///tmp/build/80754af9/nose_1606773131901/work
-notebook @ file:///tmp/build/80754af9/notebook_1616443462982/work
-numba @ file:///tmp/build/80754af9/numba_1616774046117/work
-numexpr @ file:///tmp/build/80754af9/numexpr_1618856167419/work
+nbclassic==0.2.6
+nbclient==0.5.3
+nbconvert==6.0.7
+nbformat==5.1.3
+nest-asyncio==1.5.1
+networkx==2.5
+nltk==3.6.1
+nose==1.3.7
+notebook==6.3.0
+numba==0.53.1
+numexpr==2.7.3
 numpy==1.19.5
-numpydoc @ file:///tmp/build/80754af9/numpydoc_1605117425582/work
+numpydoc==1.1.0
 oauthlib==3.1.1
 olefile==0.46
-openpyxl @ file:///tmp/build/80754af9/openpyxl_1615411699337/work
+openpyxl==3.0.7
 opt-einsum==3.3.0
-packaging @ file:///tmp/build/80754af9/packaging_1611952188834/work
+packaging==20.9
 pandas==1.2.4
-pandocfilters @ file:///tmp/build/80754af9/pandocfilters_1605120460739/work
+pandocfilters==1.4.3
 parso==0.7.0
-partd @ file:///tmp/build/80754af9/partd_1618000087440/work
+partd==1.2.0
 passlib==1.7.4
-path @ file:///tmp/build/80754af9/path_1614022220526/work
-pathlib2 @ file:///tmp/build/80754af9/pathlib2_1607024983162/work
+path==15.1.2
+pathlib2==2.3.5
 pathspec==0.7.0
 patsy==0.5.1
 pep8==1.7.1
-pexpect @ file:///tmp/build/80754af9/pexpect_1605563209008/work
-pickleshare @ file:///tmp/build/80754af9/pickleshare_1606932040724/work
-Pillow @ file:///tmp/build/80754af9/pillow_1617383569452/work
+pexpect==4.8.0
+pickleshare==0.7.5
+Pillow==8.2.0
+pip==21.0.1
 pkginfo==1.7.0
-pluggy @ file:///tmp/build/80754af9/pluggy_1615976321666/work
+pluggy==0.13.1
 ply==3.11
 premailer==3.10.0
-prometheus-client @ file:///tmp/build/80754af9/prometheus_client_1618088486455/work
-prompt-toolkit @ file:///tmp/build/80754af9/prompt-toolkit_1616415428029/work
+prometheus-client==0.10.1
+prompt-toolkit==3.0.17
 protobuf==3.19.0
-psutil @ file:///tmp/build/80754af9/psutil_1612298023621/work
-ptyprocess @ file:///tmp/build/80754af9/ptyprocess_1609355006118/work/dist/ptyprocess-0.7.0-py2.py3-none-any.whl
-py @ file:///tmp/build/80754af9/py_1607971587848/work
+psutil==5.8.0
+ptyprocess==0.7.0
+py==1.10.0
 pyasn1==0.4.8
 pyasn1-modules==0.2.8
-pycodestyle @ file:///home/ktietz/src/ci_mi/pycodestyle_1612807597675/work
+pycodestyle==2.6.0
 pycosat==0.6.3
-pycparser @ file:///tmp/build/80754af9/pycparser_1594388511720/work
+pycparser==2.20
 pycurl==7.43.0.6
-pydocstyle @ file:///tmp/build/80754af9/pydocstyle_1616182067796/work
-pyerfa @ file:///tmp/build/80754af9/pyerfa_1619390903914/work
-pyflakes @ file:///home/ktietz/src/ci_ipy2/pyflakes_1612551159640/work
-Pygments @ file:///tmp/build/80754af9/pygments_1615143339740/work
-pylint @ file:///tmp/build/80754af9/pylint_1617135829881/work
-pyls-black @ file:///tmp/build/80754af9/pyls-black_1607553132291/work
-pyls-spyder @ file:///tmp/build/80754af9/pyls-spyder_1613849700860/work
-pyodbc===4.0.0-unsupported
-pyOpenSSL @ file:///tmp/build/80754af9/pyopenssl_1608057966937/work
-pyparsing @ file:///home/linux1/recipes/ci/pyparsing_1610983426697/work
-pyrsistent @ file:///tmp/build/80754af9/pyrsistent_1600141720057/work
-PySocks @ file:///tmp/build/80754af9/pysocks_1605305779399/work
+pydocstyle==6.0.0
+pyerfa==1.7.3
+pyflakes==2.2.0
+Pygments==2.8.1
+pylint==2.7.4
+pyls-black==0.4.6
+pyls-spyder==0.3.2
+pyodbc==4.0.0-unsupported
+pyOpenSSL==20.0.1
+pyparsing==2.4.7
+pyrsistent==0.17.3
+PySocks==1.7.1
 pytest==6.2.3
-python-dateutil @ file:///home/ktietz/src/ci/python-dateutil_1611928101742/work
+python-dateutil==2.8.1
 python-dotenv==0.19.1
 python-jose==3.3.0
-python-jsonrpc-server @ file:///tmp/build/80754af9/python-jsonrpc-server_1600278539111/work
-python-language-server @ file:///tmp/build/80754af9/python-language-server_1607972495879/work
-pytz @ file:///tmp/build/80754af9/pytz_1612215392582/work
-PyWavelets @ file:///tmp/build/80754af9/pywavelets_1601658317819/work
-pyxdg @ file:///tmp/build/80754af9/pyxdg_1603822279816/work
+python-jsonrpc-server==0.4.0
+python-language-server==0.36.2
+pytz==2021.1
+PyWavelets==1.1.1
+pyxdg==0.27
 PyYAML==6.0
 pyzmq==20.0.0
 QDarkStyle==2.8.1
-QtAwesome @ file:///tmp/build/80754af9/qtawesome_1615991616277/work
-qtconsole @ file:///tmp/build/80754af9/qtconsole_1616775094278/work
+QtAwesome==1.0.2
+qtconsole==5.0.3
 QtPy==1.9.0
-regex @ file:///tmp/build/80754af9/regex_1617569202463/work
+regex==2021.4.4
 requests==2.26.0
 requests-oauthlib==1.3.0
-rope @ file:///tmp/build/80754af9/rope_1602264064449/work
+rope==0.18.0
 rsa==4.7.2
-Rtree @ file:///tmp/build/80754af9/rtree_1618420845272/work
-ruamel-yaml-conda @ file:///tmp/build/80754af9/ruamel_yaml_1616016699510/work
+Rtree==0.9.7
+ruamel-yaml-conda==0.15.100
 scikit-image==0.18.1
-scikit-learn @ file:///tmp/build/80754af9/scikit-learn_1614446682169/work
-scipy @ file:///tmp/build/80754af9/scipy_1618855647378/work
-seaborn @ file:///tmp/build/80754af9/seaborn_1608578541026/work
-SecretStorage @ file:///tmp/build/80754af9/secretstorage_1614022784285/work
-Send2Trash @ file:///tmp/build/80754af9/send2trash_1607525499227/work
+scikit-learn==0.24.1
+scipy==1.6.2
+seaborn==0.11.1
+SecretStorage==3.3.1
+Send2Trash==1.5.0
+setuptools==52.0.0.post20210125
 simplegeneric==0.8.1
-singledispatch @ file:///tmp/build/80754af9/singledispatch_1614366001199/work
+singledispatch==0.0.0
 sip==4.19.13
-six @ file:///tmp/build/80754af9/six_1605205327372/work
-sniffio @ file:///tmp/build/80754af9/sniffio_1614030475067/work
-snowballstemmer @ file:///tmp/build/80754af9/snowballstemmer_1611258885636/work
-sortedcollections @ file:///tmp/build/80754af9/sortedcollections_1611172717284/work
-sortedcontainers @ file:///tmp/build/80754af9/sortedcontainers_1606865132123/work
-soupsieve @ file:///tmp/build/80754af9/soupsieve_1616183228191/work
-Sphinx @ file:///tmp/build/80754af9/sphinx_1620777493457/work
-sphinxcontrib-applehelp @ file:///home/ktietz/src/ci/sphinxcontrib-applehelp_1611920841464/work
-sphinxcontrib-devhelp @ file:///home/ktietz/src/ci/sphinxcontrib-devhelp_1611920923094/work
-sphinxcontrib-htmlhelp @ file:///home/ktietz/src/ci/sphinxcontrib-htmlhelp_1611920974801/work
-sphinxcontrib-jsmath @ file:///home/ktietz/src/ci/sphinxcontrib-jsmath_1611920942228/work
-sphinxcontrib-qthelp @ file:///home/ktietz/src/ci/sphinxcontrib-qthelp_1611921055322/work
-sphinxcontrib-serializinghtml @ file:///home/ktietz/src/ci/sphinxcontrib-serializinghtml_1611920755253/work
-sphinxcontrib-websupport @ file:///tmp/build/80754af9/sphinxcontrib-websupport_1597081412696/work
-spyder @ file:///tmp/build/80754af9/spyder_1616775618138/work
-spyder-kernels @ file:///tmp/build/80754af9/spyder-kernels_1614030590686/work
-SQLAlchemy @ file:///tmp/build/80754af9/sqlalchemy_1620712430742/work
+six==1.15.0
+sniffio==1.2.0
+snowballstemmer==2.1.0
+sortedcollections==2.1.0
+sortedcontainers==2.3.0
+soupsieve==2.2.1
+Sphinx==4.0.1
+sphinxcontrib-applehelp==1.0.2
+sphinxcontrib-devhelp==1.0.2
+sphinxcontrib-htmlhelp==1.0.3
+sphinxcontrib-jsmath==1.0.1
+sphinxcontrib-qthelp==1.0.3
+sphinxcontrib-serializinghtml==1.1.4
+sphinxcontrib-websupport==1.2.4
+spyder==4.2.5
+spyder-kernels==1.10.2
+SQLAlchemy==1.4.15
 starlette==0.16.0
-statsmodels @ file:///tmp/build/80754af9/statsmodels_1614023746358/work
-sympy @ file:///tmp/build/80754af9/sympy_1618252284338/work
+statsmodels==0.12.2
+sympy==1.8
 tables==3.6.1
-tblib @ file:///tmp/build/80754af9/tblib_1597928476713/work
+tblib==1.7.0
 tensorboard==2.7.0
 tensorboard-data-server==0.6.1
 tensorboard-plugin-wit==1.8.0
@@ -262,39 +262,40 @@ tensorflow==2.6.0
 tensorflow-estimator==2.6.0
 termcolor==1.1.0
 terminado==0.9.4
-testpath @ file:///home/ktietz/src/ci/testpath_1611930608132/work
-textdistance @ file:///tmp/build/80754af9/textdistance_1612461398012/work
-threadpoolctl @ file:///tmp/tmp9twdgx9k/threadpoolctl-2.1.0-py3-none-any.whl
-three-merge @ file:///tmp/build/80754af9/three-merge_1607553261110/work
+testpath==0.4.4
+textdistance==4.2.1
+threadpoolctl==2.1.0
+three-merge==0.1.1
 tifffile==2020.10.1
-toml @ file:///tmp/build/80754af9/toml_1616166611790/work
-toolz @ file:///home/linux1/recipes/ci/toolz_1610987900194/work
-tornado @ file:///tmp/build/80754af9/tornado_1606942300299/work
-tqdm @ file:///tmp/build/80754af9/tqdm_1615925068909/work
-traitlets @ file:///home/ktietz/src/ci/traitlets_1611929699868/work
-typed-ast @ file:///tmp/build/80754af9/typed-ast_1610484547928/work
+toml==0.10.2
+toolz==0.11.1
+tornado==6.1
+tqdm==4.59.0
+traitlets==5.0.5
+typed-ast==1.4.2
 typing-extensions==3.10.0.2
-ujson @ file:///tmp/build/80754af9/ujson_1611259522456/work
+ujson==4.0.2
 unicodecsv==0.14.1
 unicorn==1.0.3
 urllib3==1.26.7
 uvicorn==0.15.0
 uvloop==0.16.0
-watchdog @ file:///tmp/build/80754af9/watchdog_1612471027849/work
+watchdog==1.0.2
 watchgod==0.7
-wcwidth @ file:///tmp/build/80754af9/wcwidth_1593447189090/work
+wcwidth==0.2.5
 webencodings==0.5.1
 websockets==10.0
-Werkzeug @ file:///home/ktietz/src/ci/werkzeug_1611932622770/work
+Werkzeug==1.0.1
+wheel==0.36.2
 widgetsnbextension==3.5.1
 wrapt==1.12.1
-wurlitzer @ file:///tmp/build/80754af9/wurlitzer_1617224664226/work
-xlrd @ file:///tmp/build/80754af9/xlrd_1608072521494/work
-XlsxWriter @ file:///tmp/build/80754af9/xlsxwriter_1617224712951/work
+wurlitzer==2.1.0
+xlrd==2.0.1
+XlsxWriter==1.3.8
 xlwt==1.3.0
-xmltodict @ file:///Users/ktietz/demo/mc3/conda-bld/xmltodict_1629301980723/work
-yapf @ file:///tmp/build/80754af9/yapf_1615749224965/work
+xmltodict==0.12.0
+yapf==0.31.0
 zict==2.0.0
-zipp @ file:///tmp/build/80754af9/zipp_1615904174917/work
+zipp==3.4.1
 zope.event==4.5.0
-zope.interface @ file:///tmp/build/80754af9/zope.interface_1616357211867/work
+zope.interface==5.3.0