pycafe-server 0.0.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pycafe_server-0.0.7/.bumpversion.cfg +13 -0
- pycafe_server-0.0.7/.gitignore +53 -0
- pycafe_server-0.0.7/DEVELOPMENT.md +34 -0
- pycafe_server-0.0.7/LICENSE.txt +9 -0
- pycafe_server-0.0.7/PKG-INFO +60 -0
- pycafe_server-0.0.7/README.md +21 -0
- pycafe_server-0.0.7/pycafe-private/.eslintrc.json +3 -0
- pycafe_server-0.0.7/pycafe-private/.gitignore +36 -0
- pycafe_server-0.0.7/pycafe-private/README.md +36 -0
- pycafe_server-0.0.7/pycafe-private/app/admin/page.tsx +88 -0
- pycafe_server-0.0.7/pycafe-private/app/favicon.ico +0 -0
- pycafe_server-0.0.7/pycafe-private/app/fonts/GeistMonoVF.woff +0 -0
- pycafe_server-0.0.7/pycafe-private/app/fonts/GeistVF.woff +0 -0
- pycafe_server-0.0.7/pycafe-private/app/layout.tsx +32 -0
- pycafe_server-0.0.7/pycafe-private/app/page.module.css +168 -0
- pycafe_server-0.0.7/pycafe-private/app/page.tsx +86 -0
- pycafe_server-0.0.7/pycafe-private/app/sign-in/page.tsx +13 -0
- pycafe_server-0.0.7/pycafe-private/app/snippet/[type]/[version]/page.tsx +45 -0
- pycafe_server-0.0.7/pycafe-private/app/snippet/[type]/[version]/wrapper.tsx +20 -0
- pycafe_server-0.0.7/pycafe-private/app/view/page.tsx +1 -0
- pycafe_server-0.0.7/pycafe-private/next.config.mjs +39 -0
- pycafe_server-0.0.7/pycafe-private/package-lock.json +5497 -0
- pycafe_server-0.0.7/pycafe-private/package.json +44 -0
- pycafe_server-0.0.7/pycafe-private/public/app.py +102 -0
- pycafe_server-0.0.7/pycafe-private/public/backgrounds/image16.svg +9 -0
- pycafe_server-0.0.7/pycafe-private/public/backgrounds/image17.svg +9 -0
- pycafe_server-0.0.7/pycafe-private/public/backgrounds/image18.svg +9 -0
- pycafe_server-0.0.7/pycafe-private/public/badge.svg +1 -0
- pycafe_server-0.0.7/pycafe-private/public/bootstrap_jupyter_kernel.py +52 -0
- pycafe_server-0.0.7/pycafe-private/public/coffeecup.gif +0 -0
- pycafe_server-0.0.7/pycafe-private/public/dash_daq-0.5.0-py3-none-any.whl +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/dash-app.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/dash-open.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/dash-preview.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/dash-share-app.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/dash-share-embed.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/dash-share.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/dash-upload.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/panel-app.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/panel-open.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/panel-preview.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/panel-share-app.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/panel-share-embed.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/panel-share.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/panel-upload.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/shiny-app.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/shiny-open.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/shiny-preview.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/shiny-share-app.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/shiny-share-embed.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/shiny-share.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/shiny-upload.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/solara-app.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/solara-open.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/solara-preview.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/solara-share-app.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/solara-share-embed.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/solara-share.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/solara-upload.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/streamlit-app.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/streamlit-open.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/streamlit-preview.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/streamlit-share-app.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/streamlit-share-embed.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/streamlit-share.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/streamlit-upload.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/vizro-app.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/vizro-open.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/vizro-preview.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/vizro-share-app.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/vizro-share-embed.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/vizro-share.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/apps/vizro-upload.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/ipyreact-status.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/secrets/secret-enter-value.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/secrets/secret-manager.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/secrets/secret-printed.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/secrets/secret-prompt-with-reason.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/secrets/secret-prompt.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/secrets/secret-with-reason-enter-value.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/secrets/secret-with-reason-printed.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/docs/vizro-ci.webp +0 -0
- pycafe_server-0.0.7/pycafe-private/public/fs-worker.js +2 -0
- pycafe_server-0.0.7/pycafe-private/public/fs-worker.js.LICENSE.txt +12 -0
- pycafe_server-0.0.7/pycafe-private/public/google_crc32c-1.5.0-py3-none-any.whl +0 -0
- pycafe_server-0.0.7/pycafe-private/public/icons/discord.svg +1 -0
- pycafe_server-0.0.7/pycafe-private/public/icons/folder.svg +1 -0
- pycafe_server-0.0.7/pycafe-private/public/icons/terminal.svg +1 -0
- pycafe_server-0.0.7/pycafe-private/public/ipykernel-6.9.2-py3-none-any.whl +0 -0
- pycafe_server-0.0.7/pycafe-private/public/jupyterlite_pyodide_kernel-0.0.8-py3-none-any.whl +0 -0
- pycafe_server-0.0.7/pycafe-private/public/logo.png +0 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/gradio_logo_full.svg +20 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/gradio_logo_full_dark.svg +23 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/panel_logo.png +0 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/panel_logo_full.png +0 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/panel_logo_full_dark.png +0 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/plotly_logo.png +0 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/plotly_logo_full.png +0 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/plotly_logo_full_white.png +0 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/plotly_logo_white.png +0 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/pycafe_logo.png +0 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/python.svg +265 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/shiny_logo.png +0 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/shiny_logo_full.svg +80 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/shiny_logo_full_white.svg +80 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/solara_logo.svg +8 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/streamlit_logo.png +0 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/streamlit_logo_full.svg +6 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/streamlit_logo_full_white.svg +6 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/vizro_logo.svg +3 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/vizro_logo_full.svg +9 -0
- pycafe_server-0.0.7/pycafe-private/public/logos/vizro_logo_full_white.svg +9 -0
- pycafe_server-0.0.7/pycafe-private/public/next.svg +1 -0
- pycafe_server-0.0.7/pycafe-private/public/pyodide_kernel-0.0.8-py3-none-any.whl +0 -0
- pycafe_server-0.0.7/pycafe-private/public/pyperclip-1.8.2-py3-none-any.whl +0 -0
- pycafe_server-0.0.7/pycafe-private/public/qr_buy_eu.png +0 -0
- pycafe_server-0.0.7/pycafe-private/public/qr_buy_us.png +0 -0
- pycafe_server-0.0.7/pycafe-private/public/requirements.txt +16 -0
- pycafe_server-0.0.7/pycafe-private/public/service-worker.js +1 -0
- pycafe_server-0.0.7/pycafe-private/public/test_dash.py +59 -0
- pycafe_server-0.0.7/pycafe-private/public/test_ipykernel.py +40 -0
- pycafe_server-0.0.7/pycafe-private/public/test_jupyterlab.py +51 -0
- pycafe_server-0.0.7/pycafe-private/public/test_solara.py +77 -0
- pycafe_server-0.0.7/pycafe-private/public/test_starlette.py +65 -0
- pycafe_server-0.0.7/pycafe-private/public/test_streamlit.py +31 -0
- pycafe_server-0.0.7/pycafe-private/public/test_tornado.py +94 -0
- pycafe_server-0.0.7/pycafe-private/public/tor.py +18 -0
- pycafe_server-0.0.7/pycafe-private/public/tornado-6.4.2-py3-none-any.whl +0 -0
- pycafe_server-0.0.7/pycafe-private/public/vercel.svg +1 -0
- pycafe_server-0.0.7/pycafe-private/public/webworker.js +2 -0
- pycafe_server-0.0.7/pycafe-private/public/webworker.js.LICENSE.txt +5 -0
- pycafe_server-0.0.7/pycafe-private/tsconfig.json +29 -0
- pycafe_server-0.0.7/pyproject.toml +45 -0
- pycafe_server-0.0.7/release.md +24 -0
- pycafe_server-0.0.7/release.sh +7 -0
- pycafe_server-0.0.7/src/pycafe_server/__about__.py +4 -0
- pycafe_server-0.0.7/src/pycafe_server/__init__.py +3 -0
- pycafe_server-0.0.7/src/pycafe_server/asgi.py +345 -0
- pycafe_server-0.0.7/src/pycafe_server/auth.py +311 -0
- pycafe_server-0.0.7/src/pycafe_server/config.py +172 -0
- pycafe_server-0.0.7/src/pycafe_server/cookie.py +73 -0
- pycafe_server-0.0.7/src/pycafe_server/database.py +174 -0
- pycafe_server-0.0.7/src/pycafe_server/license.py +99 -0
- pycafe_server-0.0.7/src/pycafe_server/session.py +56 -0
- pycafe_server-0.0.7/src/pycafe_server/sign.py +14 -0
- pycafe_server-0.0.7/src/pycafe_server/static/404.html +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/-dsYd_IR6KZ1xCK1JGQIe/_buildManifest.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/-dsYd_IR6KZ1xCK1JGQIe/_ssgManifest.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/117-2d310aa1d3fedd11.js +2 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/144-86024bdc2248d212.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/250-778b8977023babac.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/36-fbf60547c50ddd6d.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/484.3e91a8877443b77f.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/684-92effdd3a90cbd04.js +2 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/686-7260ec324cabf91a.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/70-70f8b9c8e8b73c0d.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/83-e3a2a619fdeb083b.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/92-69451410f0d6b437.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/921-9ecc230270e58d5f.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/aaea2bcf-debd16af2e1ee8d8.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/app/_not-found/page-320d5b624e913067.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/app/admin/page-ad0c1dd3957e012a.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/app/layout-182dee2a35e31a08.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/app/page-a5c474768bb5f2e2.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/app/sign-in/page-4f90785e5fc83287.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/app/snippet/[type]/[version]/page-fb30ffc54630e8fd.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/app/view/page-e53355c1ed692ec4.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/bc0697a0-9b4145a23a803cb0.js +3 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/d8465030-fe21b9c8223e3143.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/fd9d1056-ad5bbc8af4b8126c.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/framework-00a8ba1a63cfdc9e.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/main-830d03220a87b2cf.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/main-app-fec1dc80d88c979a.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/pages/_app-15e2daefa259f0b5.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/pages/_error-28b803cb2479b966.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/chunks/webpack-a25853d04f8b4fca.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/css/00810e171700dd8c.css +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/css/107ede932147228b.css +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/css/2c73632f60809884.css +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/css/70765a0735f6401f.css +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/css/ac106bbd0da9ef31.css +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/css/c35ecba93103ef73.css +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/26a46d62cd723877-s.woff2 +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/55c55f0601d81cf3-s.woff2 +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/581909926a08bbc8-s.woff2 +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/6d93bde91c0c2823-s.woff2 +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/97e0cb1ae144a2a9-s.woff2 +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/a34f9d1faa5f3315-s.p.woff2 +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/df0a9ae256c0569c-s.woff2 +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons-outlined.78a93b20.woff +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons-outlined.f86cb7b0.woff2 +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons-round.92dc7ca2.woff +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons-round.b10ec9db.woff2 +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons-sharp.3885863e.woff2 +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons-sharp.a71cb2bf.woff +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons-two-tone.588d6313.woff +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons-two-tone.675bd578.woff2 +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons.4ad034d2.woff +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/_next/static/media/material-icons.59322316.woff2 +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/admin.html +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/admin.txt +9 -0
- pycafe_server-0.0.7/src/pycafe_server/static/app.py +102 -0
- pycafe_server-0.0.7/src/pycafe_server/static/backgrounds/image16.svg +9 -0
- pycafe_server-0.0.7/src/pycafe_server/static/backgrounds/image17.svg +9 -0
- pycafe_server-0.0.7/src/pycafe_server/static/backgrounds/image18.svg +9 -0
- pycafe_server-0.0.7/src/pycafe_server/static/badge.svg +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/bootstrap_jupyter_kernel.py +52 -0
- pycafe_server-0.0.7/src/pycafe_server/static/coffeecup.gif +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/dash_daq-0.5.0-py3-none-any.whl +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/dash-app.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/dash-open.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/dash-preview.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/dash-share-app.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/dash-share-embed.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/dash-share.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/dash-upload.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/panel-app.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/panel-open.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/panel-preview.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/panel-share-app.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/panel-share-embed.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/panel-share.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/panel-upload.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/shiny-app.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/shiny-open.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/shiny-preview.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/shiny-share-app.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/shiny-share-embed.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/shiny-share.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/shiny-upload.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/solara-app.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/solara-open.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/solara-preview.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/solara-share-app.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/solara-share-embed.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/solara-share.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/solara-upload.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/streamlit-app.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/streamlit-open.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/streamlit-preview.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/streamlit-share-app.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/streamlit-share-embed.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/streamlit-share.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/streamlit-upload.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/vizro-app.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/vizro-open.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/vizro-preview.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/vizro-share-app.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/vizro-share-embed.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/vizro-share.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/apps/vizro-upload.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/ipyreact-status.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/secrets/secret-enter-value.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/secrets/secret-manager.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/secrets/secret-printed.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/secrets/secret-prompt-with-reason.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/secrets/secret-prompt.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/secrets/secret-with-reason-enter-value.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/secrets/secret-with-reason-printed.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/docs/vizro-ci.webp +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/favicon.ico +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/fs-worker.js +2 -0
- pycafe_server-0.0.7/src/pycafe_server/static/fs-worker.js.LICENSE.txt +12 -0
- pycafe_server-0.0.7/src/pycafe_server/static/google_crc32c-1.5.0-py3-none-any.whl +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/icons/discord.svg +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/icons/folder.svg +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/icons/terminal.svg +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/index.html +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/index.txt +9 -0
- pycafe_server-0.0.7/src/pycafe_server/static/ipykernel-6.9.2-py3-none-any.whl +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/jupyterlite_pyodide_kernel-0.0.8-py3-none-any.whl +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logo.png +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/gradio_logo_full.svg +20 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/gradio_logo_full_dark.svg +23 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/panel_logo.png +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/panel_logo_full.png +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/panel_logo_full_dark.png +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/plotly_logo.png +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/plotly_logo_full.png +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/plotly_logo_full_white.png +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/plotly_logo_white.png +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/pycafe_logo.png +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/python.svg +265 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/shiny_logo.png +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/shiny_logo_full.svg +80 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/shiny_logo_full_white.svg +80 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/solara_logo.svg +8 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/streamlit_logo.png +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/streamlit_logo_full.svg +6 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/streamlit_logo_full_white.svg +6 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/vizro_logo.svg +3 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/vizro_logo_full.svg +9 -0
- pycafe_server-0.0.7/src/pycafe_server/static/logos/vizro_logo_full_white.svg +9 -0
- pycafe_server-0.0.7/src/pycafe_server/static/next.svg +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/pyodide_kernel-0.0.8-py3-none-any.whl +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/pyperclip-1.8.2-py3-none-any.whl +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/qr_buy_eu.png +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/qr_buy_us.png +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/requirements.txt +16 -0
- pycafe_server-0.0.7/src/pycafe_server/static/service-worker.js +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/sign-in.html +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/sign-in.txt +9 -0
- pycafe_server-0.0.7/src/pycafe_server/static/snippet/dash/v1.html +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/snippet/dash/v1.txt +10 -0
- pycafe_server-0.0.7/src/pycafe_server/static/snippet/panel/v1.html +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/snippet/panel/v1.txt +10 -0
- pycafe_server-0.0.7/src/pycafe_server/static/snippet/shiny/v1.html +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/snippet/shiny/v1.txt +10 -0
- pycafe_server-0.0.7/src/pycafe_server/static/snippet/solara/v1.html +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/snippet/solara/v1.txt +10 -0
- pycafe_server-0.0.7/src/pycafe_server/static/snippet/streamlit/v1.html +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/snippet/streamlit/v1.txt +10 -0
- pycafe_server-0.0.7/src/pycafe_server/static/snippet/vizro/v1.html +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/snippet/vizro/v1.txt +10 -0
- pycafe_server-0.0.7/src/pycafe_server/static/test_dash.py +59 -0
- pycafe_server-0.0.7/src/pycafe_server/static/test_ipykernel.py +40 -0
- pycafe_server-0.0.7/src/pycafe_server/static/test_jupyterlab.py +51 -0
- pycafe_server-0.0.7/src/pycafe_server/static/test_solara.py +77 -0
- pycafe_server-0.0.7/src/pycafe_server/static/test_starlette.py +65 -0
- pycafe_server-0.0.7/src/pycafe_server/static/test_streamlit.py +31 -0
- pycafe_server-0.0.7/src/pycafe_server/static/test_tornado.py +94 -0
- pycafe_server-0.0.7/src/pycafe_server/static/tor.py +18 -0
- pycafe_server-0.0.7/src/pycafe_server/static/tornado-6.4.2-py3-none-any.whl +0 -0
- pycafe_server-0.0.7/src/pycafe_server/static/vercel.svg +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/view.html +1 -0
- pycafe_server-0.0.7/src/pycafe_server/static/view.txt +9 -0
- pycafe_server-0.0.7/src/pycafe_server/static/webworker.js +2 -0
- pycafe_server-0.0.7/src/pycafe_server/static/webworker.js.LICENSE.txt +5 -0
- pycafe_server-0.0.7/src/pycafe_server/uv_util.py +1 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
[bumpversion]
|
|
2
|
+
current_version = 0.0.7
|
|
3
|
+
commit = True
|
|
4
|
+
tag = True
|
|
5
|
+
tag_name = v{new_version}
|
|
6
|
+
tag_message = Bump version pycafe-server: {current_version} → {new_version}
|
|
7
|
+
message = Bump version pycafe-server: {current_version} → {new_version}
|
|
8
|
+
|
|
9
|
+
[bumpversion:file:pycafe-private/package.json]
|
|
10
|
+
|
|
11
|
+
[bumpversion:file:src/pycafe_server/__about__.py]
|
|
12
|
+
|
|
13
|
+
[bumpversion:file:release.md]
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
|
2
|
+
|
|
3
|
+
# dependencies
|
|
4
|
+
node_modules
|
|
5
|
+
/.pnp
|
|
6
|
+
.pnp.js
|
|
7
|
+
|
|
8
|
+
# testing
|
|
9
|
+
/coverage
|
|
10
|
+
|
|
11
|
+
# next.js
|
|
12
|
+
.next/
|
|
13
|
+
/out/
|
|
14
|
+
|
|
15
|
+
# production
|
|
16
|
+
/build
|
|
17
|
+
|
|
18
|
+
# misc
|
|
19
|
+
.DS_Store
|
|
20
|
+
*.pem
|
|
21
|
+
|
|
22
|
+
# debug
|
|
23
|
+
npm-debug.log*
|
|
24
|
+
yarn-debug.log*
|
|
25
|
+
yarn-error.log*
|
|
26
|
+
|
|
27
|
+
# local env files
|
|
28
|
+
.env*.local
|
|
29
|
+
|
|
30
|
+
# vercel
|
|
31
|
+
.vercel
|
|
32
|
+
|
|
33
|
+
# typescript
|
|
34
|
+
*.tsbuildinfo
|
|
35
|
+
next-env.d.ts
|
|
36
|
+
|
|
37
|
+
public/_jupyter
|
|
38
|
+
# pycache
|
|
39
|
+
__pycache__/
|
|
40
|
+
|
|
41
|
+
lib/
|
|
42
|
+
public/_wheels/
|
|
43
|
+
public/fs-worker.js
|
|
44
|
+
public/image-worker.js
|
|
45
|
+
public/service-worker.js
|
|
46
|
+
public/webworker.js
|
|
47
|
+
|
|
48
|
+
packages/jc/dist/
|
|
49
|
+
|
|
50
|
+
# Sentry Config File
|
|
51
|
+
.env.sentry-build-plugin
|
|
52
|
+
|
|
53
|
+
packages/pycafe_server/src/pycafe_server/static
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Development setup
|
|
2
|
+
|
|
3
|
+
## Installation
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
(cd pycafe-private && npm install)
|
|
7
|
+
pip install -e .
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Running the development server
|
|
11
|
+
|
|
12
|
+
Run nextjs in 1 terminal:
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
$ (cd pycafe-private && npm run dev)
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Run the Python server in another terminal:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
$ ENV=dev uvicorn pycafe_server.asgi:app --port 8004
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Navigate to http://localhost:3002 to use the app with the development server (hot reloading).
|
|
25
|
+
|
|
26
|
+
If you run with `ENV=dev` it will set the CORS headers to allow requests from `http://localhost:3002` to reach the Python server.
|
|
27
|
+
|
|
28
|
+
## Testing the production build
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
$ (cd pycafe-private && npm run build)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Now navigate to the Python server only: http://localhost:8004
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
Not open source, contact contact@py.cafe for licencing.
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 JupyterCafe
|
|
4
|
+
|
|
5
|
+
All rights reserved.
|
|
6
|
+
|
|
7
|
+
This software and associated documentation files (the "Software") is licensed and not sold. Permission is hereby granted, free of charge, to use the Software strictly in accordance with the accompanying commercial agreement.
|
|
8
|
+
|
|
9
|
+
Redistribution, modification, or resale is strictly prohibited without express written permission.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: pycafe-server
|
|
3
|
+
Version: 0.0.7
|
|
4
|
+
Summary: Run your own PyCafe server on on-premises
|
|
5
|
+
Project-URL: Documentation, https://py.cafe/docs/self-hosted
|
|
6
|
+
Project-URL: Issues, https://py.cafe/docs/self-hosted
|
|
7
|
+
Author-email: "Maarten A. Breddels" <maartenbreddels@gmail.com>
|
|
8
|
+
License: Not open source, contact contact@py.cafe for licencing.
|
|
9
|
+
|
|
10
|
+
Copyright (c) 2024 JupyterCafe
|
|
11
|
+
|
|
12
|
+
All rights reserved.
|
|
13
|
+
|
|
14
|
+
This software and associated documentation files (the "Software") is licensed and not sold. Permission is hereby granted, free of charge, to use the Software strictly in accordance with the accompanying commercial agreement.
|
|
15
|
+
|
|
16
|
+
Redistribution, modification, or resale is strictly prohibited without express written permission.
|
|
17
|
+
License-File: LICENSE.txt
|
|
18
|
+
Classifier: License :: Other/Proprietary License
|
|
19
|
+
Classifier: Programming Language :: Python
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.7
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
25
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
26
|
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
27
|
+
Requires-Python: >=3.7
|
|
28
|
+
Requires-Dist: authlib
|
|
29
|
+
Requires-Dist: bump2version
|
|
30
|
+
Requires-Dist: httpx
|
|
31
|
+
Requires-Dist: itsdangerous
|
|
32
|
+
Requires-Dist: pyjwt
|
|
33
|
+
Requires-Dist: requests
|
|
34
|
+
Requires-Dist: sqlalchemy>=2
|
|
35
|
+
Requires-Dist: starlette
|
|
36
|
+
Requires-Dist: uv>=0.3.5
|
|
37
|
+
Requires-Dist: uvicorn
|
|
38
|
+
Description-Content-Type: text/markdown
|
|
39
|
+
|
|
40
|
+
# pycafe_server
|
|
41
|
+
|
|
42
|
+
[](https://pypi.org/project/pycafe-server)
|
|
43
|
+
[](https://pypi.org/project/pycafe-server)
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
**Table of Contents**
|
|
48
|
+
|
|
49
|
+
- [Installation](#installation)
|
|
50
|
+
- [License](#license)
|
|
51
|
+
|
|
52
|
+
## Installation
|
|
53
|
+
|
|
54
|
+
```console
|
|
55
|
+
pip install pycafe-server
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## License
|
|
59
|
+
|
|
60
|
+
You need a license for `pycafe-server`, it is not open source.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# pycafe_server
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/pycafe-server)
|
|
4
|
+
[](https://pypi.org/project/pycafe-server)
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
**Table of Contents**
|
|
9
|
+
|
|
10
|
+
- [Installation](#installation)
|
|
11
|
+
- [License](#license)
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```console
|
|
16
|
+
pip install pycafe-server
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## License
|
|
20
|
+
|
|
21
|
+
You need a license for `pycafe-server`, it is not open source.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
|
2
|
+
|
|
3
|
+
# dependencies
|
|
4
|
+
/node_modules
|
|
5
|
+
/.pnp
|
|
6
|
+
.pnp.js
|
|
7
|
+
.yarn/install-state.gz
|
|
8
|
+
|
|
9
|
+
# testing
|
|
10
|
+
/coverage
|
|
11
|
+
|
|
12
|
+
# next.js
|
|
13
|
+
/.next/
|
|
14
|
+
/out/
|
|
15
|
+
|
|
16
|
+
# production
|
|
17
|
+
/build
|
|
18
|
+
|
|
19
|
+
# misc
|
|
20
|
+
.DS_Store
|
|
21
|
+
*.pem
|
|
22
|
+
|
|
23
|
+
# debug
|
|
24
|
+
npm-debug.log*
|
|
25
|
+
yarn-debug.log*
|
|
26
|
+
yarn-error.log*
|
|
27
|
+
|
|
28
|
+
# local env files
|
|
29
|
+
.env*.local
|
|
30
|
+
|
|
31
|
+
# vercel
|
|
32
|
+
.vercel
|
|
33
|
+
|
|
34
|
+
# typescript
|
|
35
|
+
*.tsbuildinfo
|
|
36
|
+
next-env.d.ts
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
|
|
2
|
+
|
|
3
|
+
## Getting Started
|
|
4
|
+
|
|
5
|
+
First, run the development server:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm run dev
|
|
9
|
+
# or
|
|
10
|
+
yarn dev
|
|
11
|
+
# or
|
|
12
|
+
pnpm dev
|
|
13
|
+
# or
|
|
14
|
+
bun dev
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
|
18
|
+
|
|
19
|
+
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
|
|
20
|
+
|
|
21
|
+
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
|
|
22
|
+
|
|
23
|
+
## Learn More
|
|
24
|
+
|
|
25
|
+
To learn more about Next.js, take a look at the following resources:
|
|
26
|
+
|
|
27
|
+
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
|
28
|
+
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
|
29
|
+
|
|
30
|
+
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
|
|
31
|
+
|
|
32
|
+
## Deploy on Vercel
|
|
33
|
+
|
|
34
|
+
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
|
35
|
+
|
|
36
|
+
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { settings } from "@/src/data";
|
|
4
|
+
import { useUser } from "@/src/user";
|
|
5
|
+
import { Button, Tooltip } from "@mui/material";
|
|
6
|
+
import useSWR from "swr";
|
|
7
|
+
|
|
8
|
+
export type Login = {
|
|
9
|
+
user_id: string;
|
|
10
|
+
email: string;
|
|
11
|
+
userinfo: string;
|
|
12
|
+
datetime: string;
|
|
13
|
+
is_admin: boolean;
|
|
14
|
+
is_editor: boolean;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const fetcher = async (...args: any[]): Promise<Login[]> => {
|
|
18
|
+
//@ts-ignore
|
|
19
|
+
const res = await fetch(...args);
|
|
20
|
+
if (!res.ok) {
|
|
21
|
+
throw new Error("Failed to fetch logins");
|
|
22
|
+
}
|
|
23
|
+
const data = await res.json();
|
|
24
|
+
return data["logins"] as Login[];
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default function Page() {
|
|
28
|
+
const user = useUser();
|
|
29
|
+
const { data, error, isLoading } = useSWR("/api/logins", fetcher);
|
|
30
|
+
if (settings.requireAuth) {
|
|
31
|
+
if (user === null) {
|
|
32
|
+
return (
|
|
33
|
+
<Button variant="contained" color="primary" href={`/_login?next_url=${window.location.pathname}`}>
|
|
34
|
+
Sign in
|
|
35
|
+
</Button>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
if (!user.info.is_admin) {
|
|
39
|
+
return <h1>requires admin privileges</h1>;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (isLoading) return <h1>Loading...</h1>;
|
|
44
|
+
if (error) return <h1>Error: {`${error}`}</h1>;
|
|
45
|
+
if (!data) return <h1>No data</h1>;
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<div>
|
|
49
|
+
<h1>Admin</h1>
|
|
50
|
+
<h2>Info</h2>
|
|
51
|
+
Instance ID: {settings.instanceId}
|
|
52
|
+
<h2>Logins</h2>
|
|
53
|
+
<>Last login, per user, per day:</>
|
|
54
|
+
<table>
|
|
55
|
+
<thead>
|
|
56
|
+
<tr>
|
|
57
|
+
<th>user_id</th>
|
|
58
|
+
<th>email</th>
|
|
59
|
+
{/* <th>userinfo</th> */}
|
|
60
|
+
<th>datetime</th>
|
|
61
|
+
<th>is_admin</th>
|
|
62
|
+
<th>is_editor</th>
|
|
63
|
+
</tr>
|
|
64
|
+
</thead>
|
|
65
|
+
<tbody>
|
|
66
|
+
{data.map((login) => {
|
|
67
|
+
const userInfo = JSON.stringify(login.userinfo);
|
|
68
|
+
|
|
69
|
+
return (
|
|
70
|
+
<tr key={login.user_id}>
|
|
71
|
+
<td>{login.user_id}</td>
|
|
72
|
+
<td>{login.email}</td>
|
|
73
|
+
{/* <td style={{ maxWidth: "200px", maxHeight: "30px", overflow: "hidden" }}>
|
|
74
|
+
<Tooltip title={userInfo}>
|
|
75
|
+
<p>{userInfo}</p>
|
|
76
|
+
</Tooltip>
|
|
77
|
+
</td> */}
|
|
78
|
+
<td>{`${login.datetime}`}</td>
|
|
79
|
+
<td>{login.is_admin.toString()}</td>
|
|
80
|
+
<td>{login.is_editor.toString()}</td>
|
|
81
|
+
</tr>
|
|
82
|
+
);
|
|
83
|
+
})}
|
|
84
|
+
</tbody>
|
|
85
|
+
</table>
|
|
86
|
+
</div>
|
|
87
|
+
);
|
|
88
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import "@/app/globals.css";
|
|
3
|
+
import { Inter } from "next/font/google";
|
|
4
|
+
import AutoTheme from "@/app/components/AutoTheme";
|
|
5
|
+
// import { Analytics } from "@vercel/analytics/react";
|
|
6
|
+
import { AppRouterCacheProvider } from "@mui/material-nextjs/v13-appRouter";
|
|
7
|
+
import { UserAndSettingsProvider } from "@/components/user-server";
|
|
8
|
+
|
|
9
|
+
const inter = Inter({ subsets: ["latin"] });
|
|
10
|
+
|
|
11
|
+
// const title = `PyCafe: ${tagline}`;
|
|
12
|
+
// const description = "Playground for Python web frameworks. Run and edit Python code snippets for web frameworks in a web browser.";
|
|
13
|
+
|
|
14
|
+
// export const metadata = {
|
|
15
|
+
// title,
|
|
16
|
+
// description,
|
|
17
|
+
// };
|
|
18
|
+
|
|
19
|
+
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
20
|
+
return (
|
|
21
|
+
<AppRouterCacheProvider>
|
|
22
|
+
<AutoTheme>
|
|
23
|
+
<html lang="en">
|
|
24
|
+
<body suppressHydrationWarning={true} className={inter.className}>
|
|
25
|
+
<UserAndSettingsProvider>{children}</UserAndSettingsProvider>
|
|
26
|
+
{/* <Analytics /> */}
|
|
27
|
+
</body>
|
|
28
|
+
</html>
|
|
29
|
+
</AutoTheme>
|
|
30
|
+
</AppRouterCacheProvider>
|
|
31
|
+
);
|
|
32
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
.page {
|
|
2
|
+
--gray-rgb: 0, 0, 0;
|
|
3
|
+
--gray-alpha-200: rgba(var(--gray-rgb), 0.08);
|
|
4
|
+
--gray-alpha-100: rgba(var(--gray-rgb), 0.05);
|
|
5
|
+
|
|
6
|
+
--button-primary-hover: #383838;
|
|
7
|
+
--button-secondary-hover: #f2f2f2;
|
|
8
|
+
|
|
9
|
+
display: grid;
|
|
10
|
+
grid-template-rows: 20px 1fr 20px;
|
|
11
|
+
align-items: center;
|
|
12
|
+
justify-items: center;
|
|
13
|
+
min-height: 100svh;
|
|
14
|
+
padding: 80px;
|
|
15
|
+
gap: 64px;
|
|
16
|
+
font-family: var(--font-geist-sans);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@media (prefers-color-scheme: dark) {
|
|
20
|
+
.page {
|
|
21
|
+
--gray-rgb: 255, 255, 255;
|
|
22
|
+
--gray-alpha-200: rgba(var(--gray-rgb), 0.145);
|
|
23
|
+
--gray-alpha-100: rgba(var(--gray-rgb), 0.06);
|
|
24
|
+
|
|
25
|
+
--button-primary-hover: #ccc;
|
|
26
|
+
--button-secondary-hover: #1a1a1a;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.main {
|
|
31
|
+
display: flex;
|
|
32
|
+
flex-direction: column;
|
|
33
|
+
gap: 32px;
|
|
34
|
+
grid-row-start: 2;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.main ol {
|
|
38
|
+
font-family: var(--font-geist-mono);
|
|
39
|
+
padding-left: 0;
|
|
40
|
+
margin: 0;
|
|
41
|
+
font-size: 14px;
|
|
42
|
+
line-height: 24px;
|
|
43
|
+
letter-spacing: -0.01em;
|
|
44
|
+
list-style-position: inside;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.main li:not(:last-of-type) {
|
|
48
|
+
margin-bottom: 8px;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.main code {
|
|
52
|
+
font-family: inherit;
|
|
53
|
+
background: var(--gray-alpha-100);
|
|
54
|
+
padding: 2px 4px;
|
|
55
|
+
border-radius: 4px;
|
|
56
|
+
font-weight: 600;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.ctas {
|
|
60
|
+
display: flex;
|
|
61
|
+
gap: 16px;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.ctas a {
|
|
65
|
+
appearance: none;
|
|
66
|
+
border-radius: 128px;
|
|
67
|
+
height: 48px;
|
|
68
|
+
padding: 0 20px;
|
|
69
|
+
border: none;
|
|
70
|
+
border: 1px solid transparent;
|
|
71
|
+
transition:
|
|
72
|
+
background 0.2s,
|
|
73
|
+
color 0.2s,
|
|
74
|
+
border-color 0.2s;
|
|
75
|
+
cursor: pointer;
|
|
76
|
+
display: flex;
|
|
77
|
+
align-items: center;
|
|
78
|
+
justify-content: center;
|
|
79
|
+
font-size: 16px;
|
|
80
|
+
line-height: 20px;
|
|
81
|
+
font-weight: 500;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
a.primary {
|
|
85
|
+
background: var(--foreground);
|
|
86
|
+
color: var(--background);
|
|
87
|
+
gap: 8px;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
a.secondary {
|
|
91
|
+
border-color: var(--gray-alpha-200);
|
|
92
|
+
min-width: 180px;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.footer {
|
|
96
|
+
grid-row-start: 3;
|
|
97
|
+
display: flex;
|
|
98
|
+
gap: 24px;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.footer a {
|
|
102
|
+
display: flex;
|
|
103
|
+
align-items: center;
|
|
104
|
+
gap: 8px;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.footer img {
|
|
108
|
+
flex-shrink: 0;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/* Enable hover only on non-touch devices */
|
|
112
|
+
@media (hover: hover) and (pointer: fine) {
|
|
113
|
+
a.primary:hover {
|
|
114
|
+
background: var(--button-primary-hover);
|
|
115
|
+
border-color: transparent;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
a.secondary:hover {
|
|
119
|
+
background: var(--button-secondary-hover);
|
|
120
|
+
border-color: transparent;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.footer a:hover {
|
|
124
|
+
text-decoration: underline;
|
|
125
|
+
text-underline-offset: 4px;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
@media (max-width: 600px) {
|
|
130
|
+
.page {
|
|
131
|
+
padding: 32px;
|
|
132
|
+
padding-bottom: 80px;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.main {
|
|
136
|
+
align-items: center;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.main ol {
|
|
140
|
+
text-align: center;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.ctas {
|
|
144
|
+
flex-direction: column;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.ctas a {
|
|
148
|
+
font-size: 14px;
|
|
149
|
+
height: 40px;
|
|
150
|
+
padding: 0 16px;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
a.secondary {
|
|
154
|
+
min-width: auto;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.footer {
|
|
158
|
+
flex-wrap: wrap;
|
|
159
|
+
align-items: center;
|
|
160
|
+
justify-content: center;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
@media (prefers-color-scheme: dark) {
|
|
165
|
+
.logo {
|
|
166
|
+
filter: invert();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { ProjectPageProps } from "@/src/types";
|
|
4
|
+
import { getIconByType } from "@/components/dashboard";
|
|
5
|
+
import { useTheme } from "@mui/material/styles";
|
|
6
|
+
import { Box, Button, Theme, useMediaQuery } from "@mui/material";
|
|
7
|
+
import "material-icons/iconfont/material-icons.css";
|
|
8
|
+
import { frameworks, settings, tagline } from "@/src/data";
|
|
9
|
+
import { useUser } from "@/src/user";
|
|
10
|
+
import { CardButton } from "@/app/components/cardbutton";
|
|
11
|
+
import Link from "next/link";
|
|
12
|
+
import Header from "@/app/components/header";
|
|
13
|
+
|
|
14
|
+
export const dynamic = "force-static";
|
|
15
|
+
|
|
16
|
+
function CreateProjectBanner(props: { theme: Theme; isMobile?: boolean; showDescription?: boolean }) {
|
|
17
|
+
const showDescription = props.showDescription ?? false;
|
|
18
|
+
const isMobile = props.isMobile ?? false;
|
|
19
|
+
const darkMode = props.theme.palette.mode === "dark";
|
|
20
|
+
const user = useUser();
|
|
21
|
+
// either no logging in is configured (trial), or the user is an editor
|
|
22
|
+
const canEdit = !user || user.info.is_editor;
|
|
23
|
+
return (
|
|
24
|
+
<div className="create-banner">
|
|
25
|
+
<h2>{canEdit ? "Open the editor to create a new app" : "You are not an editor, and cannot create projects"}</h2>
|
|
26
|
+
<div className="create-buttons">
|
|
27
|
+
{canEdit &&
|
|
28
|
+
settings.frameworks.map((frameworkName) => {
|
|
29
|
+
const framework = frameworks[frameworkName];
|
|
30
|
+
return (
|
|
31
|
+
<a href={`/snippet/${framework.appType}/v1`} key={framework.appType} style={{ textDecoration: "none", color: "unset" }}>
|
|
32
|
+
<CardButton
|
|
33
|
+
title={framework.name}
|
|
34
|
+
description={showDescription ? framework.description2 : ""}
|
|
35
|
+
isMobile={isMobile}
|
|
36
|
+
image={getIconByType(framework.appType, showDescription, darkMode)}
|
|
37
|
+
actionIcon="add"
|
|
38
|
+
disabled={!canEdit}
|
|
39
|
+
/>
|
|
40
|
+
</a>
|
|
41
|
+
);
|
|
42
|
+
})}
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export default function Page({ params, searchParams }: ProjectPageProps, appview: boolean = false) {
|
|
49
|
+
const theme = useTheme();
|
|
50
|
+
const user = useUser();
|
|
51
|
+
const isMobile = useMediaQuery("(max-width: 1200px)");
|
|
52
|
+
return (
|
|
53
|
+
<>
|
|
54
|
+
{settings.trialmode && (
|
|
55
|
+
<h3>
|
|
56
|
+
PyCafe server is running in trial mode, please obtain a license key at{" "}
|
|
57
|
+
<a href="https://py.cafe/contact" target="_blank">
|
|
58
|
+
PyCafe
|
|
59
|
+
</a>
|
|
60
|
+
</h3>
|
|
61
|
+
)}
|
|
62
|
+
<Header subtitle={tagline} />
|
|
63
|
+
<div className="hero">
|
|
64
|
+
{!settings.requireAuth || user ? <CreateProjectBanner theme={theme} showDescription={true} isMobile={isMobile} /> : null}
|
|
65
|
+
{!settings.requireAuth || user ? null : (
|
|
66
|
+
<Button variant="contained" color="primary" href="/_login">
|
|
67
|
+
Sign in
|
|
68
|
+
</Button>
|
|
69
|
+
)}
|
|
70
|
+
</div>
|
|
71
|
+
{!settings.requireAuth || user ? (
|
|
72
|
+
<div className="framework-container" style={{ width: "800px" }}>
|
|
73
|
+
<Box sx={{ boxShadow: 2, p: 5 }} className="framework-box future-feature" style={{ paddingLeft: "0", paddingRight: "0" }}>
|
|
74
|
+
<div className="vote-container">
|
|
75
|
+
<div className="box-text" style={{ minWidth: "500px" }}>
|
|
76
|
+
<Link href="/view">Open the PyCafe viewer.</Link>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</Box>
|
|
80
|
+
</div>
|
|
81
|
+
) : null}
|
|
82
|
+
</>
|
|
83
|
+
);
|
|
84
|
+
// return <App type="solara" version="v1" />;
|
|
85
|
+
// return <h1>hi</h1>
|
|
86
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import React from "react";
|
|
3
|
+
|
|
4
|
+
export default function Page() {
|
|
5
|
+
React.useEffect(() => {
|
|
6
|
+
if (window.opener) {
|
|
7
|
+
window.opener.postMessage({ type: "sign-in:loaded" }, "*");
|
|
8
|
+
// we can close ourselves, because we let the parent know we are loaded
|
|
9
|
+
window.close();
|
|
10
|
+
}
|
|
11
|
+
}, []);
|
|
12
|
+
return <>Checking your credentials...</>;
|
|
13
|
+
}
|