├── .github └── workflows │ └── run_test.yaml ├── .gitignore ├── .vscode └── launch.json ├── CONTRIBUTORS.rst ├── LICENSE.md ├── Makefile ├── README.rst ├── apps ├── __init__.py ├── _dashboard │ ├── __init__.py │ ├── diff2kryten.py │ ├── static │ │ ├── css │ │ │ ├── future.css │ │ │ ├── gitlog.min.css │ │ │ └── no.css │ │ ├── favicon.ico │ │ ├── images │ │ │ ├── alert-blue.gif │ │ │ ├── alert-green.gif │ │ │ ├── alert-orange.gif │ │ │ ├── alert-red.gif │ │ │ ├── alert-yellow.gif │ │ │ ├── forkme.png │ │ │ └── widget.gif │ │ └── js │ │ │ ├── ace │ │ │ ├── ace.js │ │ │ ├── ext-beautify.js │ │ │ ├── ext-chromevox.js │ │ │ ├── ext-elastic_tabstops_lite.js │ │ │ ├── ext-emmet.js │ │ │ ├── ext-error_marker.js │ │ │ ├── ext-keybinding_menu.js │ │ │ ├── ext-language_tools.js │ │ │ ├── ext-linking.js │ │ │ ├── ext-modelist.js │ │ │ ├── ext-old_ie.js │ │ │ ├── ext-searchbox.js │ │ │ ├── ext-settings_menu.js │ │ │ ├── ext-spellcheck.js │ │ │ ├── ext-split.js │ │ │ ├── ext-static_highlight.js │ │ │ ├── ext-statusbar.js │ │ │ ├── ext-textarea.js │ │ │ ├── ext-themelist.js │ │ │ ├── ext-whitespace.js │ │ │ ├── keybinding-emacs.js │ │ │ ├── keybinding-vim.js │ │ │ ├── mode-abap.js │ │ │ ├── mode-abc.js │ │ │ ├── mode-actionscript.js │ │ │ ├── mode-ada.js │ │ │ ├── mode-apache_conf.js │ │ │ ├── mode-applescript.js │ │ │ ├── mode-asciidoc.js │ │ │ ├── mode-assembly_x86.js │ │ │ ├── mode-autohotkey.js │ │ │ ├── mode-batchfile.js │ │ │ ├── mode-bro.js │ │ │ ├── mode-c9search.js │ │ │ ├── mode-c_cpp.js │ │ │ ├── mode-cirru.js │ │ │ ├── mode-clojure.js │ │ │ ├── mode-cobol.js │ │ │ ├── mode-coffee.js │ │ │ ├── mode-coldfusion.js │ │ │ ├── mode-csharp.js │ │ │ ├── mode-css.js │ │ │ ├── mode-curly.js │ │ │ ├── mode-d.js │ │ │ ├── mode-dart.js │ │ │ ├── mode-diff.js │ │ │ ├── mode-django.js │ │ │ ├── mode-dockerfile.js │ │ │ ├── mode-dot.js │ │ │ ├── mode-drools.js │ │ │ ├── mode-eiffel.js │ │ │ ├── mode-ejs.js │ │ │ ├── mode-elixir.js │ │ │ ├── mode-elm.js │ │ │ ├── mode-erlang.js │ │ │ ├── mode-forth.js │ │ │ ├── mode-fortran.js │ │ │ ├── mode-ftl.js │ │ │ ├── mode-gcode.js │ │ │ ├── mode-gherkin.js │ │ │ ├── mode-gitignore.js │ │ │ ├── mode-glsl.js │ │ │ ├── mode-gobstones.js │ │ │ ├── mode-golang.js │ │ │ ├── mode-groovy.js │ │ │ ├── mode-haml.js │ │ │ ├── mode-handlebars.js │ │ │ ├── mode-haskell.js │ │ │ ├── mode-haskell_cabal.js │ │ │ ├── mode-haxe.js │ │ │ ├── mode-hjson.js │ │ │ ├── mode-html.js │ │ │ ├── mode-html_elixir.js │ │ │ ├── mode-html_ruby.js │ │ │ ├── mode-ini.js │ │ │ ├── mode-io.js │ │ │ ├── mode-jack.js │ │ │ ├── mode-jade.js │ │ │ ├── mode-java.js │ │ │ ├── mode-javascript.js │ │ │ ├── mode-json.js │ │ │ ├── mode-jsoniq.js │ │ │ ├── mode-jsp.js │ │ │ ├── mode-jsx.js │ │ │ ├── mode-julia.js │ │ │ ├── mode-kotlin.js │ │ │ ├── mode-latex.js │ │ │ ├── mode-lean.js │ │ │ ├── mode-less.js │ │ │ ├── mode-liquid.js │ │ │ ├── mode-lisp.js │ │ │ ├── mode-live_script.js │ │ │ ├── mode-livescript.js │ │ │ ├── mode-logiql.js │ │ │ ├── mode-lsl.js │ │ │ ├── mode-lua.js │ │ │ ├── mode-luapage.js │ │ │ ├── mode-lucene.js │ │ │ ├── mode-makefile.js │ │ │ ├── mode-markdown.js │ │ │ ├── mode-mask.js │ │ │ ├── mode-matlab.js │ │ │ ├── mode-maze.js │ │ │ ├── mode-mel.js │ │ │ ├── mode-mips_assembler.js │ │ │ ├── mode-mipsassembler.js │ │ │ ├── mode-mushcode.js │ │ │ ├── mode-mysql.js │ │ │ ├── mode-nix.js │ │ │ ├── mode-nsis.js │ │ │ ├── mode-objectivec.js │ │ │ ├── mode-ocaml.js │ │ │ ├── mode-pascal.js │ │ │ ├── mode-perl.js │ │ │ ├── mode-pgsql.js │ │ │ ├── mode-php.js │ │ │ ├── mode-plain_text.js │ │ │ ├── mode-powershell.js │ │ │ ├── mode-praat.js │ │ │ ├── mode-prolog.js │ │ │ ├── mode-properties.js │ │ │ ├── mode-protobuf.js │ │ │ ├── mode-python.js │ │ │ ├── mode-r.js │ │ │ ├── mode-razor.js │ │ │ ├── mode-rdoc.js │ │ │ ├── mode-rhtml.js │ │ │ ├── mode-rst.js │ │ │ ├── mode-ruby.js │ │ │ ├── mode-rust.js │ │ │ ├── mode-sass.js │ │ │ ├── mode-scad.js │ │ │ ├── mode-scala.js │ │ │ ├── mode-scheme.js │ │ │ ├── mode-scss.js │ │ │ ├── mode-sh.js │ │ │ ├── mode-sjs.js │ │ │ ├── mode-smarty.js │ │ │ ├── mode-snippets.js │ │ │ ├── mode-soy_template.js │ │ │ ├── mode-space.js │ │ │ ├── mode-sql.js │ │ │ ├── mode-sqlserver.js │ │ │ ├── mode-stylus.js │ │ │ ├── mode-svg.js │ │ │ ├── mode-swift.js │ │ │ ├── mode-swig.js │ │ │ ├── mode-tcl.js │ │ │ ├── mode-tex.js │ │ │ ├── mode-text.js │ │ │ ├── mode-textile.js │ │ │ ├── mode-toml.js │ │ │ ├── mode-tsx.js │ │ │ ├── mode-twig.js │ │ │ ├── mode-typescript.js │ │ │ ├── mode-vala.js │ │ │ ├── mode-vbscript.js │ │ │ ├── mode-velocity.js │ │ │ ├── mode-verilog.js │ │ │ ├── mode-vhdl.js │ │ │ ├── mode-wollok.js │ │ │ ├── mode-xml.js │ │ │ ├── mode-xquery.js │ │ │ ├── mode-yaml.js │ │ │ ├── snippets │ │ │ │ ├── abap.js │ │ │ │ ├── abc.js │ │ │ │ ├── actionscript.js │ │ │ │ ├── ada.js │ │ │ │ ├── apache_conf.js │ │ │ │ ├── applescript.js │ │ │ │ ├── asciidoc.js │ │ │ │ ├── assembly_x86.js │ │ │ │ ├── autohotkey.js │ │ │ │ ├── batchfile.js │ │ │ │ ├── bro.js │ │ │ │ ├── c9search.js │ │ │ │ ├── c_cpp.js │ │ │ │ ├── cirru.js │ │ │ │ ├── clojure.js │ │ │ │ ├── cobol.js │ │ │ │ ├── coffee.js │ │ │ │ ├── coldfusion.js │ │ │ │ ├── csharp.js │ │ │ │ ├── css.js │ │ │ │ ├── curly.js │ │ │ │ ├── d.js │ │ │ │ ├── dart.js │ │ │ │ ├── diff.js │ │ │ │ ├── django.js │ │ │ │ ├── dockerfile.js │ │ │ │ ├── dot.js │ │ │ │ ├── drools.js │ │ │ │ ├── eiffel.js │ │ │ │ ├── ejs.js │ │ │ │ ├── elixir.js │ │ │ │ ├── elm.js │ │ │ │ ├── erlang.js │ │ │ │ ├── forth.js │ │ │ │ ├── fortran.js │ │ │ │ ├── ftl.js │ │ │ │ ├── gcode.js │ │ │ │ ├── gherkin.js │ │ │ │ ├── gitignore.js │ │ │ │ ├── glsl.js │ │ │ │ ├── gobstones.js │ │ │ │ ├── golang.js │ │ │ │ ├── groovy.js │ │ │ │ ├── haml.js │ │ │ │ ├── handlebars.js │ │ │ │ ├── haskell.js │ │ │ │ ├── haskell_cabal.js │ │ │ │ ├── haxe.js │ │ │ │ ├── hjson.js │ │ │ │ ├── html.js │ │ │ │ ├── html_elixir.js │ │ │ │ ├── html_ruby.js │ │ │ │ ├── ini.js │ │ │ │ ├── io.js │ │ │ │ ├── jack.js │ │ │ │ ├── jade.js │ │ │ │ ├── java.js │ │ │ │ ├── javascript.js │ │ │ │ ├── json.js │ │ │ │ ├── jsoniq.js │ │ │ │ ├── jsp.js │ │ │ │ ├── jsx.js │ │ │ │ ├── julia.js │ │ │ │ ├── kotlin.js │ │ │ │ ├── latex.js │ │ │ │ ├── lean.js │ │ │ │ ├── less.js │ │ │ │ ├── liquid.js │ │ │ │ ├── lisp.js │ │ │ │ ├── live_script.js │ │ │ │ ├── livescript.js │ │ │ │ ├── logiql.js │ │ │ │ ├── lsl.js │ │ │ │ ├── lua.js │ │ │ │ ├── luapage.js │ │ │ │ ├── lucene.js │ │ │ │ ├── makefile.js │ │ │ │ ├── markdown.js │ │ │ │ ├── mask.js │ │ │ │ ├── matlab.js │ │ │ │ ├── maze.js │ │ │ │ ├── mel.js │ │ │ │ ├── mips_assembler.js │ │ │ │ ├── mipsassembler.js │ │ │ │ ├── mushcode.js │ │ │ │ ├── mysql.js │ │ │ │ ├── nix.js │ │ │ │ ├── nsis.js │ │ │ │ ├── objectivec.js │ │ │ │ ├── ocaml.js │ │ │ │ ├── pascal.js │ │ │ │ ├── perl.js │ │ │ │ ├── pgsql.js │ │ │ │ ├── php.js │ │ │ │ ├── plain_text.js │ │ │ │ ├── powershell.js │ │ │ │ ├── praat.js │ │ │ │ ├── prolog.js │ │ │ │ ├── properties.js │ │ │ │ ├── protobuf.js │ │ │ │ ├── python.js │ │ │ │ ├── r.js │ │ │ │ ├── razor.js │ │ │ │ ├── rdoc.js │ │ │ │ ├── rhtml.js │ │ │ │ ├── rst.js │ │ │ │ ├── ruby.js │ │ │ │ ├── rust.js │ │ │ │ ├── sass.js │ │ │ │ ├── scad.js │ │ │ │ ├── scala.js │ │ │ │ ├── scheme.js │ │ │ │ ├── scss.js │ │ │ │ ├── sh.js │ │ │ │ ├── sjs.js │ │ │ │ ├── smarty.js │ │ │ │ ├── snippets.js │ │ │ │ ├── soy_template.js │ │ │ │ ├── space.js │ │ │ │ ├── sql.js │ │ │ │ ├── sqlserver.js │ │ │ │ ├── stylus.js │ │ │ │ ├── svg.js │ │ │ │ ├── swift.js │ │ │ │ ├── swig.js │ │ │ │ ├── tcl.js │ │ │ │ ├── tex.js │ │ │ │ ├── text.js │ │ │ │ ├── textile.js │ │ │ │ ├── toml.js │ │ │ │ ├── tsx.js │ │ │ │ ├── twig.js │ │ │ │ ├── typescript.js │ │ │ │ ├── vala.js │ │ │ │ ├── vbscript.js │ │ │ │ ├── velocity.js │ │ │ │ ├── verilog.js │ │ │ │ ├── vhdl.js │ │ │ │ ├── wollok.js │ │ │ │ ├── xml.js │ │ │ │ ├── xquery.js │ │ │ │ └── yaml.js │ │ │ ├── theme-ambiance.js │ │ │ ├── theme-chaos.js │ │ │ ├── theme-chrome.js │ │ │ ├── theme-clouds.js │ │ │ ├── theme-clouds_midnight.js │ │ │ ├── theme-cobalt.js │ │ │ ├── theme-crimson_editor.js │ │ │ ├── theme-dawn.js │ │ │ ├── theme-dreamweaver.js │ │ │ ├── theme-eclipse.js │ │ │ ├── theme-github.js │ │ │ ├── theme-idle_fingers.js │ │ │ ├── theme-iplastic.js │ │ │ ├── theme-katzenmilch.js │ │ │ ├── theme-kr_theme.js │ │ │ ├── theme-kuroir.js │ │ │ ├── theme-merbivore.js │ │ │ ├── theme-merbivore_soft.js │ │ │ ├── theme-mono_industrial.js │ │ │ ├── theme-monokai.js │ │ │ ├── theme-pastel_on_dark.js │ │ │ ├── theme-solarized_dark.js │ │ │ ├── theme-solarized_light.js │ │ │ ├── theme-sqlserver.js │ │ │ ├── theme-terminal.js │ │ │ ├── theme-textmate.js │ │ │ ├── theme-tomorrow.js │ │ │ ├── theme-tomorrow_night.js │ │ │ ├── theme-tomorrow_night_blue.js │ │ │ ├── theme-tomorrow_night_bright.js │ │ │ ├── theme-tomorrow_night_eighties.js │ │ │ ├── theme-twilight.js │ │ │ ├── theme-vibrant_ink.js │ │ │ ├── theme-xcode.js │ │ │ ├── worker-coffee.js │ │ │ ├── worker-css.js │ │ │ ├── worker-html.js │ │ │ ├── worker-javascript.js │ │ │ ├── worker-json.js │ │ │ ├── worker-lua.js │ │ │ ├── worker-php.js │ │ │ ├── worker-xml.js │ │ │ └── worker-xquery.js │ │ │ ├── dbadmin.js │ │ │ ├── highlight.min.js │ │ │ ├── index.js │ │ │ ├── jquery.min.js │ │ │ ├── sugar.min.js │ │ │ ├── translations.js │ │ │ ├── utils.js │ │ │ └── vue.min.js │ ├── templates │ │ ├── dbadmin.html │ │ ├── gitlog.html │ │ ├── index.html │ │ ├── layout.html │ │ ├── ticket.html │ │ └── translations.html │ ├── translations │ │ └── README.md │ └── utils.py ├── _default │ ├── __init__.py │ └── static │ │ ├── css │ │ └── prism.css │ │ ├── favicon.ico │ │ ├── images │ │ └── logo.png │ │ ├── index.html │ │ └── js │ │ └── prism.js ├── _documentation │ ├── __init__.py │ └── static │ │ ├── en │ │ ├── .buildinfo │ │ ├── .nojekyll │ │ ├── _images │ │ │ ├── _scaffold.png │ │ │ ├── command.png │ │ │ ├── dashboard.png │ │ │ ├── dashboard_edit.png │ │ │ ├── dashboard_error.png │ │ │ ├── dashboard_i18n_btn.png │ │ │ ├── dashboard_i18n_ui.png │ │ │ ├── dashboard_login.png │ │ │ ├── dashboard_main.png │ │ │ ├── dashboard_new_app.png │ │ │ ├── dashboard_restapi.png │ │ │ ├── dashboard_ticket.png │ │ │ ├── example_db.png │ │ │ ├── first_run.png │ │ │ ├── form1.png │ │ │ ├── form2.png │ │ │ ├── grid.png │ │ │ ├── grid_bulmacss.png │ │ │ ├── grid_columns.png │ │ │ ├── grid_nocss.png │ │ │ ├── logo.png │ │ │ ├── main_page.png │ │ │ ├── restapi.png │ │ │ ├── restapi2.png │ │ │ ├── scaffold_tree.png │ │ │ ├── simple_counter.png │ │ │ ├── tags2.png │ │ │ └── tags_db.png │ │ ├── _static │ │ │ ├── _sphinx_javascript_frameworks_compat.js │ │ │ ├── basic.css │ │ │ ├── css │ │ │ │ ├── badge_only.css │ │ │ │ ├── dark.css │ │ │ │ ├── fonts │ │ │ │ │ ├── Roboto-Slab-Bold.woff │ │ │ │ │ ├── Roboto-Slab-Bold.woff2 │ │ │ │ │ ├── Roboto-Slab-Regular.woff │ │ │ │ │ ├── Roboto-Slab-Regular.woff2 │ │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ │ ├── fontawesome-webfont.svg │ │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ │ ├── fontawesome-webfont.woff2 │ │ │ │ │ ├── lato-bold-italic.woff │ │ │ │ │ ├── lato-bold-italic.woff2 │ │ │ │ │ ├── lato-bold.woff │ │ │ │ │ ├── lato-bold.woff2 │ │ │ │ │ ├── lato-normal-italic.woff │ │ │ │ │ ├── lato-normal-italic.woff2 │ │ │ │ │ ├── lato-normal.woff │ │ │ │ │ └── lato-normal.woff2 │ │ │ │ ├── theme.css │ │ │ │ └── toggle.css │ │ │ ├── doctools.js │ │ │ ├── documentation_options.js │ │ │ ├── file.png │ │ │ ├── fonts │ │ │ │ ├── Lato │ │ │ │ │ ├── lato-bold.eot │ │ │ │ │ ├── lato-bold.ttf │ │ │ │ │ ├── lato-bold.woff │ │ │ │ │ ├── lato-bold.woff2 │ │ │ │ │ ├── lato-bolditalic.eot │ │ │ │ │ ├── lato-bolditalic.ttf │ │ │ │ │ ├── lato-bolditalic.woff │ │ │ │ │ ├── lato-bolditalic.woff2 │ │ │ │ │ ├── lato-italic.eot │ │ │ │ │ ├── lato-italic.ttf │ │ │ │ │ ├── lato-italic.woff │ │ │ │ │ ├── lato-italic.woff2 │ │ │ │ │ ├── lato-regular.eot │ │ │ │ │ ├── lato-regular.ttf │ │ │ │ │ ├── lato-regular.woff │ │ │ │ │ └── lato-regular.woff2 │ │ │ │ └── RobotoSlab │ │ │ │ │ ├── roboto-slab-v7-bold.eot │ │ │ │ │ ├── roboto-slab-v7-bold.ttf │ │ │ │ │ ├── roboto-slab-v7-bold.woff │ │ │ │ │ ├── roboto-slab-v7-bold.woff2 │ │ │ │ │ ├── roboto-slab-v7-regular.eot │ │ │ │ │ ├── roboto-slab-v7-regular.ttf │ │ │ │ │ ├── roboto-slab-v7-regular.woff │ │ │ │ │ └── roboto-slab-v7-regular.woff2 │ │ │ ├── jquery.js │ │ │ ├── js │ │ │ │ ├── badge_only.js │ │ │ │ ├── theme.js │ │ │ │ ├── toggle.js │ │ │ │ └── versions.js │ │ │ ├── language_data.js │ │ │ ├── logo-32x32.ico │ │ │ ├── logo.png │ │ │ ├── minus.png │ │ │ ├── plus.png │ │ │ ├── pygments.css │ │ │ ├── searchtools.js │ │ │ ├── sphinx_highlight.js │ │ │ ├── tabs.css │ │ │ └── tabs.js │ │ ├── chapter-01.html │ │ ├── chapter-02.html │ │ ├── chapter-03.html │ │ ├── chapter-04.html │ │ ├── chapter-05.html │ │ ├── chapter-06.html │ │ ├── chapter-07.html │ │ ├── chapter-08.html │ │ ├── chapter-09.html │ │ ├── chapter-1.html │ │ ├── chapter-10.html │ │ ├── chapter-11.html │ │ ├── chapter-12.html │ │ ├── chapter-13.html │ │ ├── chapter-14.html │ │ ├── chapter-15.html │ │ ├── chapter-16.html │ │ ├── dark.css │ │ ├── genindex.html │ │ ├── index.html │ │ ├── objects.inv │ │ ├── search.html │ │ ├── searchindex.js │ │ └── toggle.css │ │ ├── favicon.ico │ │ ├── index.html │ │ └── pt │ │ ├── .buildinfo │ │ ├── .nojekyll │ │ ├── _images │ │ ├── _scaffold.png │ │ ├── command.png │ │ ├── dashboard.png │ │ ├── dashboard_edit.png │ │ ├── dashboard_error.png │ │ ├── dashboard_i18n_btn.png │ │ ├── dashboard_i18n_ui.png │ │ ├── dashboard_login.png │ │ ├── dashboard_main.png │ │ ├── dashboard_new_app.png │ │ ├── dashboard_restapi.png │ │ ├── dashboard_ticket.png │ │ ├── example_db.png │ │ ├── first_run.png │ │ ├── form1.png │ │ ├── form2.png │ │ ├── grid.png │ │ ├── grid_bulmacss.png │ │ ├── grid_columns.png │ │ ├── grid_nocss.png │ │ ├── logo.png │ │ ├── main_page.png │ │ ├── restapi.png │ │ ├── restapi2.png │ │ ├── scaffold_tree.png │ │ ├── simple_counter.png │ │ ├── tags2.png │ │ └── tags_db.png │ │ ├── _static │ │ ├── _sphinx_javascript_frameworks_compat.js │ │ ├── base-stemmer.js │ │ ├── basic.css │ │ ├── css │ │ │ ├── badge_only.css │ │ │ ├── dark.css │ │ │ ├── fonts │ │ │ │ ├── Roboto-Slab-Bold.woff │ │ │ │ ├── Roboto-Slab-Bold.woff2 │ │ │ │ ├── Roboto-Slab-Regular.woff │ │ │ │ ├── Roboto-Slab-Regular.woff2 │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ ├── fontawesome-webfont.svg │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ ├── fontawesome-webfont.woff2 │ │ │ │ ├── lato-bold-italic.woff │ │ │ │ ├── lato-bold-italic.woff2 │ │ │ │ ├── lato-bold.woff │ │ │ │ ├── lato-bold.woff2 │ │ │ │ ├── lato-normal-italic.woff │ │ │ │ ├── lato-normal-italic.woff2 │ │ │ │ ├── lato-normal.woff │ │ │ │ └── lato-normal.woff2 │ │ │ ├── theme.css │ │ │ └── toggle.css │ │ ├── doctools.js │ │ ├── documentation_options.js │ │ ├── file.png │ │ ├── fonts │ │ │ ├── Lato │ │ │ │ ├── lato-bold.eot │ │ │ │ ├── lato-bold.ttf │ │ │ │ ├── lato-bold.woff │ │ │ │ ├── lato-bold.woff2 │ │ │ │ ├── lato-bolditalic.eot │ │ │ │ ├── lato-bolditalic.ttf │ │ │ │ ├── lato-bolditalic.woff │ │ │ │ ├── lato-bolditalic.woff2 │ │ │ │ ├── lato-italic.eot │ │ │ │ ├── lato-italic.ttf │ │ │ │ ├── lato-italic.woff │ │ │ │ ├── lato-italic.woff2 │ │ │ │ ├── lato-regular.eot │ │ │ │ ├── lato-regular.ttf │ │ │ │ ├── lato-regular.woff │ │ │ │ └── lato-regular.woff2 │ │ │ └── RobotoSlab │ │ │ │ ├── roboto-slab-v7-bold.eot │ │ │ │ ├── roboto-slab-v7-bold.ttf │ │ │ │ ├── roboto-slab-v7-bold.woff │ │ │ │ ├── roboto-slab-v7-bold.woff2 │ │ │ │ ├── roboto-slab-v7-regular.eot │ │ │ │ ├── roboto-slab-v7-regular.ttf │ │ │ │ ├── roboto-slab-v7-regular.woff │ │ │ │ └── roboto-slab-v7-regular.woff2 │ │ ├── jquery.js │ │ ├── js │ │ │ ├── badge_only.js │ │ │ ├── theme.js │ │ │ ├── toggle.js │ │ │ └── versions.js │ │ ├── language_data.js │ │ ├── logo-32x32.ico │ │ ├── logo.png │ │ ├── minus.png │ │ ├── plus.png │ │ ├── portuguese-stemmer.js │ │ ├── pygments.css │ │ ├── searchtools.js │ │ ├── sphinx_highlight.js │ │ ├── tabs.css │ │ ├── tabs.js │ │ └── translations.js │ │ ├── chapter-01.html │ │ ├── chapter-02.html │ │ ├── chapter-03.html │ │ ├── chapter-04.html │ │ ├── chapter-05.html │ │ ├── chapter-06.html │ │ ├── chapter-07.html │ │ ├── chapter-08.html │ │ ├── chapter-09.html │ │ ├── chapter-1.html │ │ ├── chapter-10.html │ │ ├── chapter-11.html │ │ ├── chapter-12.html │ │ ├── chapter-13.html │ │ ├── chapter-14.html │ │ ├── chapter-15.html │ │ ├── chapter-16.html │ │ ├── dark.css │ │ ├── genindex.html │ │ ├── index.html │ │ ├── objects.inv │ │ ├── search.html │ │ ├── searchindex.js │ │ └── toggle.css ├── _minimal │ ├── __init__.py │ └── static │ │ ├── README.md │ │ └── favicon.ico ├── _scaffold │ ├── .service │ │ ├── 1562186b6a50f56664060cda865cd1bd_py4web_error.table │ │ ├── service.storage │ │ ├── session.secret │ │ └── sql.log │ ├── __init__.py │ ├── common.py │ ├── controllers.py │ ├── models.py │ ├── scheduler.py │ ├── settings.py │ ├── static │ │ ├── README.md │ │ ├── css │ │ │ └── no.css │ │ ├── favicon.ico │ │ └── js │ │ │ └── utils.js │ ├── tasks.py │ ├── templates │ │ ├── README.md │ │ ├── auth.html │ │ ├── generic.html │ │ ├── index.html │ │ └── layout.html │ └── translations │ │ └── it.json ├── _websocket │ ├── __init__.py │ ├── static │ │ ├── README.md │ │ └── favicon.ico │ └── templates │ │ └── index.html ├── fadebook │ ├── README.md │ ├── __init__.py │ ├── common.py │ ├── controllers.py │ ├── make_up_data.py │ ├── models.py │ ├── settings.py │ ├── static │ │ ├── README.md │ │ ├── css │ │ │ └── no.css │ │ ├── favicon.ico │ │ └── js │ │ │ └── utils.js │ ├── templates │ │ ├── README.md │ │ ├── auth.html │ │ ├── feed.html │ │ ├── friends.html │ │ ├── generic.html │ │ ├── home.html │ │ ├── index.html │ │ ├── layout.html │ │ └── posts.html │ └── translations │ │ └── it.json ├── showcase │ ├── __init__.py │ ├── examples │ │ ├── auth_form.py │ │ ├── auth_forms.py │ │ ├── common.py │ │ ├── component_loader.py │ │ ├── count.py │ │ ├── create_form.py │ │ ├── custom_form.py │ │ ├── example_ajax_grid.py │ │ ├── example_helpers.py │ │ ├── example_html_grid.py │ │ ├── example_multiple_forms.py │ │ ├── flash_example_fixture.py │ │ ├── flash_example_naive.py │ │ ├── hcaptcha_form.py │ │ ├── hello.py │ │ ├── hello_world.py │ │ ├── hello_world_msg.py │ │ ├── models.py │ │ ├── page_with_error.py │ │ ├── page_with_parameters.py │ │ ├── page_with_postback.py │ │ ├── page_with_query.py │ │ ├── page_with_raise.py │ │ ├── page_with_redirect.py │ │ ├── page_with_tailwindcss.py │ │ ├── page_with_template.py │ │ ├── page_without_template.py │ │ ├── rest.py │ │ ├── rpc.py │ │ ├── session_clear.py │ │ ├── session_counter.py │ │ ├── settings.py │ │ ├── show_a_button.py │ │ ├── socketio.py │ │ ├── tagsinput_form.py │ │ ├── test_expose.py │ │ ├── update_form.py │ │ ├── ws.py │ │ └── ws_client_example.py │ ├── static │ │ ├── components-bulma │ │ │ ├── fileupload │ │ │ │ ├── fileupload.css │ │ │ │ ├── fileupload.html │ │ │ │ └── fileupload.js │ │ │ ├── grid │ │ │ │ ├── grid.css │ │ │ │ ├── grid.html │ │ │ │ ├── grid.js │ │ │ │ └── luxon.js │ │ │ ├── mtable.html │ │ │ ├── mtable.js │ │ │ ├── starrater │ │ │ │ ├── starrater.css │ │ │ │ ├── starrater.html │ │ │ │ └── starrater.js │ │ │ └── vueform │ │ │ │ ├── luxon.js │ │ │ │ ├── luxon.min.js │ │ │ │ ├── vueform.css │ │ │ │ ├── vueform.html │ │ │ │ └── vueform.js │ │ ├── components │ │ │ ├── fileupload │ │ │ │ ├── fileupload.css │ │ │ │ ├── fileupload.html │ │ │ │ └── fileupload.js │ │ │ ├── grid │ │ │ │ ├── grid.css │ │ │ │ ├── grid.html │ │ │ │ └── grid.js │ │ │ ├── mtable.html │ │ │ ├── mtable.js │ │ │ ├── starrater │ │ │ │ ├── starrater.css │ │ │ │ ├── starrater.html │ │ │ │ └── starrater.js │ │ │ └── vueform │ │ │ │ ├── luxon.js │ │ │ │ ├── luxon.min.js │ │ │ │ ├── vueform.css │ │ │ │ ├── vueform.html │ │ │ │ └── vueform.js │ │ ├── css │ │ │ ├── no.css │ │ │ └── prism.css │ │ ├── data │ │ │ ├── uscities.json │ │ │ └── zip_codes.json │ │ ├── error.html │ │ ├── favicon.ico │ │ ├── firebase-push.html │ │ ├── hello.txt │ │ ├── js │ │ │ ├── axios.min.js │ │ │ ├── axios.min.map │ │ │ ├── firebase-push.js │ │ │ ├── prism.js │ │ │ ├── star_rater_vue.js │ │ │ ├── sugar.min.js │ │ │ ├── utils.js │ │ │ ├── utils.min.js │ │ │ ├── vue.js │ │ │ └── vue.min.js │ │ ├── socketio │ │ │ └── README.md │ │ └── ws │ │ │ └── README.md │ ├── templates │ │ ├── auth.html │ │ ├── examples │ │ │ ├── ajax_grid.html │ │ │ ├── auth_custom_login.html │ │ │ ├── auth_form.html │ │ │ ├── auth_forms.html │ │ │ ├── component_loader.html │ │ │ ├── custom_form.html │ │ │ ├── flash_example.html │ │ │ ├── flash_example_next.html │ │ │ ├── form.html │ │ │ ├── forms.html │ │ │ ├── generic.html │ │ │ ├── hcaptcha_form.html │ │ │ ├── html_grid.html │ │ │ ├── page_with_tailwindcss.html │ │ │ ├── page_with_template.html │ │ │ ├── rest_info.html │ │ │ ├── session_counter.html │ │ │ └── tagsinput_form.html │ │ ├── index.html │ │ ├── layout.html │ │ ├── layout_bulma.html │ │ ├── layout_tailwind.html │ │ ├── show.html │ │ ├── socketio │ │ │ └── socketio_index.html │ │ ├── vue │ │ │ ├── edit_form.html │ │ │ ├── file_uploader.html │ │ │ ├── insert_form.html │ │ │ ├── star_rater_vue.html │ │ │ ├── star_rater_vue_bulma.html │ │ │ ├── starrating.html │ │ │ ├── view_form.html │ │ │ ├── vue_grid_and_forms.html │ │ │ ├── vuegrid.html │ │ │ └── vuegrid_bulma.html │ │ └── ws │ │ │ └── ws_index.html │ ├── translations │ │ ├── en.json │ │ └── it.json │ ├── uploads │ │ └── README.md │ └── vue_components_examples │ │ ├── common.py │ │ ├── components │ │ ├── README.md │ │ ├── fileupload.py │ │ ├── grid.py │ │ ├── starrater.py │ │ └── vueform.py │ │ ├── databases │ │ ├── fb87181b96a99be45f5a23f4277867ce_auth_user.table │ │ ├── fb87181b96a99be45f5a23f4277867ce_auth_user_tag_groups.table │ │ ├── sql.log │ │ └── storage.db │ │ ├── models.py │ │ ├── settings.py │ │ ├── vue_edit_form.py │ │ ├── vue_file_uploader.py │ │ ├── vue_grid.py │ │ ├── vue_grid_and_forms.py │ │ ├── vue_insert_form.py │ │ ├── vue_star_rater.py │ │ └── vue_view_form.py ├── tagged_posts │ ├── __init__.py │ ├── common.py │ ├── controllers.py │ ├── models.py │ ├── settings.py │ ├── static │ │ ├── README.md │ │ ├── css │ │ │ └── no.css │ │ ├── favicon.ico │ │ └── js │ │ │ ├── index.js │ │ │ └── utils.js │ ├── tasks.py │ ├── templates │ │ ├── README.md │ │ ├── auth.html │ │ ├── generic.html │ │ ├── index.html │ │ └── layout.html │ └── translations │ │ └── it.json └── todo │ ├── __init__.py │ ├── databases │ └── README │ ├── static │ ├── css │ │ └── bulma.css │ ├── favicon.ico │ └── js │ │ ├── sugar.min.js │ │ ├── todo.js │ │ ├── utils.js │ │ └── vue.min.js │ └── templates │ ├── index.html │ └── layout.html ├── deployment_tools ├── docker │ ├── Dockerfile │ ├── Makefile │ ├── README.md │ └── docker-compose.yml ├── gae │ ├── Makefile │ ├── README.md │ ├── app.yaml │ ├── index.yaml │ └── main.py ├── pythonanywhere.com │ └── bottle_app.py └── ubuntu │ └── machine-setup.sh ├── docs ├── README.md ├── _static │ ├── css │ │ ├── dark.css │ │ └── toggle.css │ └── js │ │ └── toggle.js ├── _templates │ ├── layout.html │ └── versions.html ├── chapter-01.rst ├── chapter-02.rst ├── chapter-03.rst ├── chapter-04.rst ├── chapter-05.rst ├── chapter-06.rst ├── chapter-07.rst ├── chapter-08.rst ├── chapter-09.rst ├── chapter-10.rst ├── chapter-11.rst ├── chapter-12.rst ├── chapter-13.rst ├── chapter-14.rst ├── chapter-15.rst ├── chapter-16.rst ├── conf.py ├── images │ ├── _scaffold.png │ ├── command.png │ ├── dashboard.png │ ├── dashboard_edit.png │ ├── dashboard_error.png │ ├── dashboard_i18n_btn.png │ ├── dashboard_i18n_ui.png │ ├── dashboard_login.png │ ├── dashboard_main.png │ ├── dashboard_new_app.png │ ├── dashboard_restapi.png │ ├── dashboard_ticket.png │ ├── example_db.png │ ├── first_run.png │ ├── form1.png │ ├── form2.png │ ├── form5.png │ ├── form6.png │ ├── grid.png │ ├── grid_bulmacss.png │ ├── grid_columns.png │ ├── grid_nocss.png │ ├── icon-gear.png │ ├── icon-lens.png │ ├── icon-start.png │ ├── icon-stop.png │ ├── logo-32x32.ico │ ├── logo.ico │ ├── logo.png │ ├── logo_with_py4web.png │ ├── main_page.png │ ├── restapi.png │ ├── restapi2.png │ ├── scaffold_tree.png │ ├── simple_counter.png │ ├── tags2.png │ └── tags_db.png ├── index.rst ├── locales │ └── pt │ │ └── LC_MESSAGES │ │ ├── chapter-01.mo │ │ ├── chapter-01.po │ │ ├── chapter-02.mo │ │ ├── chapter-02.po │ │ ├── chapter-03.mo │ │ ├── chapter-03.po │ │ ├── chapter-04.mo │ │ ├── chapter-04.po │ │ ├── chapter-05.mo │ │ ├── chapter-05.po │ │ ├── chapter-06.mo │ │ ├── chapter-06.po │ │ ├── chapter-07.mo │ │ ├── chapter-07.po │ │ ├── chapter-08.mo │ │ ├── chapter-08.po │ │ ├── chapter-09.mo │ │ ├── chapter-09.po │ │ ├── chapter-10.mo │ │ ├── chapter-10.po │ │ ├── chapter-11.mo │ │ ├── chapter-11.po │ │ ├── chapter-12.mo │ │ ├── chapter-12.po │ │ ├── chapter-13.mo │ │ ├── chapter-13.po │ │ ├── chapter-14.mo │ │ ├── chapter-14.po │ │ ├── chapter-15.mo │ │ ├── chapter-15.po │ │ ├── index.mo │ │ ├── index.po │ │ ├── sphinx.mo │ │ └── sphinx.po ├── spelling_wordlist_en.txt └── updateDocs.sh ├── py4web.py ├── py4web ├── __init__.py ├── __main__.py ├── core.py ├── gunicorn.rst ├── server_adapters │ ├── __init__.py │ ├── adapter_gevent.py │ ├── adapter_gevent_websockets.py │ ├── adapter_gunicorn_gevent.py │ ├── adapter_rocket3.py │ ├── adapter_wsgiref.py │ └── logging_utils.py └── utils │ ├── __init__.py │ ├── auth.py │ ├── auth_plugins │ ├── __init__.py │ ├── basic_auth_plugin.py │ ├── email_auth_plugin.py │ ├── ldap_plugin.py │ ├── oauth2discord.py │ ├── oauth2facebook.py │ ├── oauth2github.py │ ├── oauth2google.py │ ├── oauth2google_scoped.py │ ├── oauth2okta.py │ ├── oauth2server.py │ ├── oauth2wpminiorange.py │ ├── pam.py │ ├── pam_plugin.py │ ├── saml2_plugin.py │ └── x509_auth_plugin.py │ ├── cors.py │ ├── dbstore.py │ ├── downloader.py │ ├── factories.py │ ├── form.py │ ├── grid.py │ ├── hcaptcha.py │ ├── jsonrpc.py │ ├── mailer.py │ ├── misc.py │ ├── param.py │ ├── populate.py │ ├── publisher.py │ ├── recaptcha.py │ ├── security.py │ ├── tags.py │ ├── url_signer.py │ └── wsservers.py.txt ├── pyproject.toml ├── tests ├── __init__.py ├── templates │ └── index.html ├── test_action.py ├── test_auth.py ├── test_cache.py ├── test_fixture.py ├── test_form.py ├── test_get_error_snapshot.py ├── test_json.py ├── test_main.py ├── test_session.py ├── test_tags.py ├── test_template.py └── test_url.py └── uv.lock /.github/workflows/run_test.yaml: -------------------------------------------------------------------------------- 1 | name: master-test 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | - ombott-dev 8 | pull_request: 9 | branches: 10 | - master 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | strategy: 17 | matrix: 18 | python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] 19 | 20 | env: 21 | UV_PYTHON: ${{ matrix.python-version }} 22 | steps: 23 | - uses: actions/checkout@v4 24 | - name: Install uv 25 | uses: astral-sh/setup-uv@v5 26 | - name: Test 27 | run: make test 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .* 2 | *.py[co] 3 | *~ 4 | \#* 5 | *.1 6 | *.bak 7 | *.bak2 8 | .envrc 9 | *.svn 10 | *.w2p 11 | *.class 12 | *.rej 13 | *.orig 14 | Thumbs.db 15 | .DS_Store 16 | ./deposit 17 | ./benchmark 18 | ./build 19 | ./dist 20 | ./ssl 21 | ./docs 22 | ./logs 23 | ./*.zip 24 | requirements.txt 25 | apps/_documentation/static/*/*.pdf 26 | apps/_documentation/static/*/*.epub 27 | apps*/*/* 28 | !apps/todo/* 29 | !apps/showcase/* 30 | !apps/_dashboard/* 31 | !apps/_scaffold/* 32 | !apps/_minimal/* 33 | !apps/_websocket/* 34 | !apps/_default/* 35 | !apps/_documentation/* 36 | !apps/superheroes/* 37 | !apps/fadebook/* 38 | apps/*/databases/* 39 | apps/*/uploads/* 40 | **/*.py[co] 41 | packages/ 42 | logs/ 43 | password.txt 44 | deployment_tools/gae/lib 45 | deployment_tools/gae/apps 46 | deployment_tools/gae/requirements.txt 47 | py4web/assets 48 | pyproject.toml 49 | poetry.lock 50 | workspace.code-workspace 51 | venv 52 | docs/_build 53 | py4web.egg-info/ 54 | build/ 55 | tmp/ 56 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Python: py4web", 6 | "type": "python", 7 | "request": "launch", 8 | "program": "py4web.py", 9 | "args": [ 10 | "run", "--errorlog=:stdout", "-L", "20", 11 | "apps" 12 | ], 13 | "console": "integratedTerminal", 14 | "justMyCode": true 15 | }, 16 | { 17 | "name": "Python: File", 18 | "type": "python", 19 | "request": "launch", 20 | "program": "${file}", 21 | "justMyCode": true 22 | } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /CONTRIBUTORS.rst: -------------------------------------------------------------------------------- 1 | 2 | The list in CONTRIBUTORS.rst has been moved to the end of the README.rst file 3 | -------------------------------------------------------------------------------- /apps/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/_dashboard/static/css/gitlog.min.css: -------------------------------------------------------------------------------- 1 | .hljs{display:block;overflow-x:auto;padding:.5em;background:#2b2b2b;color:#bababa}.hljs-emphasis,.hljs-strong{color:#a8a8a2}.hljs-bullet,.hljs-link,.hljs-literal,.hljs-number,.hljs-quote,.hljs-regexp{color:#6896ba}.hljs-code,.hljs-selector-class{color:#a6e22e}.hljs-emphasis{font-style:italic}.hljs-attribute,.hljs-keyword,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-variable{color:#cb7832}.hljs-params{color:#b9b9b9}.hljs-string{color:#6a8759}.hljs-addition,.hljs-built_in,.hljs-builtin-name,.hljs-selector-attr,.hljs-selector-id,.hljs-selector-pseudo,.hljs-subst,.hljs-symbol,.hljs-template-tag,.hljs-template-variable,.hljs-type{color:#e0c46c}.hljs-comment,.hljs-deletion,.hljs-meta{color:#7f7f7f} 2 | -------------------------------------------------------------------------------- /apps/_dashboard/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_dashboard/static/favicon.ico -------------------------------------------------------------------------------- /apps/_dashboard/static/images/alert-blue.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_dashboard/static/images/alert-blue.gif -------------------------------------------------------------------------------- /apps/_dashboard/static/images/alert-green.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_dashboard/static/images/alert-green.gif -------------------------------------------------------------------------------- /apps/_dashboard/static/images/alert-orange.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_dashboard/static/images/alert-orange.gif -------------------------------------------------------------------------------- /apps/_dashboard/static/images/alert-red.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_dashboard/static/images/alert-red.gif -------------------------------------------------------------------------------- /apps/_dashboard/static/images/alert-yellow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_dashboard/static/images/alert-yellow.gif -------------------------------------------------------------------------------- /apps/_dashboard/static/images/forkme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_dashboard/static/images/forkme.png -------------------------------------------------------------------------------- /apps/_dashboard/static/images/widget.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_dashboard/static/images/widget.gif -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/ext-error_marker.js: -------------------------------------------------------------------------------- 1 | ; 2 | (function() { 3 | ace.require(["ace/ext/error_marker"], function() {}); 4 | })(); 5 | -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/ext-linking.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/ext/linking",["require","exports","module","ace/editor","ace/config"],function(e,t,n){function i(e){var t=e.editor,n=e.getAccelKey();if(n){var t=e.editor,r=e.getDocumentPosition(),i=t.session,s=i.getTokenAt(r.row,r.column);t._emit("linkHover",{position:r,token:s})}}function s(e){var t=e.getAccelKey(),n=e.getButton();if(n==0&&t){var r=e.editor,i=e.getDocumentPosition(),s=r.session,o=s.getTokenAt(i.row,i.column);r._emit("linkClick",{position:i,token:o})}}var r=e("ace/editor").Editor;e("../config").defineOptions(r.prototype,"editor",{enableLinking:{set:function(e){e?(this.on("click",s),this.on("mousemove",i)):(this.off("click",s),this.off("mousemove",i))},value:!1}})}); 2 | (function() { 3 | ace.require(["ace/ext/linking"], function() {}); 4 | })(); 5 | -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/ext-statusbar.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/ext/statusbar",["require","exports","module","ace/lib/dom","ace/lib/lang"],function(e,t,n){"use strict";var r=e("ace/lib/dom"),i=e("ace/lib/lang"),s=function(e,t){this.element=r.createElement("div"),this.element.className="ace_status-indicator",this.element.style.cssText="display: inline-block;",t.appendChild(this.element);var n=i.delayedCall(function(){this.updateStatus(e)}.bind(this)).schedule.bind(null,100);e.on("changeStatus",n),e.on("changeSelection",n),e.on("keyboardActivity",n)};(function(){this.updateStatus=function(e){function n(e,n){e&&t.push(e,n||"|")}var t=[];n(e.keyBinding.getStatusText(e)),e.commands.recording&&n("REC");var r=e.selection,i=r.lead;if(!r.isEmpty()){var s=e.getSelectionRange();n("("+(s.end.row-s.start.row)+":"+(s.end.column-s.start.column)+")"," ")}n(i.row+":"+i.column," "),r.rangeCount&&n("["+r.rangeCount+"]"," "),t.pop(),this.element.textContent=t.join("")}}).call(s.prototype),t.StatusBar=s}); 2 | (function() { 3 | ace.require(["ace/ext/statusbar"], function() {}); 4 | })(); 5 | -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/mode-gitignore.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/mode/gitignore_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){this.$rules={start:[{token:"comment",regex:/^\s*#.*$/},{token:"keyword",regex:/^\s*!.*$/}]},this.normalizeRules()};s.metaData={fileTypes:["gitignore"],name:"Gitignore"},r.inherits(s,i),t.GitignoreHighlightRules=s}),ace.define("ace/mode/gitignore",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/gitignore_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./gitignore_highlight_rules").GitignoreHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.lineCommentStart="#",this.$id="ace/mode/gitignore"}.call(o.prototype),t.Mode=o}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/mode-lucene.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/mode/lucene_highlight_rules",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("../lib/lang"),s=e("./text_highlight_rules").TextHighlightRules,o=function(){this.$rules={start:[{token:"constant.character.negation",regex:"[\\-]"},{token:"constant.character.interro",regex:"[\\?]"},{token:"constant.character.asterisk",regex:"[\\*]"},{token:"constant.character.proximity",regex:"~[0-9]+\\b"},{token:"keyword.operator",regex:"(?:AND|OR|NOT)\\b"},{token:"paren.lparen",regex:"[\\(]"},{token:"paren.rparen",regex:"[\\)]"},{token:"keyword",regex:"[\\S]+:"},{token:"string",regex:'".*?"'},{token:"text",regex:"\\s+"}]}};r.inherits(o,s),t.LuceneHighlightRules=o}),ace.define("ace/mode/lucene",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/lucene_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./lucene_highlight_rules").LuceneHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.$id="ace/mode/lucene"}.call(o.prototype),t.Mode=o}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/mode-plain_text.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/mode/plain_text",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/text_highlight_rules","ace/mode/behaviour"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./text_highlight_rules").TextHighlightRules,o=e("./behaviour").Behaviour,u=function(){this.HighlightRules=s,this.$behaviour=new o};r.inherits(u,i),function(){this.type="text",this.getNextLineIndent=function(e,t,n){return""},this.$id="ace/mode/plain_text"}.call(u.prototype),t.Mode=u}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/mode-properties.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/mode/properties_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text_highlight_rules").TextHighlightRules,s=function(){var e=/\\u[0-9a-fA-F]{4}|\\/;this.$rules={start:[{token:"comment",regex:/[!#].*$/},{token:"keyword",regex:/[=:]$/},{token:"keyword",regex:/[=:]/,next:"value"},{token:"constant.language.escape",regex:e},{defaultToken:"variable"}],value:[{regex:/\\$/,token:"string",next:"value"},{regex:/$/,token:"string",next:"start"},{token:"constant.language.escape",regex:e},{defaultToken:"string"}]}};r.inherits(s,i),t.PropertiesHighlightRules=s}),ace.define("ace/mode/properties",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/properties_highlight_rules"],function(e,t,n){"use strict";var r=e("../lib/oop"),i=e("./text").Mode,s=e("./properties_highlight_rules").PropertiesHighlightRules,o=function(){this.HighlightRules=s,this.$behaviour=this.$defaultBehaviour};r.inherits(o,i),function(){this.$id="ace/mode/properties"}.call(o.prototype),t.Mode=o}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/mode-text.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_dashboard/static/js/ace/mode-text.js -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/abap.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/abap",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="abap"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/abc.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/abc",["require","exports","module"],function(e,t,n){"use strict";t.snippetText='\nsnippet zupfnoter.print\n %%%%hn.print {"startpos": ${1:pos_y}, "t":"${2:title}", "v":[${3:voices}], "s":[[${4:syncvoices}1,2]], "f":[${5:flowlines}], "sf":[${6:subflowlines}], "j":[${7:jumplines}]}\n\nsnippet zupfnoter.note\n %%%%hn.note {"pos": [${1:pos_x},${2:pos_y}], "text": "${3:text}", "style": "${4:style}"}\n\nsnippet zupfnoter.annotation\n %%%%hn.annotation {"id": "${1:id}", "pos": [${2:pos}], "text": "${3:text}"}\n\nsnippet zupfnoter.lyrics\n %%%%hn.lyrics {"pos": [${1:x_pos},${2:y_pos}]}\n\nsnippet zupfnoter.legend\n %%%%hn.legend {"pos": [${1:x_pos},${2:y_pos}]}\n\n\n\nsnippet zupfnoter.target\n "^:${1:target}"\n\nsnippet zupfnoter.goto\n "^@${1:target}@${2:distance}"\n\nsnippet zupfnoter.annotationref\n "^#${1:target}"\n\nsnippet zupfnoter.annotation\n "^!${1:text}@${2:x_offset},${3:y_offset}"\n\n\n',t.scope="abc"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/ada.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/ada",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="ada"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/apache_conf.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/apache_conf",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="apache_conf"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/applescript.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/applescript",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="applescript"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/asciidoc.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/asciidoc",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="asciidoc"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/assembly_x86.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/assembly_x86",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="assembly_x86"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/autohotkey.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/autohotkey",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="autohotkey"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/batchfile.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/batchfile",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="batchfile"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/bro.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/bro",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope=""}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/c9search.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/c9search",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="c9search"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/cirru.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/cirru",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="cirru"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/cobol.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/cobol",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="cobol"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/coldfusion.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/coldfusion",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="coldfusion"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/csharp.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/csharp",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="csharp"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/curly.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/curly",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="curly"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/d.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/d",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="d"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/diff.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/diff",["require","exports","module"],function(e,t,n){"use strict";t.snippetText='# DEP-3 (http://dep.debian.net/deps/dep3/) style patch header\nsnippet header DEP-3 style header\n Description: ${1}\n Origin: ${2:vendor|upstream|other}, ${3:url of the original patch}\n Bug: ${4:url in upstream bugtracker}\n Forwarded: ${5:no|not-needed|url}\n Author: ${6:`g:snips_author`}\n Reviewed-by: ${7:name and email}\n Last-Update: ${8:`strftime("%Y-%m-%d")`}\n Applied-Upstream: ${9:upstream version|url|commit}\n\n',t.scope="diff"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/dockerfile.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/dockerfile",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="dockerfile"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/dot.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/dot",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="dot"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/drools.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/drools",["require","exports","module"],function(e,t,n){"use strict";t.snippetText='\nsnippet rule\n rule "${1?:rule_name}"\n when\n ${2:// when...} \n then\n ${3:// then...}\n end\n\nsnippet query\n query ${1?:query_name}\n ${2:// find} \n end\n \nsnippet declare\n declare ${1?:type_name}\n ${2:// attributes} \n end\n\n',t.scope="drools"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/eiffel.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/eiffel",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="eiffel"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/ejs.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/ejs",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="ejs"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/elixir.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/elixir",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope=""}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/elm.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/elm",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="elm"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/forth.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/forth",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="forth"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/fortran.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/fortran",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="fortran"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/ftl.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/ftl",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="ftl"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/gcode.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/gcode",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="gcode"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/gherkin.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/gherkin",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="gherkin"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/gitignore.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/gitignore",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="gitignore"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/glsl.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/glsl",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="glsl"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/gobstones.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/gobstones",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="# Procedure\nsnippet proc\n procedure ${1?:name}(${2:argument}) {\n ${3:// body...}\n }\n\n# Function\nsnippet fun\n function ${1?:name}(${2:argument}) {\n return ${3:// body...}\n }\n\n# Repeat\nsnippet rep\n repeat ${1?:times} {\n ${2:// body...}\n }\n\n# For\nsnippet for\n foreach ${1?:e} in ${2?:list} {\n ${3:// body...} \n }\n\n# If\nsnippet if\n if (${1?:condition}) {\n ${3:// body...} \n }\n\n# While\n while (${1?:condition}) {\n ${2:// body...} \n }\n",t.scope="gobstones"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/golang.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/golang",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="golang"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/groovy.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/groovy",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="groovy"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/haml.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/haml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="snippet t\n %table\n %tr\n %th\n ${1:headers}\n %tr\n %td\n ${2:headers}\nsnippet ul\n %ul\n %li\n ${1:item}\n %li\nsnippet =rp\n = render :partial => '${1:partial}'\nsnippet =rpl\n = render :partial => '${1:partial}', :locals => {}\nsnippet =rpc\n = render :partial => '${1:partial}', :collection => @$1\n\n",t.scope="haml"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/handlebars.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/handlebars",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="handlebars"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/haskell_cabal.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/haskell_cabal",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="haskell_cabal"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/haxe.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/haxe",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="haxe"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/hjson.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/hjson",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope=""}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/html_elixir.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/html_elixir",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="html_elixir"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/html_ruby.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/html_ruby",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="html_ruby"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/ini.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/ini",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="ini"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/io.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/io",["require","exports","module"],function(e,t,n){"use strict";t.snippets=[{content:"assertEquals(${1:expected}, ${2:expr})",name:"assertEquals",scope:"io",tabTrigger:"ae"},{content:"${1:${2:newValue} := ${3:Object} }clone do(\n $0\n)",name:"clone do",scope:"io",tabTrigger:"cdo"},{content:'docSlot("${1:slotName}", "${2:documentation}")',name:"docSlot",scope:"io",tabTrigger:"ds"},{content:"(${1:header,}\n ${2:body}\n)$0",keyEquivalent:"@(",name:"Indented Bracketed Line",scope:"io",tabTrigger:"("},{content:"\n $0\n",keyEquivalent:"\r",name:"Special: Return Inside Empty Parenthesis",scope:"io meta.empty-parenthesis.io, io meta.comma-parenthesis.io"},{content:"${1:methodName} := method(${2:args,}\n $0\n)",name:"method",scope:"io",tabTrigger:"m"},{content:'newSlot("${1:slotName}", ${2:defaultValue}, "${3:docString}")$0',name:"newSlot",scope:"io",tabTrigger:"ns"},{content:"${1:name} := Object clone do(\n $0\n)",name:"Object clone do",scope:"io",tabTrigger:"ocdo"},{content:"test${1:SomeFeature} := method(\n $0\n)",name:"testMethod",scope:"io",tabTrigger:"ts"},{content:"${1:Something}Test := ${2:UnitTest} clone do(\n $0\n)",name:"UnitTest",scope:"io",tabTrigger:"ut"}],t.scope="io"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/jack.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/jack",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="jack"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/jade.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/jade",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="jade"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/json.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/json",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="json"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/jsx.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/jsx",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="jsx"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/julia.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/julia",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="julia"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/kotlin.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/kotlin",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope=""}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/latex.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/latex",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="latex"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/lean.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/lean",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="lean"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/less.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/less",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="less"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/liquid.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/liquid",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="liquid"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/lisp.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/lisp",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="lisp"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/live_script.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/live_script",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope=""}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/livescript.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/livescript",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="livescript"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/logiql.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/logiql",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="logiql"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/lua.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/lua",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="snippet #!\n #!/usr/bin/env lua\n $1\nsnippet local\n local ${1:x} = ${2:1}\nsnippet fun\n function ${1:fname}(${2:...})\n ${3:-- body}\n end\nsnippet for\n for ${1:i}=${2:1},${3:10} do\n ${4:print(i)}\n end\nsnippet forp\n for ${1:i},${2:v} in pairs(${3:table_name}) do\n ${4:-- body}\n end\nsnippet fori\n for ${1:i},${2:v} in ipairs(${3:table_name}) do\n ${4:-- body}\n end\n",t.scope="lua"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/luapage.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/luapage",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="luapage"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/lucene.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/lucene",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="lucene"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/makefile.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/makefile",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="snippet ifeq\n ifeq (${1:cond0},${2:cond1})\n ${3:code}\n endif\n",t.scope="makefile"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/mask.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/mask",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="mask"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/matlab.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/matlab",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="matlab"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/maze.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/maze",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="snippet >\ndescription assignment\nscope maze\n -> ${1}= ${2}\n\nsnippet >\ndescription if\nscope maze\n -> IF ${2:**} THEN %${3:L} ELSE %${4:R}\n",t.scope="maze"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/mel.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/mel",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="mel"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/mips_assembler.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/mips_assembler",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="mips_assembler"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/mipsassembler.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/mipsassembler",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope=""}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/mushcode.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/mushcode",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="mushcode"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/mysql.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/mysql",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="mysql"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/nix.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/nix",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="nix"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/nsis.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/nsis",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope=""}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/objectivec.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/objectivec",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="objectivec"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/ocaml.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/ocaml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="ocaml"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/pascal.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/pascal",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="pascal"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/pgsql.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/pgsql",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="pgsql"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/plain_text.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/plain_text",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="plain_text"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/powershell.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/powershell",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="powershell"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/praat.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/praat",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="praat"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/prolog.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/prolog",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="prolog"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/properties.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/properties",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="properties"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/protobuf.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/protobuf",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="",t.scope="protobuf"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/razor.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/razor",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="snippet if\n(${1} == ${2}) {\n ${3}\n}",t.scope="razor"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/rdoc.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/rdoc",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="rdoc"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/rhtml.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/rhtml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="rhtml"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/rst.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/rst",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="# rst\n\nsnippet :\n :${1:field name}: ${2:field body}\nsnippet *\n *${1:Emphasis}*\nsnippet **\n **${1:Strong emphasis}**\nsnippet _\n \\`${1:hyperlink-name}\\`_\n .. _\\`$1\\`: ${2:link-block}\nsnippet =\n ${1:Title}\n =====${2:=}\n ${3}\nsnippet -\n ${1:Title}\n -----${2:-}\n ${3}\nsnippet cont:\n .. contents::\n \n",t.scope="rst"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/rust.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/rust",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="rust"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/sass.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/sass",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="sass"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/scad.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/scad",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="scad"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/scala.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/scala",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="scala"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/scheme.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/scheme",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="scheme"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/scss.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/scss",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="scss"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/sjs.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/sjs",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="sjs"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/smarty.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/smarty",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="smarty"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/snippets.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/snippets",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="# snippets for making snippets :)\nsnippet snip\n snippet ${1:trigger}\n ${2}\nsnippet msnip\n snippet ${1:trigger} ${2:description}\n ${3}\nsnippet v\n {VISUAL}\n",t.scope="snippets"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/soy_template.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/soy_template",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="soy_template"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/space.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/space",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="space"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/sql.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/sql",["require","exports","module"],function(e,t,n){"use strict";t.snippetText="snippet tbl\n create table ${1:table} (\n ${2:columns}\n );\nsnippet col\n ${1:name} ${2:type} ${3:default ''} ${4:not null}\nsnippet ccol\n ${1:name} varchar2(${2:size}) ${3:default ''} ${4:not null}\nsnippet ncol\n ${1:name} number ${3:default 0} ${4:not null}\nsnippet dcol\n ${1:name} date ${3:default sysdate} ${4:not null}\nsnippet ind\n create index ${3:$1_$2} on ${1:table}(${2:column});\nsnippet uind\n create unique index ${1:name} on ${2:table}(${3:column});\nsnippet tblcom\n comment on table ${1:table} is '${2:comment}';\nsnippet colcom\n comment on column ${1:table}.${2:column} is '${3:comment}';\nsnippet addcol\n alter table ${1:table} add (${2:column} ${3:type});\nsnippet seq\n create sequence ${1:name} start with ${2:1} increment by ${3:1} minvalue ${4:1};\nsnippet s*\n select * from ${1:table}\n",t.scope="sql"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/stylus.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/stylus",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="stylus"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/svg.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/svg",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="svg"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/swift.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/swift",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="swift"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/swig.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/swig",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="swig"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/text.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/text",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="text"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/textile.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/textile",["require","exports","module"],function(e,t,n){"use strict";t.snippetText='# Jekyll post header\nsnippet header\n ---\n title: ${1:title}\n layout: post\n date: ${2:date} ${3:hour:minute:second} -05:00\n ---\n\n# Image\nsnippet img\n !${1:url}(${2:title}):${3:link}!\n\n# Table\nsnippet |\n |${1}|${2}\n\n# Link\nsnippet link\n "${1:link text}":${2:url}\n\n# Acronym\nsnippet (\n (${1:Expand acronym})${2}\n\n# Footnote\nsnippet fn\n [${1:ref number}] ${3}\n\n fn$1. ${2:footnote}\n \n',t.scope="textile"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/toml.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/toml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="toml"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/tsx.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/tsx",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="tsx"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/twig.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/twig",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="twig"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/typescript.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/typescript",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="typescript"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/vbscript.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/vbscript",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="vbscript"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/velocity.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/velocity",["require","exports","module"],function(e,t,n){"use strict";t.snippetText='# macro\nsnippet #macro\n #macro ( ${1:macroName} ${2:\\$var1, [\\$var2, ...]} )\n ${3:## macro code}\n #end\n# foreach\nsnippet #foreach\n #foreach ( ${1:\\$item} in ${2:\\$collection} )\n ${3:## foreach code}\n #end\n# if\nsnippet #if\n #if ( ${1:true} )\n ${0}\n #end\n# if ... else\nsnippet #ife\n #if ( ${1:true} )\n ${2}\n #else\n ${0}\n #end\n#import\nsnippet #import\n #import ( "${1:path/to/velocity/format}" )\n# set\nsnippet #set\n #set ( $${1:var} = ${0} )\n',t.scope="velocity",t.includeScopes=["html","javascript","css"]}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/verilog.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/verilog",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="verilog"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/vhdl.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/vhdl",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="vhdl"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/xml.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/xml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="xml"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/ace/snippets/yaml.js: -------------------------------------------------------------------------------- 1 | ace.define("ace/snippets/yaml",["require","exports","module"],function(e,t,n){"use strict";t.snippetText=undefined,t.scope="yaml"}) -------------------------------------------------------------------------------- /apps/_dashboard/static/js/dbadmin.js: -------------------------------------------------------------------------------- 1 | var app = {data: {}, methods:{}}; 2 | app.params = new URLSearchParams(window.location.search); 3 | app.data.loading = 0; 4 | app.data.app = app.params.get('app'); 5 | app.data.dbname = app.params.get('dbname'); 6 | app.data.tablename = app.params.get('tablename'); 7 | app.data.url = '../rest/{app}/{dbname}/{tablename}'.format(app.data); 8 | app.data.filter = app.params.get('filter') || ''; 9 | app.data.order = app.params.get('order') || ''; 10 | app.vue = new Vue({el:"#vue", data: app.data, methods: app.methods}); 11 | -------------------------------------------------------------------------------- /apps/_dashboard/templates/dbadmin.html: -------------------------------------------------------------------------------- 1 | [[extend "layout.html"]] 2 |

Table "[[=table_name]]"

3 | [[=grid]] 4 | -------------------------------------------------------------------------------- /apps/_dashboard/translations/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/_default/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from py4web import Cache, action 4 | 5 | cache = Cache(size=1000) 6 | 7 | 8 | @action("index") 9 | @cache.memoize(expiration=1) 10 | def index(): 11 | filename = os.path.join(os.path.dirname(__file__), "static", "index.html") 12 | with open(filename) as stream: 13 | return stream.read() 14 | -------------------------------------------------------------------------------- /apps/_default/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_default/static/favicon.ico -------------------------------------------------------------------------------- /apps/_default/static/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_default/static/images/logo.png -------------------------------------------------------------------------------- /apps/_documentation/__init__.py: -------------------------------------------------------------------------------- 1 | from py4web import URL, action, redirect 2 | 3 | 4 | @action("index") 5 | def index(): 6 | redirect(URL("static/index.html")) 7 | -------------------------------------------------------------------------------- /apps/_documentation/static/en/.buildinfo: -------------------------------------------------------------------------------- 1 | # Sphinx build info version 1 2 | # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. 3 | config: d7b3a18a915a2ff0bc4b8a132ca0d27a 4 | tags: 645f666f9bcd5a90fca523b33c5a78b7 5 | -------------------------------------------------------------------------------- /apps/_documentation/static/en/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/.nojekyll -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/_scaffold.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/_scaffold.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/command.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/command.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/dashboard.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/dashboard_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/dashboard_edit.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/dashboard_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/dashboard_error.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/dashboard_i18n_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/dashboard_i18n_btn.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/dashboard_i18n_ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/dashboard_i18n_ui.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/dashboard_login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/dashboard_login.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/dashboard_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/dashboard_main.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/dashboard_new_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/dashboard_new_app.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/dashboard_restapi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/dashboard_restapi.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/dashboard_ticket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/dashboard_ticket.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/example_db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/example_db.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/first_run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/first_run.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/form1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/form1.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/form2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/form2.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/grid.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/grid_bulmacss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/grid_bulmacss.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/grid_columns.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/grid_columns.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/grid_nocss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/grid_nocss.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/logo.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/main_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/main_page.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/restapi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/restapi.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/restapi2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/restapi2.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/scaffold_tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/scaffold_tree.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/simple_counter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/simple_counter.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/tags2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/tags2.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_images/tags_db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_images/tags_db.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/css/fonts/Roboto-Slab-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/css/fonts/Roboto-Slab-Bold.woff -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/css/fonts/Roboto-Slab-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/css/fonts/Roboto-Slab-Bold.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/css/fonts/Roboto-Slab-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/css/fonts/Roboto-Slab-Regular.woff -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/css/fonts/Roboto-Slab-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/css/fonts/Roboto-Slab-Regular.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/css/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/css/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/css/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/css/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/css/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/css/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/css/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/css/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/css/fonts/lato-bold-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/css/fonts/lato-bold-italic.woff -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/css/fonts/lato-bold-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/css/fonts/lato-bold-italic.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/css/fonts/lato-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/css/fonts/lato-bold.woff -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/css/fonts/lato-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/css/fonts/lato-bold.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/css/fonts/lato-normal-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/css/fonts/lato-normal-italic.woff -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/css/fonts/lato-normal-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/css/fonts/lato-normal-italic.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/css/fonts/lato-normal.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/css/fonts/lato-normal.woff -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/css/fonts/lato-normal.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/css/fonts/lato-normal.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/documentation_options.js: -------------------------------------------------------------------------------- 1 | const DOCUMENTATION_OPTIONS = { 2 | VERSION: '20250524', 3 | LANGUAGE: 'en', 4 | COLLAPSE_INDEX: false, 5 | BUILDER: 'html', 6 | FILE_SUFFIX: '.html', 7 | LINK_SUFFIX: '.html', 8 | HAS_SOURCE: true, 9 | SOURCELINK_SUFFIX: '.txt', 10 | NAVIGATION_WITH_KEYS: false, 11 | SHOW_SEARCH_SUMMARY: true, 12 | ENABLE_SEARCH_SHORTCUTS: true, 13 | }; -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/file.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/Lato/lato-bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/Lato/lato-bold.eot -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/Lato/lato-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/Lato/lato-bold.ttf -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/Lato/lato-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/Lato/lato-bold.woff -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/Lato/lato-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/Lato/lato-bold.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/Lato/lato-bolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/Lato/lato-bolditalic.eot -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/Lato/lato-bolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/Lato/lato-bolditalic.ttf -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/Lato/lato-bolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/Lato/lato-bolditalic.woff -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/Lato/lato-bolditalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/Lato/lato-bolditalic.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/Lato/lato-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/Lato/lato-italic.eot -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/Lato/lato-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/Lato/lato-italic.ttf -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/Lato/lato-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/Lato/lato-italic.woff -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/Lato/lato-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/Lato/lato-italic.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/Lato/lato-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/Lato/lato-regular.eot -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/Lato/lato-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/Lato/lato-regular.ttf -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/Lato/lato-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/Lato/lato-regular.woff -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/Lato/lato-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/Lato/lato-regular.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/js/badge_only.js: -------------------------------------------------------------------------------- 1 | !function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}}); -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/logo-32x32.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/logo-32x32.ico -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/logo.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/minus.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/_static/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/_static/plus.png -------------------------------------------------------------------------------- /apps/_documentation/static/en/objects.inv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/en/objects.inv -------------------------------------------------------------------------------- /apps/_documentation/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/favicon.ico -------------------------------------------------------------------------------- /apps/_documentation/static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | py4web Docs 5 | 6 | 7 | 8 |

Please wait while you're redirected to our documentation.

9 | 10 | 11 | -------------------------------------------------------------------------------- /apps/_documentation/static/pt/.buildinfo: -------------------------------------------------------------------------------- 1 | # Sphinx build info version 1 2 | # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. 3 | config: ed599b49844fecc660bf9dc09b52028b 4 | tags: 645f666f9bcd5a90fca523b33c5a78b7 5 | -------------------------------------------------------------------------------- /apps/_documentation/static/pt/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/.nojekyll -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/_scaffold.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/_scaffold.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/command.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/command.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/dashboard.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/dashboard_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/dashboard_edit.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/dashboard_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/dashboard_error.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/dashboard_i18n_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/dashboard_i18n_btn.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/dashboard_i18n_ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/dashboard_i18n_ui.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/dashboard_login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/dashboard_login.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/dashboard_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/dashboard_main.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/dashboard_new_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/dashboard_new_app.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/dashboard_restapi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/dashboard_restapi.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/dashboard_ticket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/dashboard_ticket.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/example_db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/example_db.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/first_run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/first_run.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/form1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/form1.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/form2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/form2.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/grid.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/grid_bulmacss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/grid_bulmacss.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/grid_columns.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/grid_columns.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/grid_nocss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/grid_nocss.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/logo.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/main_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/main_page.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/restapi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/restapi.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/restapi2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/restapi2.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/scaffold_tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/scaffold_tree.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/simple_counter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/simple_counter.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/tags2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/tags2.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_images/tags_db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_images/tags_db.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/css/fonts/Roboto-Slab-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/css/fonts/Roboto-Slab-Bold.woff -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/css/fonts/Roboto-Slab-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/css/fonts/Roboto-Slab-Bold.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/css/fonts/Roboto-Slab-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/css/fonts/Roboto-Slab-Regular.woff -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/css/fonts/Roboto-Slab-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/css/fonts/Roboto-Slab-Regular.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/css/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/css/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/css/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/css/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/css/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/css/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/css/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/css/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/css/fonts/lato-bold-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/css/fonts/lato-bold-italic.woff -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/css/fonts/lato-bold-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/css/fonts/lato-bold-italic.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/css/fonts/lato-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/css/fonts/lato-bold.woff -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/css/fonts/lato-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/css/fonts/lato-bold.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/css/fonts/lato-normal-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/css/fonts/lato-normal-italic.woff -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/css/fonts/lato-normal-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/css/fonts/lato-normal-italic.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/css/fonts/lato-normal.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/css/fonts/lato-normal.woff -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/css/fonts/lato-normal.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/css/fonts/lato-normal.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/documentation_options.js: -------------------------------------------------------------------------------- 1 | const DOCUMENTATION_OPTIONS = { 2 | VERSION: '20250524', 3 | LANGUAGE: 'pt', 4 | COLLAPSE_INDEX: false, 5 | BUILDER: 'html', 6 | FILE_SUFFIX: '.html', 7 | LINK_SUFFIX: '.html', 8 | HAS_SOURCE: true, 9 | SOURCELINK_SUFFIX: '.txt', 10 | NAVIGATION_WITH_KEYS: false, 11 | SHOW_SEARCH_SUMMARY: true, 12 | ENABLE_SEARCH_SHORTCUTS: true, 13 | }; -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/file.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/Lato/lato-bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/Lato/lato-bold.eot -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/Lato/lato-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/Lato/lato-bold.ttf -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/Lato/lato-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/Lato/lato-bold.woff -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/Lato/lato-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/Lato/lato-bold.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/Lato/lato-bolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/Lato/lato-bolditalic.eot -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/Lato/lato-bolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/Lato/lato-bolditalic.ttf -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/Lato/lato-bolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/Lato/lato-bolditalic.woff -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/Lato/lato-bolditalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/Lato/lato-bolditalic.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/Lato/lato-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/Lato/lato-italic.eot -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/Lato/lato-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/Lato/lato-italic.ttf -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/Lato/lato-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/Lato/lato-italic.woff -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/Lato/lato-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/Lato/lato-italic.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/Lato/lato-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/Lato/lato-regular.eot -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/Lato/lato-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/Lato/lato-regular.ttf -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/Lato/lato-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/Lato/lato-regular.woff -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/Lato/lato-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/Lato/lato-regular.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/js/badge_only.js: -------------------------------------------------------------------------------- 1 | !function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}}); -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/logo-32x32.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/logo-32x32.ico -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/logo.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/minus.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/_static/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/_static/plus.png -------------------------------------------------------------------------------- /apps/_documentation/static/pt/objects.inv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_documentation/static/pt/objects.inv -------------------------------------------------------------------------------- /apps/_minimal/__init__.py: -------------------------------------------------------------------------------- 1 | from py4web import action 2 | 3 | 4 | @action("index") 5 | def index(): 6 | return "Hello World" 7 | -------------------------------------------------------------------------------- /apps/_minimal/static/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/_minimal/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_minimal/static/favicon.ico -------------------------------------------------------------------------------- /apps/_scaffold/.service/1562186b6a50f56664060cda865cd1bd_py4web_error.table: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_scaffold/.service/1562186b6a50f56664060cda865cd1bd_py4web_error.table -------------------------------------------------------------------------------- /apps/_scaffold/.service/service.storage: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_scaffold/.service/service.storage -------------------------------------------------------------------------------- /apps/_scaffold/.service/session.secret: -------------------------------------------------------------------------------- 1 | 146b2e47-dd13-4d3e-b21e-d04054c11ad4 -------------------------------------------------------------------------------- /apps/_scaffold/.service/sql.log: -------------------------------------------------------------------------------- 1 | timestamp: 2023-12-06T22:04:22.317786 2 | CREATE TABLE "py4web_error"( 3 | "id" INTEGER PRIMARY KEY AUTOINCREMENT, 4 | "uuid" CHAR(512), 5 | "app_name" CHAR(512), 6 | "method" CHAR(512), 7 | "path" CHAR(512), 8 | "timestamp" TIMESTAMP, 9 | "client_ip" CHAR(512), 10 | "error" CHAR(512), 11 | "snapshot" TEXT 12 | ); 13 | success! 14 | -------------------------------------------------------------------------------- /apps/_scaffold/__init__.py: -------------------------------------------------------------------------------- 1 | # check compatibility 2 | import py4web 3 | 4 | assert py4web.check_compatible("1.20190709.1") 5 | 6 | # by importing controllers you expose the actions defined in it 7 | from . import controllers 8 | 9 | # by importing db you expose it to the _dashboard/dbadmin 10 | from .models import db 11 | 12 | # import the scheduler 13 | from .tasks import scheduler 14 | 15 | # optional parameters 16 | __version__ = "0.0.0" 17 | __author__ = "you " 18 | __license__ = "anything you want" 19 | -------------------------------------------------------------------------------- /apps/_scaffold/models.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file defines the database models 3 | """ 4 | 5 | from pydal.validators import * 6 | 7 | from .common import Field, db 8 | 9 | ### Define your table below 10 | # 11 | # db.define_table('thing', Field('name')) 12 | # 13 | ## always commit your models to avoid problems later 14 | # 15 | # db.commit() 16 | # 17 | -------------------------------------------------------------------------------- /apps/_scaffold/scheduler.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_scaffold/scheduler.py -------------------------------------------------------------------------------- /apps/_scaffold/static/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/_scaffold/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_scaffold/static/favicon.ico -------------------------------------------------------------------------------- /apps/_scaffold/templates/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/_scaffold/templates/auth.html: -------------------------------------------------------------------------------- 1 | [[extend "layout.html"]] 2 | 13 |
14 | [[=form]] 15 |
16 | -------------------------------------------------------------------------------- /apps/_scaffold/templates/generic.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 | 8 | 9 |
10 |
11 | [[=BEAUTIFY(__vars__)]] 12 |
13 |
14 | -------------------------------------------------------------------------------- /apps/_scaffold/templates/index.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 |
4 |
5 | [[=message]] 6 |
7 |
-------------------------------------------------------------------------------- /apps/_scaffold/translations/it.json: -------------------------------------------------------------------------------- 1 | {"Hello World from {name}": {"0": "Salve Mondo da {name}"}, "thing": {"0": "cosa", "1": "cose"}} 2 | -------------------------------------------------------------------------------- /apps/_websocket/__init__.py: -------------------------------------------------------------------------------- 1 | from py4web import action, request 2 | 3 | 4 | @action("index") 5 | @action.uses("index.html") 6 | def index(): 7 | return dict() 8 | 9 | 10 | @action("websocket") 11 | def echo(): 12 | ws = request.environ.get("wsgi.websocket") 13 | while True: 14 | msg = ws.receive() 15 | if msg is not None: 16 | ws.send(msg) 17 | else: 18 | break 19 | -------------------------------------------------------------------------------- /apps/_websocket/static/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/_websocket/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/_websocket/static/favicon.ico -------------------------------------------------------------------------------- /apps/fadebook/README.md: -------------------------------------------------------------------------------- 1 | # _scaffold 2 | 3 | to be used as model for other apps 4 | provides example of usage of: 5 | 6 | - yatl (Yet Another Template Language) 7 | - DAL (db) 8 | - Session (cookies, redis, memcache, and in db) 9 | - Translator (the T(text) wrapper) 10 | -------------------------------------------------------------------------------- /apps/fadebook/__init__.py: -------------------------------------------------------------------------------- 1 | # check compatibility 2 | import py4web 3 | 4 | assert py4web.check_compatible("1.20250328.1") 5 | 6 | # by importing controllers you expose the actions defined in it 7 | from . import controllers 8 | 9 | # by importing db you expose it to the _dashboard/dbadmin 10 | from .models import db 11 | 12 | # optional parameters 13 | __version__ = "0.0.0" 14 | __author__ = "you " 15 | __license__ = "anything you want" 16 | -------------------------------------------------------------------------------- /apps/fadebook/make_up_data.py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | 4 | def make(): 5 | # prevent circular imports 6 | from py4web.utils.populate import populate 7 | 8 | from .common import action, db 9 | 10 | if db(db.auth_user).count() == 1: 11 | populate(db.auth_user, 10, contents={"is_active": True}) 12 | populate(db.feed_item, 100, contents={"is_active": True}) 13 | # populate(db.item_like, 1000, contents={"is_active": True}) 14 | ids = [r.id for r in db(db.auth_user).select() if r.id > 1] 15 | for k in ids[:3]: 16 | db.friend_request.insert(to_user=1, from_user=k, status="accepted") 17 | db.friend_request.insert(to_user=k, from_user=1, status="accepted") 18 | for k in ids[3:6]: 19 | db.friend_request.insert(to_user=1, from_user=k, status="pending") 20 | for k in ids[6:9]: 21 | db.friend_request.insert(to_user=1, from_user=k, status="rejected") 22 | -------------------------------------------------------------------------------- /apps/fadebook/models.py: -------------------------------------------------------------------------------- 1 | from pydal.validators import IS_NOT_EMPTY 2 | 3 | from .common import * 4 | 5 | db.define_table( 6 | "feed_item", Field("body", "text", requires=IS_NOT_EMPTY()), auth.signature 7 | ) 8 | 9 | db.define_table("item_like", Field("item_id", "reference feed_item"), auth.signature) 10 | 11 | db.define_table( 12 | "friend_request", 13 | Field("from_user", "reference auth_user"), 14 | Field("to_user", "reference auth_user"), 15 | Field("status", options=("accepted", "pending", "rejected")), 16 | ) 17 | 18 | db.commit() 19 | -------------------------------------------------------------------------------- /apps/fadebook/static/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/fadebook/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/fadebook/static/favicon.ico -------------------------------------------------------------------------------- /apps/fadebook/templates/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/fadebook/templates/auth.html: -------------------------------------------------------------------------------- 1 | [[extend "layout.html"]] 2 | 13 |
14 | [[=form]] 15 |
16 | -------------------------------------------------------------------------------- /apps/fadebook/templates/feed.html: -------------------------------------------------------------------------------- 1 | [[extend "layout.html"]] 2 | 3 |

My Feed

4 | 5 | [[=form]] 6 | 7 | [[include "posts.html"]] 8 | -------------------------------------------------------------------------------- /apps/fadebook/templates/generic.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 | 8 | 9 |
10 | [[=BEAUTIFY(__vars__)]] 11 |
12 | -------------------------------------------------------------------------------- /apps/fadebook/templates/home.html: -------------------------------------------------------------------------------- 1 | [[extend "layout.html"]] 2 | 3 |

Posts by user [[= user['username'] ]]

4 | 5 | [[include "posts.html"]] 6 | -------------------------------------------------------------------------------- /apps/fadebook/templates/index.html: -------------------------------------------------------------------------------- 1 | [[extend "layout.html"]] 2 | 3 |
4 |

Welcome to FadeBook

5 | Click to Login 6 |
7 | -------------------------------------------------------------------------------- /apps/fadebook/templates/posts.html: -------------------------------------------------------------------------------- 1 | [[for item in items:]] 2 |
3 | 4 | [[=item.created_by.first_name]] 5 | [[=item.created_by.last_name]] 6 | 7 | on [[=item.created_on]] says 8 |
[[=item.body]]
9 | 10 |
11 | [[pass]] 12 | 13 | 21 | -------------------------------------------------------------------------------- /apps/fadebook/translations/it.json: -------------------------------------------------------------------------------- 1 | {"Hello World from {name}": {"0": "Salve Mondo da {name}"}, "thing": {"0": "cosa", "1": "cose"}} 2 | -------------------------------------------------------------------------------- /apps/showcase/examples/auth_form.py: -------------------------------------------------------------------------------- 1 | from py4web import action 2 | 3 | from .common import T, auth, db, session 4 | 5 | 6 | @action("auth_form/", method=["GET", "POST"]) 7 | @action.uses("examples/auth_form.html", db, session, T, auth) 8 | def auth_form(name): 9 | form = auth.form(name) 10 | if form.submitted: 11 | pass 12 | elif form.accepted: 13 | pass 14 | elif form.errors: 15 | pass 16 | return dict(form=auth.form(name)) 17 | -------------------------------------------------------------------------------- /apps/showcase/examples/auth_forms.py: -------------------------------------------------------------------------------- 1 | from py4web import action 2 | 3 | from .common import T, auth, db, session 4 | 5 | 6 | @action("auth_forms", method=["GET", "POST"]) 7 | @action.uses("examples/auth_forms.html", db, session, T, auth) 8 | def auth_forms(): 9 | disabled = False 10 | # this is experimntal, we must disable forms that require a logged in user 11 | if not auth.is_logged_in: 12 | disabled = "disabled" 13 | return dict( 14 | register_form=auth.form("register"), 15 | login_form=auth.form("login"), 16 | reset_password_form=auth.form("reset_password"), 17 | change_password_form=disabled or auth.form("change_password"), 18 | profile_form=disabled or auth.form("profile"), 19 | ) 20 | -------------------------------------------------------------------------------- /apps/showcase/examples/component_loader.py: -------------------------------------------------------------------------------- 1 | from yatl.helpers import DIV 2 | 3 | from py4web import Field, action, request 4 | from py4web.utils.form import Form 5 | 6 | from .common import flash 7 | 8 | 9 | @action("mycomponent.load", method=["GET", "POST"]) 10 | @action.uses(flash) 11 | def mycomponent(): 12 | # create a form object 13 | form = Form([Field("your_name")]) 14 | # if the form is not submmitted show a welcome flash message 15 | if not request.forms: 16 | flash.set("Welcome") 17 | # if the form is submitted and accepted display another message 18 | elif form.accepted: 19 | flash.set("Welcome " + request.forms["your_name"]) 20 | # return the form if it has not already been submitted and accepted 21 | return DIV(form if not form.accepted else "done!").xml() 22 | 23 | 24 | # a page that loads the above compnent via ajax 25 | @action("component_loader") 26 | @action.uses("examples/component_loader.html", flash) 27 | def component_loader(): 28 | return dict() 29 | -------------------------------------------------------------------------------- /apps/showcase/examples/count.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from yatl.helpers import BODY, H1, HTML, A 4 | 5 | from py4web import URL, action 6 | 7 | from .common import T 8 | 9 | 10 | @action("count") 11 | @action("count/") 12 | @action.uses(T) 13 | def count(number=1): 14 | message = T("Cat").format(n=number) 15 | link = A(T("more"), _href=URL("count/%s" % (number + 1))) 16 | return HTML(BODY(H1(message, " ", link))).xml() 17 | -------------------------------------------------------------------------------- /apps/showcase/examples/create_form.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from py4web import action 4 | from py4web.utils.form import Form, FormStyleDefault 5 | 6 | from .common import T, session 7 | from .models import db 8 | 9 | 10 | # exposed as /examples/create_form or /examples/update_form/ 11 | @action("create_form", method=["GET", "POST"]) 12 | @action.uses("examples/form.html", db, session, T) 13 | def create_form(): 14 | form = Form(db.person, formstyle=FormStyleDefault) 15 | rows = db(db.person).select() 16 | return dict(form=form, rows=rows) 17 | -------------------------------------------------------------------------------- /apps/showcase/examples/custom_form.py: -------------------------------------------------------------------------------- 1 | from py4web import action 2 | from py4web.utils.form import Form, FormStyleDefault 3 | 4 | from .common import T, db, session 5 | 6 | 7 | @action("custom_form", method=["GET", "POST"]) 8 | @action.uses("examples/custom_form.html", db, session, T) 9 | def custom_form(id=None): 10 | form = Form(db.person, id, deletable=False, formstyle=FormStyleDefault) 11 | rows = db(db.person).select() 12 | return dict(form=form, rows=rows) 13 | -------------------------------------------------------------------------------- /apps/showcase/examples/example_ajax_grid.py: -------------------------------------------------------------------------------- 1 | from py4web import action 2 | from py4web.utils.publisher import ALLOW_ALL_POLICY, Publisher 3 | 4 | from .common import db 5 | 6 | # exposes services necessary to access the db.thing via ajax 7 | publisher = Publisher(db, policy=ALLOW_ALL_POLICY) 8 | 9 | 10 | @action("example_ajax_grid") 11 | @action.uses("examples/ajax_grid.html") 12 | def example_ajax_grid(): 13 | return dict(grid=publisher.grid(db.person)) 14 | -------------------------------------------------------------------------------- /apps/showcase/examples/example_helpers.py: -------------------------------------------------------------------------------- 1 | from yatl.helpers import H1, INPUT 2 | 3 | from py4web import action 4 | 5 | 6 | @action("example_helpers") 7 | @action.uses("examples/generic.html") 8 | def example_helpers(): 9 | return dict(a=H1("I am a title"), b=2, c=dict(d=3, e=4, x=INPUT(_name="test"))) 10 | -------------------------------------------------------------------------------- /apps/showcase/examples/flash_example_fixture.py: -------------------------------------------------------------------------------- 1 | from py4web import action, redirect 2 | 3 | from .common import flash, session 4 | 5 | 6 | @action("flash_example_fixture") 7 | @action.uses(flash) 8 | def flash_example_fixture(): 9 | flash.set("you have been redirected ", sanitize=True) 10 | redirect("flash_next") 11 | 12 | 13 | @action("flash_next") 14 | @action.uses("examples/flash_example_next.html", flash) 15 | def flash_example_next(): 16 | return dict() 17 | -------------------------------------------------------------------------------- /apps/showcase/examples/flash_example_naive.py: -------------------------------------------------------------------------------- 1 | from py4web import action 2 | 3 | from .common import flash, session 4 | 5 | 6 | @action("flash_example_naive") 7 | @action.uses("examples/flash_example.html") 8 | def flash_example_naive(): 9 | return dict(flash={"message": "hello", "class": "error"}) 10 | -------------------------------------------------------------------------------- /apps/showcase/examples/hello.py: -------------------------------------------------------------------------------- 1 | from py4web import action 2 | 3 | from .common import T 4 | 5 | 6 | @action("hello") 7 | @action.uses(T) 8 | def hello(): 9 | return str(T("Hello World")) 10 | -------------------------------------------------------------------------------- /apps/showcase/examples/hello_world.py: -------------------------------------------------------------------------------- 1 | from .common import unauthenticated 2 | 3 | 4 | @unauthenticated.get() # exposed as /hello_world 5 | def hello_world(): 6 | return dict() 7 | -------------------------------------------------------------------------------- /apps/showcase/examples/hello_world_msg.py: -------------------------------------------------------------------------------- 1 | from .common import unauthenticated 2 | 3 | 4 | @unauthenticated.get() # exposed as /hello_world/ 5 | def hello_world_msg(msg): 6 | return dict(msg=msg) 7 | -------------------------------------------------------------------------------- /apps/showcase/examples/page_with_error.py: -------------------------------------------------------------------------------- 1 | from py4web import action 2 | 3 | 4 | @action("page_with_error") 5 | def page_with_error(): 6 | 1 / 0 7 | -------------------------------------------------------------------------------- /apps/showcase/examples/page_with_parameters.py: -------------------------------------------------------------------------------- 1 | from py4web import URL, action, redirect 2 | 3 | 4 | @action("page_with_parameters") 5 | def page_with_parameters(): 6 | return redirect(URL("page_with_parameters/a/b/c")) 7 | 8 | 9 | @action("page_with_parameters///") 10 | def page_with_parameters(x, y, z): 11 | return repr({"x": x, "y": y, "z": z}) 12 | -------------------------------------------------------------------------------- /apps/showcase/examples/page_with_postback.py: -------------------------------------------------------------------------------- 1 | from py4web import URL, action, request 2 | 3 | 4 | @action("page_with_postback", method=["GET", "POST"]) 5 | def page_with_postback(): 6 | return ( 7 | "
%s
" 8 | + '
' 9 | + '' 10 | + "
" 11 | ) % (dict(request.forms), URL("page_with_postback")) 12 | -------------------------------------------------------------------------------- /apps/showcase/examples/page_with_query.py: -------------------------------------------------------------------------------- 1 | from py4web import URL, action, redirect, request 2 | 3 | 4 | @action("page_with_query") 5 | def page_with_query(): 6 | if not request.query: 7 | redirect(URL("page_with_query", vars=dict(x=1, y=2))) 8 | return repr(dict(request.query)) 9 | -------------------------------------------------------------------------------- /apps/showcase/examples/page_with_raise.py: -------------------------------------------------------------------------------- 1 | from py4web import HTTP, action 2 | 3 | 4 | @action("page_with_raise") 5 | def page_with_raise(): 6 | raise HTTP(400, "oops") 7 | -------------------------------------------------------------------------------- /apps/showcase/examples/page_with_redirect.py: -------------------------------------------------------------------------------- 1 | from py4web import URL, action, redirect 2 | 3 | 4 | @action("page_with_redirect") 5 | def page_with_redirect(): 6 | redirect(URL("target")) 7 | 8 | 9 | @action("target") 10 | def target(): 11 | return "target" 12 | -------------------------------------------------------------------------------- /apps/showcase/examples/page_with_template.py: -------------------------------------------------------------------------------- 1 | from py4web import action 2 | 3 | 4 | @action("page_with_template") 5 | @action.uses("examples/page_with_template.html") 6 | def page_with_template(): 7 | return {"message": "Hello World"} 8 | -------------------------------------------------------------------------------- /apps/showcase/examples/page_without_template.py: -------------------------------------------------------------------------------- 1 | from py4web import action 2 | 3 | 4 | @action("page_without_template") 5 | def page_without_template(): 6 | return "ok" 7 | -------------------------------------------------------------------------------- /apps/showcase/examples/rpc.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | from py4web import action, request 4 | from py4web.utils.jsonrpc import JsonRpc 5 | 6 | 7 | # define a function you want to expose 8 | def add(x, y): 9 | return x + y 10 | 11 | 12 | # register your functions 13 | service = JsonRpc() 14 | service.methods["add"] = add 15 | 16 | 17 | # expose the server 18 | @action("rpc", method=["GET", "POST"]) 19 | def rpc(): 20 | return service(request.query or request.json) 21 | 22 | 23 | # example of a client 24 | def example_jsonrpc(): 25 | import jsonrpc.proxy 26 | 27 | p = jsonrpc.proxy.JSONRPCProxy(URL("rpc")) 28 | assert p.add(1, 2) == 3 29 | assert p.add(x=1, y=2) == 3 30 | -------------------------------------------------------------------------------- /apps/showcase/examples/session_clear.py: -------------------------------------------------------------------------------- 1 | from py4web import URL, action, redirect 2 | 3 | from .common import session 4 | 5 | 6 | @action("session_clear") 7 | @action.uses(session) 8 | def session_clear(): 9 | session.clear() 10 | redirect(URL("session_counter")) 11 | -------------------------------------------------------------------------------- /apps/showcase/examples/session_counter.py: -------------------------------------------------------------------------------- 1 | from py4web import action 2 | 3 | from .common import session 4 | 5 | 6 | @action("session_counter") 7 | @action.uses("examples/session_counter.html", session) 8 | def session_counter(): 9 | session["counter"] = session.get("counter", 0) + 1 10 | return {"counter": session.get("counter")} 11 | -------------------------------------------------------------------------------- /apps/showcase/examples/show_a_button.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from .common import unauthenticated 4 | 5 | 6 | @unauthenticated.callback("click me") 7 | def a_callback(msg): 8 | logging.info(msg) 9 | 10 | 11 | @unauthenticated.get() 12 | def show_a_button(): 13 | return dict(mybutton=a_callback.button("clickme")(msg="hello world")) 14 | -------------------------------------------------------------------------------- /apps/showcase/examples/socketio.py: -------------------------------------------------------------------------------- 1 | from py4web import action, request 2 | 3 | # pls, run socketio server - look into py4web/utils/wsservers.py.txt 4 | # test example for python-socketio 5 | # 6 | # sio examples https://github.com/ali96343/lvsio 7 | # https://github.com/ali96343/capp 8 | 9 | 10 | @action("socketio/index") 11 | @action.uses("socketio/socketio_index.html") 12 | def index(): 13 | sio_url = "http://localhost:8000" 14 | return dict(sio_url=sio_url) 15 | 16 | 17 | @action("socketio/echo/", method=["GET", "POST"]) 18 | def echo(path=None): 19 | print(path) 20 | print("GET from sio-server") 21 | -------------------------------------------------------------------------------- /apps/showcase/examples/tagsinput_form.py: -------------------------------------------------------------------------------- 1 | from py4web import HTTP, URL, Field, abort, action, redirect, request 2 | from py4web.utils.form import Form, FormStyleDefault 3 | 4 | from .common import session 5 | 6 | 7 | @action("tagsinput_form", method=["GET", "POST"]) 8 | @action.uses("examples/tagsinput_form.html", session) 9 | def tagsinput_form(): 10 | form = Form([Field("colors", "list:string")], keep_values=True) 11 | return dict(form=form) 12 | -------------------------------------------------------------------------------- /apps/showcase/examples/test_expose.py: -------------------------------------------------------------------------------- 1 | from py4web import action 2 | from py4web.utils.factories import ActionFactory, Inject 3 | 4 | from .common import T, auth, db 5 | 6 | expose = ActionFactory(auth, T, Inject(message="Hello World")) 7 | 8 | 9 | @expose.get("test_expose1", template="examples/generic.html") 10 | def test_expose1(): 11 | return dict() 12 | 13 | 14 | @expose.get("test_expose2") 15 | def test_expose2(): 16 | return dict() 17 | 18 | 19 | @expose("test_expose3") 20 | def test_expose3(): 21 | return dict() 22 | -------------------------------------------------------------------------------- /apps/showcase/examples/update_form.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from py4web import action 4 | from py4web.utils.form import Form, FormStyleDefault 5 | 6 | from .common import T, db, session 7 | 8 | 9 | # exposed as /examples/create_form or /examples/update_form/ 10 | @action("update_form/", method=["GET", "POST"]) 11 | @action.uses("examples/form.html", db, session, T) 12 | def update_form(id): 13 | form = Form(db.person, id, deletable=False, formstyle=FormStyleDefault) 14 | rows = db(db.person).select() 15 | return dict(form=form, rows=rows) 16 | -------------------------------------------------------------------------------- /apps/showcase/examples/ws.py: -------------------------------------------------------------------------------- 1 | from py4web import action, request 2 | 3 | # pls, run websockets server - look into py4web/utils/wsservers.py.txt 4 | # test example for websockets 5 | 6 | 7 | @action("ws/index") 8 | @action.uses("ws/ws_index.html") 9 | def index(): 10 | ws_url = "ws://127.0.0.1:8000/" 11 | return dict(ws_url=ws_url) 12 | -------------------------------------------------------------------------------- /apps/showcase/examples/ws_client_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from websocket import create_connection 3 | 4 | # pip install websocket-client 5 | 6 | 7 | def short_lived_connection(): 8 | ws = create_connection("ws://localhost:8000/") 9 | print("Sending 'Hello Server'...") 10 | ws.send("Hello, Server") 11 | print("Sent") 12 | print("Receiving...") 13 | result = ws.recv() 14 | print("Received '%s'" % result) 15 | ws.close() 16 | 17 | 18 | if __name__ == "__main__": 19 | short_lived_connection() 20 | -------------------------------------------------------------------------------- /apps/showcase/static/components-bulma/fileupload/fileupload.css: -------------------------------------------------------------------------------- 1 | input.file { 2 | font-size: 1rem; 3 | } -------------------------------------------------------------------------------- /apps/showcase/static/components-bulma/fileupload/fileupload.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/showcase/static/components-bulma/grid/grid.css: -------------------------------------------------------------------------------- 1 | .pagination .grid_page_number { 2 | margin-right: 0.5em; 3 | margin-left: 0.5em; 4 | } 5 | span.disabled { 6 | color: lightgray; 7 | } 8 | th.clickable { 9 | cursor: pointer; 10 | } 11 | .pagination { 12 | direction: rtl; 13 | } 14 | .pagination-symbols { 15 | direction: ltr; 16 | } 17 | 18 | input.search { 19 | width: 100%; 20 | } 21 | 22 | .table.is-striped tr:nth-child(even) { 23 | background-color: #fafafa; 24 | } 25 | 26 | .table.is-striped tr:hover { 27 | background-color: #faf7f0; 28 | } -------------------------------------------------------------------------------- /apps/showcase/static/components-bulma/starrater/starrater.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/showcase/static/components-bulma/starrater/starrater.css -------------------------------------------------------------------------------- /apps/showcase/static/components-bulma/starrater/starrater.html: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /apps/showcase/static/components-bulma/vueform/vueform.css: -------------------------------------------------------------------------------- 1 | div.vueform p.error { 2 | color: crimson; 3 | } -------------------------------------------------------------------------------- /apps/showcase/static/components/fileupload/fileupload.css: -------------------------------------------------------------------------------- 1 | input.file { 2 | font-size: 1rem; 3 | } -------------------------------------------------------------------------------- /apps/showcase/static/components/fileupload/fileupload.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/showcase/static/components/grid/grid.css: -------------------------------------------------------------------------------- 1 | .pagination .grid_page_number { 2 | margin-right: 0.5em; 3 | margin-left: 0.5em; 4 | } 5 | span.disabled { 6 | color: lightgray; 7 | } 8 | th.clickable { 9 | cursor: pointer; 10 | } 11 | .pagination { 12 | direction: rtl; 13 | } 14 | .pagination-symbols { 15 | direction: ltr; 16 | } 17 | 18 | input.search { 19 | width: 100%; 20 | } 21 | 22 | .table.is-striped tr:nth-child(even) { 23 | background-color: #fafafa; 24 | } 25 | 26 | .table.is-striped tr:hover { 27 | background-color: #faf7f0; 28 | } -------------------------------------------------------------------------------- /apps/showcase/static/components/starrater/starrater.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/showcase/static/components/starrater/starrater.css -------------------------------------------------------------------------------- /apps/showcase/static/components/starrater/starrater.html: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /apps/showcase/static/components/vueform/vueform.css: -------------------------------------------------------------------------------- 1 | div.vueform p.error { 2 | color: crimson; 3 | } -------------------------------------------------------------------------------- /apps/showcase/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/showcase/static/favicon.ico -------------------------------------------------------------------------------- /apps/showcase/static/firebase-push.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Firebase Cloud Messaging Example 5 | 6 | 7 | 8 | 9 | 10 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /apps/showcase/static/hello.txt: -------------------------------------------------------------------------------- 1 | Hello World 2 | -------------------------------------------------------------------------------- /apps/showcase/static/js/firebase-push.js: -------------------------------------------------------------------------------- 1 | var enable_firebase_push = function(vapid_key, send_token_to_server, on_message) { 2 | // enable messaging 3 | const messaging = firebase.messaging(); 4 | // what to do when a message is received 5 | messaging.onMessage(function(payload) { 6 | on_message(payload); 7 | }); 8 | // what todo when we have a new token 9 | messaging.getToken({vapidKey: vapid_key}) 10 | .then(function(currentToken) { 11 | if (currentToken) { 12 | if(window.localStorage.getItem('firebase-push-token-sent') !== 'T') { 13 | send_token_to_server(currentToken); 14 | } 15 | window.localStorage.setItem('firebase-push-token-sent', 'T'); 16 | } else { 17 | window.localStorage.setItem('firebase-push-token-sent', 'F'); 18 | } 19 | }).catch(function(erro) { 20 | window.localStorage.setItem('firebase-push-token-sent', 'F'); 21 | }); 22 | } -------------------------------------------------------------------------------- /apps/showcase/static/js/star_rater_vue.js: -------------------------------------------------------------------------------- 1 | // This will be the object that will contain the Vue attributes 2 | // and be used to initialize it. 3 | let app = {}; 4 | 5 | // Create an initialization function 6 | app.init = function() { 7 | 8 | // This creates the Vue instance. 9 | app.vue = new Vue({ 10 | el: "#vue", 11 | data: { 12 | posts: "" 13 | }, 14 | methods: {} 15 | }); 16 | 17 | // Perform any required IO 18 | axios.get(get_posts_url).then((result) => { 19 | app.vue.posts = result.data.posts; 20 | }) 21 | }; 22 | 23 | // Start the app 24 | app.init(); 25 | -------------------------------------------------------------------------------- /apps/showcase/static/socketio/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/showcase/static/ws/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/showcase/templates/auth.html: -------------------------------------------------------------------------------- 1 | [[extend "layout.html"]] 2 | 13 |
14 | [[=form]] 15 |
16 | -------------------------------------------------------------------------------- /apps/showcase/templates/examples/ajax_grid.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 |

Ajax Grid

4 | [[=grid]] 5 | -------------------------------------------------------------------------------- /apps/showcase/templates/examples/auth_custom_login.html: -------------------------------------------------------------------------------- 1 | [[extend "layout.html"]] 2 | 13 |
14 | [[if path == "login":]] 15 | [[=form.custom.begin ]] 16 | Username: 17 | [[=form.custom.widgets['username'] ]] 18 | Password: 19 | [[=form.custom.widgets['login_password'] ]] 20 | [[=form.errors]] 21 | [[=form.custom.submit ]] 22 | [[=form.custom.end ]] 23 | [[else:]] 24 | [[=form]] 25 | [[pass]] 26 |
27 | -------------------------------------------------------------------------------- /apps/showcase/templates/examples/auth_form.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 |

WORK IN PROGRESS

4 | 5 |

Generic Auth Form

6 | [[=form]] 7 | 8 | [[block page_scripts]] 9 | 12 | [[end]] 13 | -------------------------------------------------------------------------------- /apps/showcase/templates/examples/auth_forms.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 |

WORK IN PROGRESS

4 | 5 |

Register Form

6 | (or individual form") 7 | [[=register_form]] 8 | 9 |

Login Form

10 | (or individual form") 11 | [[=login_form]] 12 | 13 |

Reset Password Form

14 | (or individual form") 15 | [[=reset_password_form]] 16 | 17 |

Change Password Form

18 | (or individual form") 19 | [[=change_password_form]] 20 | 21 |

Profile Form

22 | (or individual form") 23 | [[=profile_form]] -------------------------------------------------------------------------------- /apps/showcase/templates/examples/component_loader.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 | 4 | Loading... 5 | 6 | -------------------------------------------------------------------------------- /apps/showcase/templates/examples/custom_form.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 |

Form Superhero Identity (Custom)

4 | [[= form.custom.begin ]] 5 |
6 |
7 | 8 | [[= form.custom.widgets['name'] ]] 9 | [[= form.custom.errors.get('name', '') ]] 10 |
11 |
12 | 13 | [[= form.custom.widgets['job'] ]] 14 | [[= form.custom.errors.get('job', '')]] 15 |
16 |
17 |
18 | [[ form.custom.submit['_class'] = 'button is-info is-large' ]] 19 | [[= form.custom.submit ]] 20 |
21 |
22 |
23 | [[= form.custom.end ]] 24 | 25 | 26 |

Rows

27 | 28 |
    29 | [[for row in rows:]] 30 |
  • [[=row.id]]: [[=row.name]] ([[=row.job]])
  • 31 | [[pass]] 32 |
33 | -------------------------------------------------------------------------------- /apps/showcase/templates/examples/flash_example.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 | 4 |
or type something below
5 | 6 | -------------------------------------------------------------------------------- /apps/showcase/templates/examples/flash_example_next.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 | -------------------------------------------------------------------------------- /apps/showcase/templates/examples/form.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 |

Form Superhero Identity

4 | 5 | [[=form]] 6 | 7 |

Rows

8 | 9 |
    10 | [[for row in rows:]] 11 |
  • [[=row.id]]: [[=row.name]] ([[=row.job]]) edit
  • 12 | [[pass]] 13 |
  • create
  • 14 |
15 | -------------------------------------------------------------------------------- /apps/showcase/templates/examples/forms.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 | [[for message in messages:]] 4 |
5 | [[=message]] 6 |
7 | [[pass]] 8 | 9 | [[for form in forms:]] 10 |

Form [[=form.form_name]]

11 |
12 | [[=form]] 13 |
14 | [[pass]] 15 | -------------------------------------------------------------------------------- /apps/showcase/templates/examples/generic.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 | 8 | 9 |
10 | [[=BEAUTIFY(__vars__)]] 11 |
12 | -------------------------------------------------------------------------------- /apps/showcase/templates/examples/hcaptcha_form.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 |

Simple form with hCaptcha

4 | 5 | [[=form]] 6 | 7 | 8 | 9 | 10 | [[block page_scripts]] 11 | 12 | [[end]] -------------------------------------------------------------------------------- /apps/showcase/templates/examples/html_grid.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 |

examples/Pure.html Grid

4 |
5 | [[=grid]] 6 |
7 | 8 | -------------------------------------------------------------------------------- /apps/showcase/templates/examples/page_with_tailwindcss.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout_tailwind.html']] 2 | 3 | 4 |
5 | Page with TailwindCSS Grid 6 |
7 | 8 | 9 |
10 |
11 |

Data Table

12 |
13 | [[ = grid.render() ]] 14 |
15 |
16 |
-------------------------------------------------------------------------------- /apps/showcase/templates/examples/page_with_template.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 |
4 |

[[=message]]

5 |
-------------------------------------------------------------------------------- /apps/showcase/templates/examples/rest_info.html: -------------------------------------------------------------------------------- 1 | [[extend "layout.html"]] 2 | 3 |

Rest examples

4 | 5 | Your authentication token is [[=token]]. 6 | Reload the page for a new token. 7 | 8 |

List all chairs

9 |
10 |     curl -H "Authentication: [[=token]]" \
11 |          [[=URL('rest/chair', scheme=True)]]
12 | 
13 | 14 |

Create a new chair record

15 |
16 |     curl -X POST \
17 |          -d '{"color":"red"}' \
18 |          -H "Content-Type: application/json" \
19 |          -H "Authentication: [[=token]]" \
20 |          [[=URL('rest/chair', scheme=True)]]
21 | 
22 | 23 |

Retrieve chair with id=1

24 |
25 |     curl -H "Authentication: [[=token]]" \
26 |          [[=URL('rest/chair/1', scheme=True)]]
27 | 
28 | 29 |

Update chair with id=1

30 |
31 |     curl -X PUT \
32 |          -d '{"color":"green"}' \
33 |          -H "Content-Type: application/json" \
34 |          -H "Authentication: [[=token]]" \
35 |          [[=URL('rest/chair/1', scheme=True)]]
36 | 
37 | 38 |

Delete chair with id=1

39 |
40 |     curl -X DELETE \
41 |          -H "Authentication: [[=token]]" \
42 |          [[=URL('rest/chair/1', scheme=True)]]
43 | 
44 | -------------------------------------------------------------------------------- /apps/showcase/templates/examples/session_counter.html: -------------------------------------------------------------------------------- 1 | [[extend "layout.html"]] 2 | 3 |

Counter value: [[=counter]]

4 | 5 | Click to reload and increment counter 6 | Click to reload and reset counter 7 | -------------------------------------------------------------------------------- /apps/showcase/templates/show.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 5 | 6 | Back to Examples 7 | [[if executable:]] 8 | Run Example 9 | [[else:]] 10 | Run this application locally to try examples 11 | [[pass]] 12 | 13 | [[for file in files:]] 14 |
15 |

[[=file['name'] ]]

16 |
[[=file['content'] ]]
17 |
18 | [[pass]] 19 | 20 | -------------------------------------------------------------------------------- /apps/showcase/templates/vue/edit_form.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout_bulma.html']] 2 | 3 | [[block page_head]] 4 | 5 | [[end]] 6 | 7 |
8 |

Edit Form

9 | [[=form]] 10 |
11 | 12 | [[block page_scripts]] 13 | 14 | 15 | 21 | [[end]] 22 | -------------------------------------------------------------------------------- /apps/showcase/templates/vue/file_uploader.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 | [[block page_head]] 4 | 5 | [[end]] 6 | 7 |
8 | [[=uploader]] 9 |
10 | 11 | [[block page_scripts]] 12 | 13 | 19 | [[end]] 20 | -------------------------------------------------------------------------------- /apps/showcase/templates/vue/insert_form.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout_bulma.html']] 2 | 3 | [[block page_head]] 4 | 5 | [[end]] 6 | 7 |
8 |

Insert Form

9 | [[=form]] 10 |
11 | 12 | [[block page_scripts]] 13 | 14 | 15 | 21 | [[end]] 22 | -------------------------------------------------------------------------------- /apps/showcase/templates/vue/star_rater_vue.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 | [[block page_head]] 4 | 5 | [[end]] 6 | 7 |
8 |
9 |
10 |

{{post.content}}

11 | 12 |
13 |
14 | 15 | [[block page_scripts]] 16 | 20 | 21 | 22 | [[end]] 23 | -------------------------------------------------------------------------------- /apps/showcase/templates/vue/star_rater_vue_bulma.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout_bulma.html']] 2 | 3 | [[block page_head]] 4 | 5 | [[end]] 6 | 7 |
8 |
9 |
10 |

{{post.content}}

11 | 12 |
13 |
14 | 15 | [[block page_scripts]] 16 | 20 | 21 | 22 | [[end]] 23 | -------------------------------------------------------------------------------- /apps/showcase/templates/vue/starrating.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 | [[block page_head]] 4 | 5 | [[end]] 6 | 7 |
8 | [[=stars]] 9 |
10 | 11 | [[block page_scripts]] 12 | 13 | 14 | 20 | [[end]] 21 | -------------------------------------------------------------------------------- /apps/showcase/templates/vue/view_form.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout_bulma.html']] 2 | 3 | [[block page_head]] 4 | 5 | [[end]] 6 | 7 |
8 |

View Form

9 | [[=form]] 10 |
11 | 12 | [[block page_scripts]] 13 | 14 | 15 | 21 | [[end]] 22 | -------------------------------------------------------------------------------- /apps/showcase/templates/vue/vue_grid_and_forms.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout_bulma.html']] 2 | 3 | [[block page_head]] 4 | 5 | [[end]] 6 | 7 |
8 |
9 |

Grid

10 | 11 | 12 | 13 | 14 | Insert 15 | 16 |
17 | [[=grid]] 18 |
19 | 20 | [[block page_scripts]] 21 | 22 | 23 | 29 | [[end]] 30 | -------------------------------------------------------------------------------- /apps/showcase/templates/vue/vuegrid.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 | [[block page_head]] 4 | 5 | [[end]] 6 | 7 |
8 |

Grid

9 | [[=grid]] 10 |
11 | 12 | [[block page_scripts]] 13 | 14 | 20 | [[end]] 21 | -------------------------------------------------------------------------------- /apps/showcase/templates/vue/vuegrid_bulma.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout_bulma.html']] 2 | 3 | [[block page_head]] 4 | 5 | [[end]] 6 | 7 |
8 |

Grid

9 | [[=grid]] 10 |
11 | 12 | [[block page_scripts]] 13 | 14 | 20 | [[end]] 21 | -------------------------------------------------------------------------------- /apps/showcase/translations/en.json: -------------------------------------------------------------------------------- 1 | {"Hello World":{"0":"Hello World"},"more":{"0":"click for more"},"Cat":{"0":"No Cat","1":"A Cat","2":"Pair of Cats","3":"Some Cats","4":"Many Cats","12":"Dozen of Cats", "13":"Gazillion of Cats"}} -------------------------------------------------------------------------------- /apps/showcase/translations/it.json: -------------------------------------------------------------------------------- 1 | {"Hello World":{"0":"Salve Mondo"},"more":{"0":"ancora"},"Cat":{"0":"No Gatti","1":"Un Gatto","2":"Due Gatti","3":"Tre Gatti","4":"Tanti Gatti","10":"Tantitssimi Gatti"},"name":{"0":"nome","2":"nomi"},"job":{"0":"lavoro","2":"lavori"}} -------------------------------------------------------------------------------- /apps/showcase/uploads/README.md: -------------------------------------------------------------------------------- 1 | intentionally empty 2 | -------------------------------------------------------------------------------- /apps/showcase/vue_components_examples/common.py: -------------------------------------------------------------------------------- 1 | from ..examples.common import * 2 | -------------------------------------------------------------------------------- /apps/showcase/vue_components_examples/databases/fb87181b96a99be45f5a23f4277867ce_auth_user.table: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/showcase/vue_components_examples/databases/fb87181b96a99be45f5a23f4277867ce_auth_user.table -------------------------------------------------------------------------------- /apps/showcase/vue_components_examples/databases/fb87181b96a99be45f5a23f4277867ce_auth_user_tag_groups.table: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/showcase/vue_components_examples/databases/fb87181b96a99be45f5a23f4277867ce_auth_user_tag_groups.table -------------------------------------------------------------------------------- /apps/showcase/vue_components_examples/databases/sql.log: -------------------------------------------------------------------------------- 1 | timestamp: 2022-06-05T14:40:30.798606 2 | CREATE TABLE "auth_user"( 3 | "id" INTEGER PRIMARY KEY AUTOINCREMENT, 4 | "username" CHAR(512) UNIQUE, 5 | "email" CHAR(512) UNIQUE, 6 | "password" CHAR(512), 7 | "first_name" CHAR(512), 8 | "last_name" CHAR(512), 9 | "sso_id" CHAR(512), 10 | "action_token" CHAR(512), 11 | "last_password_change" TIMESTAMP 12 | ); 13 | success! 14 | timestamp: 2022-06-05T14:40:30.808178 15 | CREATE TABLE "auth_user_tag_groups"( 16 | "id" INTEGER PRIMARY KEY AUTOINCREMENT, 17 | "tagpath" CHAR(512), 18 | "record_id" INTEGER REFERENCES "auth_user" ("id") ON DELETE CASCADE 19 | ); 20 | success! 21 | -------------------------------------------------------------------------------- /apps/showcase/vue_components_examples/databases/storage.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/showcase/vue_components_examples/databases/storage.db -------------------------------------------------------------------------------- /apps/showcase/vue_components_examples/settings.py: -------------------------------------------------------------------------------- 1 | from ..examples.settings import * 2 | -------------------------------------------------------------------------------- /apps/showcase/vue_components_examples/vue_file_uploader.py: -------------------------------------------------------------------------------- 1 | from py4web import action 2 | 3 | from .common import session 4 | from .components.fileupload import FileUpload 5 | 6 | file_uploader = FileUpload("upload_api", session) 7 | 8 | 9 | @action("vue_file_uploader", method=["GET"]) 10 | @action.uses("vue/file_uploader.html", file_uploader) 11 | def vue_file_uploader(): 12 | return dict(uploader=file_uploader(id=1)) 13 | -------------------------------------------------------------------------------- /apps/showcase/vue_components_examples/vue_grid.py: -------------------------------------------------------------------------------- 1 | from py4web import action 2 | 3 | from .common import session 4 | from .components.grid import Grid 5 | 6 | mygrid = Grid("grid_api", session) 7 | 8 | 9 | @action("vue_grid", method=["GET"]) 10 | @action.uses("vue/vuegrid_bulma.html", mygrid) 11 | def vue_grid(): 12 | """This page generates a sample grid.""" 13 | return dict(grid=mygrid()) 14 | -------------------------------------------------------------------------------- /apps/showcase/vue_components_examples/vue_insert_form.py: -------------------------------------------------------------------------------- 1 | from py4web import URL, action 2 | 3 | from .common import auth, db, session 4 | from .components.vueform import VueForm 5 | 6 | 7 | class InsertForm(VueForm): 8 | def __init__(self): 9 | super().__init__( 10 | db.vue_form_table, session, "insert-form-vue", db=db, auth=auth 11 | ) 12 | 13 | def read_values(self, record_id): 14 | values = {} 15 | for f in self.fields.values(): 16 | ff = f["field"] 17 | values[ff.name] = ff.formatter(None) 18 | return values 19 | 20 | def process_post(self, record_id, values): 21 | new_id = self.db.vue_form_table.insert(**values) 22 | return dict(redirect_url=URL("vue_grid_and_forms")) 23 | 24 | 25 | insert_form = InsertForm() 26 | 27 | 28 | @action("vue_insert_form") 29 | @action.uses("vue/insert_form.html", db, session, insert_form) 30 | def vue_insert_form(): 31 | return dict(form=insert_form(cancel_url=URL("vue_grid_and_forms"))) 32 | -------------------------------------------------------------------------------- /apps/tagged_posts/__init__.py: -------------------------------------------------------------------------------- 1 | # check compatibility 2 | import py4web 3 | 4 | assert py4web.check_compatible("1.20250328.1") 5 | 6 | # by importing controllers you expose the actions defined in it 7 | from . import controllers 8 | # by importing db you expose it to the _dashboard/dbadmin 9 | from .models import db 10 | 11 | # optional parameters 12 | __version__ = "0.0.0" 13 | __author__ = "you " 14 | __license__ = "anything you want" 15 | -------------------------------------------------------------------------------- /apps/tagged_posts/models.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file defines the database models 3 | """ 4 | 5 | import re 6 | 7 | from pydal.validators import * 8 | 9 | from .common import Field, auth, db 10 | 11 | db.define_table( 12 | "post_item", 13 | Field("content", "text"), 14 | auth.signature) 15 | 16 | db.define_table( 17 | "tag_item", 18 | Field("name"), 19 | Field("post_item_id", "reference post_item") 20 | ) 21 | 22 | def parse_post_content(content, post_item_id): 23 | for word in re.compile(r"\#\w+").findall(content): 24 | db.tag_item.insert(name=word[1:], post_item_id=post_item_id) 25 | 26 | 27 | -------------------------------------------------------------------------------- /apps/tagged_posts/static/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/tagged_posts/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/tagged_posts/static/favicon.ico -------------------------------------------------------------------------------- /apps/tagged_posts/tasks.py: -------------------------------------------------------------------------------- 1 | """ 2 | To use celery tasks: 3 | 1) pip install -U "celery[redis]" 4 | 2) In settings.py: 5 | USE_CELERY = True 6 | CELERY_BROKER = "redis://localhost:6379/0" 7 | 3) Start "redis-server" 8 | 4) Start "celery -A apps.{appname}.tasks beat" 9 | 5) Start "celery -A apps.{appname}.tasks worker --loglevel=info" for each worker 10 | 11 | """ 12 | from .common import Field, db, scheduler, settings 13 | 14 | 15 | # example of task that needs db access 16 | @scheduler.task 17 | def my_task(): 18 | try: 19 | # this task will be executed in its own thread, connect to db 20 | db._adapter.reconnect() 21 | # do something here 22 | db.commit() 23 | except: 24 | # rollback on failure 25 | db.rollback() 26 | 27 | 28 | # run my_task every 10 seconds 29 | scheduler.conf.beat_schedule = { 30 | "my_first_task": { 31 | "task": "apps.%s.tasks.my_task" % settings.APP_NAME, 32 | "schedule": 10.0, 33 | "args": (), 34 | }, 35 | } 36 | -------------------------------------------------------------------------------- /apps/tagged_posts/templates/README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/tagged_posts/templates/auth.html: -------------------------------------------------------------------------------- 1 | [[extend "layout.html"]] 2 | 13 |
14 | [[=form]] 15 |
16 | -------------------------------------------------------------------------------- /apps/tagged_posts/templates/generic.html: -------------------------------------------------------------------------------- 1 | [[extend 'layout.html']] 2 | 3 | 8 | 9 |
10 |
11 | [[=BEAUTIFY(__vars__)]] 12 |
13 |
14 | -------------------------------------------------------------------------------- /apps/tagged_posts/translations/it.json: -------------------------------------------------------------------------------- 1 | {"Hello World from {name}": {"0": "Salve Mondo da {name}"}, "thing": {"0": "cosa", "1": "cose"}} 2 | -------------------------------------------------------------------------------- /apps/todo/databases/README: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/todo/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/apps/todo/static/favicon.ico -------------------------------------------------------------------------------- /apps/todo/static/js/todo.js: -------------------------------------------------------------------------------- 1 | // initialize the app 2 | var app = {data:{}, methods:{}}; 3 | // data exposed to the view 4 | app.api = '/' + window.location.href.split('/')[3] + '/api'; 5 | app.data.items = []; 6 | app.data.input = ''; 7 | // methods exposed to the view 8 | app.methods.edit = function(item_id) { }; 9 | app.methods.remove = function(item_id) { 10 | Q.delete(app.api + '/' + item_id).then(function(){ 11 | app.vue.items=app.vue.items.filter(function(item){ 12 | return item.id!=item_id; 13 | }); 14 | }); 15 | }; 16 | app.methods.save = function(item_id) { 17 | var data = {}; 18 | data.info = app.vue.input; 19 | Q.post(app.api, data).then(function(res){ 20 | if (app.vue.input) app.vue.items.unshift({id:res.json().id, info: app.vue.input}); 21 | app.vue.input=''; 22 | }); 23 | }; 24 | 25 | // start the app 26 | app.vue = new Vue({el:"#vue", data: app.data, methods: app.methods}); 27 | Q.get(app.api).then(function(res){ 28 | app.vue.items = res.json().items; 29 | }); 30 | -------------------------------------------------------------------------------- /apps/todo/templates/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 |
10 |

Example TODO App

11 |
12 |
13 | [[include]] 14 |
15 |
16 | I was made with py4web (prototype), vue.js, and bulma.css 17 |
18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /deployment_tools/docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:latest 2 | 3 | ARG user=py4web 4 | 5 | RUN apt update && \ 6 | apt install -y git python3 python3-pip python3-venv memcached && \ 7 | service memcached restart && \ 8 | groupadd -r $user && \ 9 | useradd -m -r -g $user $user 10 | 11 | USER $user 12 | WORKDIR /home/$user/ 13 | 14 | RUN python3 -m venv venv && \ 15 | . venv/bin/activate && \ 16 | pip install -U py4web && \ 17 | py4web setup --yes apps 18 | 19 | EXPOSE 8000 20 | 21 | CMD . venv/bin/activate && py4web run --password_file password.txt --host 0.0.0.0 --port 8000 apps 22 | -------------------------------------------------------------------------------- /deployment_tools/docker/Makefile: -------------------------------------------------------------------------------- 1 | # https://codeblog.dotsandbrackets.com/quick-intro-to-docker-compose/ 2 | 3 | 4 | DOCKER_COMPOSE=docker-compose 5 | #DOCKER_COMPOSE=docker compose 6 | # On latest docker version, use 'docker compose' 7 | 8 | up: ## Start all containers in foreground 9 | @$(DOCKER_COMPOSE) up -d 10 | 11 | down: ## Stop all containers 12 | @$(DOCKER_COMPOSE) down 13 | 14 | restart: ## Restart all containers in foreground 15 | @$(DOCKER_COMPOSE) restart -d 16 | 17 | rebuild: ## Force rebuild of all containers 18 | @$(DOCKER_COMPOSE) up --build --force-recreate postgres web 19 | 20 | ssh: ## Interactive run 21 | @$(DOCKER_COMPOSE) exec web bash 22 | -------------------------------------------------------------------------------- /deployment_tools/docker/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | 4 | web: 5 | build: . 6 | ports: 7 | - "8000:8000" 8 | environment: 9 | - PYDAL_URI=postgres://foo:bar@postgres:5432/baz 10 | stdin_open: true 11 | tty: true 12 | depends_on: 13 | - postgres 14 | 15 | postgres: 16 | restart: always 17 | image: postgres 18 | environment: 19 | - POSTGRES_USER=foo 20 | - POSTGRES_PASSWORD=bar 21 | - POSTGRES_DB=baz 22 | - POSTGRES_PORT=5432 23 | ports: 24 | - "5432:5432" 25 | volumes: 26 | - ./data/postgres:/var/lib/postgresql/data 27 | -------------------------------------------------------------------------------- /deployment_tools/gae/Makefile: -------------------------------------------------------------------------------- 1 | install-gcloud-linux: 2 | sudo apt-get update && sudo apt-get install google-cloud-sdk google-cloud-sdk-app-engine-python 3 | gcloud init 4 | upgrade-gcloud: 5 | gcloud components update 6 | setup: 7 | mkdir -p apps 8 | echo "" > apps/__init__.py 9 | echo "copy the apps you want to deploy under the new app" 10 | deploy: 11 | gcloud config set account ${email} 12 | gcloud config set project ${project} 13 | gcloud config set app/promote_by_default false 14 | gcloud config list 15 | gcloud app deploy --version ${version} app.yaml 16 | deploy-production: 17 | gcloud config set account ${email} 18 | gcloud config set project ${project} 19 | gcloud config set app/promote_by_default true 20 | gcloud config list 21 | gcloud app deploy --version ${version} app.yaml 22 | -------------------------------------------------------------------------------- /deployment_tools/gae/README.md: -------------------------------------------------------------------------------- 1 | # To deploy code on Google App Engine: 2 | 3 | ## Setup your deployment folder 4 | 5 | ``` 6 | mkdir my-py4web-gae 7 | cp -r /path/to/py4web/deployment_tools/gae/* my-py4web-gae 8 | cd my-py4web-gae 9 | make install-gcloud-linux 10 | make upgrade-gcloud 11 | make setup 12 | # copy the apps that you want to deploy to GAE, for example: 13 | cp -r /path/to/py4web/apps/_default apps/_default 14 | (cp -r /path/to/py4web/apps/myapp apps/myapp) 15 | # you may need to to symlink or copy the service folder (optional) 16 | cp -r /path/to/py4web/apps/.service apps/ 17 | ``` 18 | 19 | ## Deploy from the deployment folder 20 | 21 | ``` 22 | make deploy email={your email} project={your project} version={vesion} 23 | ``` 24 | 25 | If you have a gcloud configuration already set you can just do 26 | 27 | ``` 28 | gcloud app deploy 29 | ``` 30 | -------------------------------------------------------------------------------- /deployment_tools/gae/app.yaml: -------------------------------------------------------------------------------- 1 | runtime: python311 2 | 3 | # Handlers define how to route requests to your application. 4 | handlers: 5 | 6 | - url: .* # This regex directs all routes to main.bottle 7 | script: auto 8 | secure: always 9 | 10 | -------------------------------------------------------------------------------- /deployment_tools/gae/index.yaml: -------------------------------------------------------------------------------- 1 | indexes: 2 | # AUTOGENERATED 3 | -------------------------------------------------------------------------------- /deployment_tools/gae/main.py: -------------------------------------------------------------------------------- 1 | import os 2 | import site 3 | import uuid 4 | 5 | site.addsitedir(os.path.join(os.path.dirname(__file__), "lib")) 6 | from py4web.core import Reloader, Session, bottle 7 | 8 | os.environ["PY4WEB_DASHBOARD_MODE"] = "none" 9 | os.environ["PY4WEB_SERVICE_DB_URI"] = "sqlite:memory" 10 | os.environ["PY4WEB_APPS_FOLDER"] = os.path.join(os.path.dirname(__file__), "apps") 11 | os.environ["PY4WEB_SERVICE_FOLDER"] = os.path.join( 12 | os.path.dirname(__file__), "apps/.service" 13 | ) 14 | Session.SECRET = str(uuid.uuid4()) 15 | Reloader.import_apps() 16 | app = bottle.default_app() 17 | -------------------------------------------------------------------------------- /deployment_tools/pythonanywhere.com/bottle_app.py: -------------------------------------------------------------------------------- 1 | """ 2 | Documented here: https://youtu.be/Wxjl_vkLAEY 3 | """ 4 | 5 | import os 6 | 7 | from py4web.core import wsgi 8 | 9 | # BEGIN CONFIGURATION 10 | PASSWORD_FILENAME = "password.txt" 11 | DASHBOARD_MODE = "full" or "demo" or "none" 12 | APPS_FOLDER = "mysite/apps" 13 | # END CONFIGURATION 14 | 15 | password_file = os.path.abspath( 16 | os.path.join(os.path.dirname(__file__), PASSWORD_FILENAME) 17 | ) 18 | application = wsgi( 19 | password_file=password_file, dashboard_mode=DASHBOARD_MODE, apps_folder=APPS_FOLDER 20 | ) 21 | -------------------------------------------------------------------------------- /docs/_templates/layout.html: -------------------------------------------------------------------------------- 1 | {% extends "!layout.html" %} 2 | {% block footer %} {{ super() }} 3 | 4 | 7 | 8 | {% endblock %} 9 | 10 | -------------------------------------------------------------------------------- /docs/images/_scaffold.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/_scaffold.png -------------------------------------------------------------------------------- /docs/images/command.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/command.png -------------------------------------------------------------------------------- /docs/images/dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/dashboard.png -------------------------------------------------------------------------------- /docs/images/dashboard_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/dashboard_edit.png -------------------------------------------------------------------------------- /docs/images/dashboard_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/dashboard_error.png -------------------------------------------------------------------------------- /docs/images/dashboard_i18n_btn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/dashboard_i18n_btn.png -------------------------------------------------------------------------------- /docs/images/dashboard_i18n_ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/dashboard_i18n_ui.png -------------------------------------------------------------------------------- /docs/images/dashboard_login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/dashboard_login.png -------------------------------------------------------------------------------- /docs/images/dashboard_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/dashboard_main.png -------------------------------------------------------------------------------- /docs/images/dashboard_new_app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/dashboard_new_app.png -------------------------------------------------------------------------------- /docs/images/dashboard_restapi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/dashboard_restapi.png -------------------------------------------------------------------------------- /docs/images/dashboard_ticket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/dashboard_ticket.png -------------------------------------------------------------------------------- /docs/images/example_db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/example_db.png -------------------------------------------------------------------------------- /docs/images/first_run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/first_run.png -------------------------------------------------------------------------------- /docs/images/form1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/form1.png -------------------------------------------------------------------------------- /docs/images/form2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/form2.png -------------------------------------------------------------------------------- /docs/images/form5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/form5.png -------------------------------------------------------------------------------- /docs/images/form6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/form6.png -------------------------------------------------------------------------------- /docs/images/grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/grid.png -------------------------------------------------------------------------------- /docs/images/grid_bulmacss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/grid_bulmacss.png -------------------------------------------------------------------------------- /docs/images/grid_columns.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/grid_columns.png -------------------------------------------------------------------------------- /docs/images/grid_nocss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/grid_nocss.png -------------------------------------------------------------------------------- /docs/images/icon-gear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/icon-gear.png -------------------------------------------------------------------------------- /docs/images/icon-lens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/icon-lens.png -------------------------------------------------------------------------------- /docs/images/icon-start.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/icon-start.png -------------------------------------------------------------------------------- /docs/images/icon-stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/icon-stop.png -------------------------------------------------------------------------------- /docs/images/logo-32x32.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/logo-32x32.ico -------------------------------------------------------------------------------- /docs/images/logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/logo.ico -------------------------------------------------------------------------------- /docs/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/logo.png -------------------------------------------------------------------------------- /docs/images/logo_with_py4web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/logo_with_py4web.png -------------------------------------------------------------------------------- /docs/images/main_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/main_page.png -------------------------------------------------------------------------------- /docs/images/restapi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/restapi.png -------------------------------------------------------------------------------- /docs/images/restapi2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/restapi2.png -------------------------------------------------------------------------------- /docs/images/scaffold_tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/scaffold_tree.png -------------------------------------------------------------------------------- /docs/images/simple_counter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/simple_counter.png -------------------------------------------------------------------------------- /docs/images/tags2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/tags2.png -------------------------------------------------------------------------------- /docs/images/tags_db.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/images/tags_db.png -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | 2 | py4web: the reference Manual 3 | ============================ 4 | 5 | .. toctree:: 6 | :maxdepth: 2 7 | :caption: Contents: 8 | 9 | chapter-01 10 | chapter-02 11 | chapter-03 12 | chapter-04 13 | chapter-05 14 | chapter-06 15 | chapter-07 16 | chapter-08 17 | chapter-09 18 | chapter-10 19 | chapter-11 20 | chapter-12 21 | chapter-13 22 | chapter-14 23 | chapter-15 24 | chapter-16 25 | 26 | 27 | Indices and tables 28 | ================== 29 | 30 | * :ref:`genindex` 31 | * :ref:`modindex` 32 | * :ref:`search` 33 | -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/chapter-01.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/chapter-01.mo -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/chapter-02.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/chapter-02.mo -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/chapter-03.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/chapter-03.mo -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/chapter-04.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/chapter-04.mo -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/chapter-05.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/chapter-05.mo -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/chapter-06.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/chapter-06.mo -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/chapter-07.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/chapter-07.mo -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/chapter-08.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/chapter-08.mo -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/chapter-09.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/chapter-09.mo -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/chapter-10.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/chapter-10.mo -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/chapter-11.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/chapter-11.mo -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/chapter-12.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/chapter-12.mo -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/chapter-13.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/chapter-13.mo -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/chapter-14.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/chapter-14.mo -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/chapter-15.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/chapter-15.mo -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/chapter-15.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) 2020, BSDv3 License 3 | # This file is distributed under the same license as the py4web package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: py4web 1.20201127.1\n" 10 | "\n" 11 | "Report-Msgid-Bugs-To: \n" 12 | "POT-Creation-Date: 2020-12-02 20:25-0300\n" 13 | "PO-Revision-Date: 2020-12-02 22:43:52.847029\n" 14 | "Last-Translator: potranslator 1.1.5\n" 15 | "Language-Team: LANGUAGE \n" 16 | "Language: pt\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit\n" 20 | "Translated-By: potranslator 1.1.5\n" 21 | 22 | #: ../../chapter-15.rst:3 23 | msgid "From web2py to py4web" 24 | msgstr "De web2py para py4web" 25 | 26 | #: ../../chapter-15.rst:5 27 | msgid "" 28 | "This chapter is dedicated to help users for porting old web2py applications " 29 | "to py4web." 30 | msgstr "" 31 | "Este capítulo é dedicado a ajudar os usuários para portar aplicativos web2py" 32 | " antigos para py4web." 33 | 34 | #: ../../chapter-15.rst:9 35 | msgid "Work in progress" 36 | msgstr "Trabalho em progresso" 37 | -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/index.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/index.mo -------------------------------------------------------------------------------- /docs/locales/pt/LC_MESSAGES/sphinx.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/web2py/py4web/58b653334ed42593e9f633dab206ba7b1b84eeb6/docs/locales/pt/LC_MESSAGES/sphinx.mo -------------------------------------------------------------------------------- /py4web.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | from py4web.core import cli 4 | 5 | cli() 6 | -------------------------------------------------------------------------------- /py4web/__init__.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | __author__ = "Massimo Di Pierro " 4 | __license__ = "BSD-3-Clause" 5 | __version__ = "1.20250603.1" 6 | 7 | 8 | def _maybe_gevent(): 9 | for arg in sys.argv[1:]: 10 | if "gevent" in arg.lower(): 11 | from gevent import monkey 12 | 13 | monkey.patch_all() 14 | break 15 | 16 | 17 | _maybe_gevent() 18 | 19 | 20 | from .core import HTTP # checks for version compatibility; bottle 21 | from .core import URL # custom helper 22 | from .core import Field # pydal 23 | from .core import Translator # from pluralize 24 | from .core import action # main py4web decorator 25 | from .core import render # yatl 26 | from .core import ( 27 | DAL, 28 | Cache, 29 | Condition, 30 | Flash, 31 | Session, 32 | abort, 33 | check_compatible, 34 | redirect, 35 | request, 36 | response, 37 | safely, 38 | ) 39 | -------------------------------------------------------------------------------- /py4web/__main__.py: -------------------------------------------------------------------------------- 1 | # allow py4web to be run as a module 2 | # this file is called when running "python -m py4web" 3 | from py4web.core import cli 4 | 5 | cli() 6 | -------------------------------------------------------------------------------- /py4web/server_adapters/adapter_rocket3.py: -------------------------------------------------------------------------------- 1 | from ombott.server_adapters import ServerAdapter 2 | from rocket3 import Rocket3 3 | 4 | from .logging_utils import logging_conf 5 | 6 | 7 | class Rocket3Adapter(ServerAdapter): 8 | "Class implementing a rocket3 server" 9 | 10 | def run(self, handler): 11 | "runs the server" 12 | 13 | if not self.quiet: 14 | logging_conf( 15 | self.options["logging_level"], 16 | ) 17 | 18 | keyfile = self.options.get("keyfile") 19 | certfile = self.options.get("certfile") 20 | 21 | if keyfile and certfile: 22 | interface = (self.host, self.port, keyfile, certfile) 23 | else: 24 | interface = (self.host, self.port) 25 | 26 | server = Rocket3(interface, "wsgi", dict(wsgi_app=handler)) 27 | server.start() 28 | -------------------------------------------------------------------------------- /py4web/utils/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /py4web/utils/auth_plugins/basic_auth_plugin.py: -------------------------------------------------------------------------------- 1 | import base64 2 | 3 | from pydal._compat import urllib2, urlopen 4 | 5 | 6 | class BasicAuthPlugin: 7 | name = "basic" 8 | label = "Basic" 9 | 10 | def __init__(self, server="127.0.0.1", table=None): 11 | self.server = server 12 | 13 | def check_credentials(self, username, password): 14 | """ 15 | to use basic login with a different server 16 | from gluon.contrib.login_methods.basic_auth import basic_auth 17 | auth.settings.login_methods.append(basic_auth('http://server')) 18 | """ 19 | key = base64.b64encode(username + ":" + password) 20 | headers = {"Authorization": "Basic " + key} 21 | request = urllib2.Request(self.server, None, headers) 22 | try: 23 | urlopen(request) 24 | return True 25 | except (urllib2.URLError, urllib2.HTTPError): 26 | return False 27 | -------------------------------------------------------------------------------- /py4web/utils/auth_plugins/oauth2facebook.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | from . import OAuth2 4 | 5 | 6 | class OAuth2Facebook(OAuth2): 7 | name = "oauth2facebook" 8 | label = "Facebook" 9 | 10 | login_url = "https://www.facebook.com/v3.3/dialog/oauth" 11 | token_url = "https://graph.facebook.com/v3.3/oauth/access_token" 12 | userinfo_url = "https://graph.facebook.com/me?fields=id,email,first_name,last_name" 13 | revoke_url = "https://accounts.google.com/me/permissions" 14 | default_scope = None 15 | maps = { 16 | "email": "email", 17 | "sso_id": "id", 18 | "first_name": "first_name", 19 | "last_name": "last_name", 20 | } 21 | 22 | def revoke(self, token): 23 | requests.delete(self.revoke_url, headers={"Authorization": token}) 24 | -------------------------------------------------------------------------------- /py4web/utils/auth_plugins/oauth2github.py: -------------------------------------------------------------------------------- 1 | # from https://requests-oauthlib.readthedocs.io/en/latest/examples/github.html 2 | 3 | 4 | from . import OAuth2 5 | 6 | 7 | class OAuth2Github(OAuth2): 8 | name = "oauth2github" 9 | label = "Github" 10 | 11 | login_url = "https://github.com/login/oauth/authorize" 12 | token_url = "https://github.com/login/oauth/access_token" 13 | userinfo_url = "https://api.github.com/user" 14 | default_scope = None 15 | maps = { 16 | "username": "login", 17 | "email": "email", 18 | "sso_id": "url", 19 | } 20 | -------------------------------------------------------------------------------- /py4web/utils/auth_plugins/oauth2google.py: -------------------------------------------------------------------------------- 1 | from . import OAuth2 2 | 3 | 4 | class OAuth2Google(OAuth2): 5 | name = "oauth2google" 6 | label = "Google" 7 | 8 | login_url = "https://accounts.google.com/o/oauth2/v2/auth" 9 | token_url = "https://oauth2.googleapis.com/token" 10 | userinfo_url = "https://www.googleapis.com/oauth2/v3/userinfo" 11 | revoke_url = "https://accounts.google.com/o/oauth2/revoke" 12 | default_scope = "email profile" 13 | maps = { 14 | "email": "email", 15 | "sso_id": "sub", 16 | "first_name": "given_name", 17 | "last_name": "family_name", 18 | } 19 | -------------------------------------------------------------------------------- /py4web/utils/auth_plugins/oauth2okta.py: -------------------------------------------------------------------------------- 1 | from . import OAuth2 2 | 3 | 4 | class OAuth2Okta(OAuth2): 5 | name = "oauth2okta" 6 | label = "Okta" 7 | 8 | login_url = "https://XXX.okta.com/oauth2/default/v1/authorize" 9 | token_url = "https://XXX.okta.com/oauth2/default/v1/token" 10 | userinfo_url = "https://XXX.okta.com/oauth2/default/v1/revoke" 11 | revoke_url = "https://XXX.okta.com/oauth2/default/v1/userinfo" 12 | default_scope = "openid profile" 13 | maps = { 14 | "username": "sub", 15 | "email": "sub", 16 | "sso_id": "sub", 17 | } 18 | -------------------------------------------------------------------------------- /py4web/utils/auth_plugins/pam_plugin.py: -------------------------------------------------------------------------------- 1 | from .pam import authenticate 2 | 3 | 4 | class PamPlugin: 5 | name = "pam" 6 | label = "Pam" 7 | 8 | def check_credentials(self, username, password): 9 | return authenticate(username, password) 10 | -------------------------------------------------------------------------------- /py4web/utils/cors.py: -------------------------------------------------------------------------------- 1 | from py4web.core import HTTP, Fixture, request, response 2 | 3 | 4 | class CORS(Fixture): 5 | """ 6 | Fixture helper for sharing web service avoiding cross origin resource sharing problems 7 | """ 8 | 9 | def __init__(self, age=86400, origin="*", headers="*", methods="*"): 10 | Fixture.__init__(self) 11 | 12 | self.age = age 13 | self.origin = origin 14 | self.headers = headers 15 | self.methods = methods 16 | 17 | def on_request(self, context): 18 | response.headers["Access-Control-Allow-Origin"] = self.origin 19 | response.headers["Access-Control-Max-Age"] = self.age 20 | response.headers["Access-Control-Allow-Headers"] = self.headers 21 | response.headers["Access-Control-Allow-Methods"] = self.methods 22 | response.headers["Access-Control-Allow-Credentials"] = "true" 23 | if request.method == "OPTIONS": 24 | raise HTTP(200) 25 | -------------------------------------------------------------------------------- /py4web/utils/param.py: -------------------------------------------------------------------------------- 1 | class Param: 2 | """ 3 | An interface to expore predefined parameters 4 | which can be overwritten but not deleted or added 5 | Example: 6 | 7 | p = Param(a=1, b=2) 8 | p.a = 3 9 | p.b = 4 10 | print(p.a, p.b) 11 | p.c = 5 # Error 12 | """ 13 | 14 | def __init__(self, **attr): 15 | self.__dict__.update(attr) 16 | 17 | def __setattr__(self, key, value): 18 | getattr(self, key) 19 | self.__dict__[key] = value 20 | 21 | def __getitem__(self, key): 22 | return getattr(self, key) 23 | 24 | __setitem__ = __setattr__ 25 | -------------------------------------------------------------------------------- /py4web/utils/tags.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | logging.warning( 4 | "Deprecation notice: replace py4web.utils.tags with pydal.tools.tags in your code." 5 | ) 6 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /tests/templates/index.html: -------------------------------------------------------------------------------- 1 | [[for k in range(n):]][[if k>0:]],[[pass]][[=k]][[pass]]. 2 | -------------------------------------------------------------------------------- /tests/test_form.py: -------------------------------------------------------------------------------- 1 | import io 2 | import unittest 3 | import uuid 4 | 5 | from py4web import Field, Session, request, response 6 | from py4web.utils.form import Form 7 | 8 | SECRET = str(uuid.uuid4()) 9 | 10 | 11 | class FormTest(unittest.TestCase): 12 | def setUp(self): 13 | request.environ["wsgi.input"] = io.BytesIO() 14 | request.cookies.clear() 15 | response._cookies = "" 16 | 17 | def test_form(self): 18 | session = Session(secret=SECRET) 19 | session.on_request({}) 20 | table = [Field("name")] 21 | form_name = "testing_form" 22 | f = Form(table, form_name=form_name, csrf_session=session) 23 | value = f.formkey 24 | post_vars = dict(_formname=form_name, _formkey=value) 25 | self.assertTrue(f._verify_form(post_vars)) 26 | session.on_success({}) 27 | -------------------------------------------------------------------------------- /tests/test_get_error_snapshot.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | 3 | from py4web.core import get_error_snapshot 4 | 5 | 6 | class ErrorTest(unittest.TestCase): 7 | def test_get_error_snapshot(self): 8 | try: 9 | 1 / 0 10 | except Exception: 11 | snapshot = get_error_snapshot() 12 | keys = list(sorted(snapshot.keys())) 13 | self.assertEqual( 14 | keys, 15 | [ 16 | "exception_type", 17 | "exception_value", 18 | "os_environ", 19 | "platform_info", 20 | "python_version", 21 | "stackframes", 22 | "timestamp", 23 | "traceback", 24 | ], 25 | ) 26 | -------------------------------------------------------------------------------- /tests/test_json.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | import fractions 3 | import json 4 | import unittest 5 | 6 | from py4web.core import dumps, objectify 7 | 8 | 9 | class TestJson(unittest.TestCase): 10 | def test_objectify(self): 11 | """Check if we can serialize objects, generators, and dates""" 12 | 13 | class A: 14 | def __init__(self, x): 15 | self.x = x 16 | 17 | def f(n): 18 | for k in range(n): 19 | yield k + 1 20 | 21 | b = { 22 | "numbers": f(3), 23 | "aaa": [A(k) for k in range(3)], 24 | "date": datetime.date(2018, 12, 31), 25 | } 26 | c = dumps(b) 27 | d = { 28 | "numbers": [1, 2, 3], 29 | "aaa": [ 30 | {"__class__": "A", "x": 0}, 31 | {"__class__": "A", "x": 1}, 32 | {"__class__": "A", "x": 2}, 33 | ], 34 | "date": "2018-12-31", 35 | } 36 | self.assertEqual(json.loads(c), d) 37 | 38 | self.assertEqual(objectify(1), 1) 39 | self.assertEqual(objectify(fractions.Fraction(3, 2)), 1.5) 40 | self.assertEqual(objectify("hello"), "hello") 41 | -------------------------------------------------------------------------------- /tests/test_main.py: -------------------------------------------------------------------------------- 1 | import os 2 | import signal 3 | import tempfile 4 | import unittest 5 | 6 | from click.testing import CliRunner 7 | 8 | from py4web.core import cli 9 | 10 | 11 | def run_cli(): 12 | dirpath = tempfile.mkdtemp() 13 | dir = os.path.join(dirpath, "apps") 14 | runner = CliRunner() 15 | 16 | testargs = ["setup", dir] 17 | res = runner.invoke(cli, testargs, input="y") 18 | if res.exception: 19 | raise res.exception 20 | 21 | testargs = ["run", "-d", "demo", dir] 22 | res = runner.invoke(cli, testargs) 23 | if res.exception: 24 | raise res.exception 25 | 26 | 27 | class MainTest(unittest.TestCase): 28 | def test_main(self): 29 | def handler(signum, frame): 30 | raise KeyboardInterrupt 31 | 32 | signal.signal(signal.SIGALRM, handler) 33 | signal.alarm(10) 34 | try: 35 | run_cli() 36 | except KeyboardInterrupt: 37 | pass 38 | -------------------------------------------------------------------------------- /tests/test_tags.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | 3 | from pydal import DAL, Field 4 | from pydal.tools.tags import Tags 5 | 6 | 7 | class TestTags(unittest.TestCase): 8 | def test_tags(self): 9 | db = DAL("sqlite:memory") 10 | db.define_table("thing", Field("name")) 11 | properties = Tags(db.thing) 12 | id1 = db.thing.insert(name="chair") 13 | id2 = db.thing.insert(name="table") 14 | properties.add(id1, "color/red") 15 | properties.add(id1, "style/modern") 16 | properties.add(id2, "color/green") 17 | properties.add(id2, "material/wood") 18 | 19 | self.assertTrue(properties.get(id1), ["color/red", "style/modern"]) 20 | self.assertTrue(properties.get(id2), ["color/green", "material/wood"]) 21 | 22 | rows = db(properties.find(["style/modern"])).select() 23 | self.assertTrue(rows.first().id, id1) 24 | 25 | rows = db(properties.find(["material/wood"])).select() 26 | self.assertTrue(rows.first().id, id1) 27 | 28 | rows = db(properties.find(["color"])).select() 29 | self.assertTrue(len(rows), 2) 30 | -------------------------------------------------------------------------------- /tests/test_template.py: -------------------------------------------------------------------------------- 1 | import os 2 | import unittest 3 | 4 | from py4web.core import Template 5 | 6 | PATH = os.path.join(os.path.dirname(__file__), "templates") 7 | 8 | 9 | class TemplateTest(unittest.TestCase): 10 | def test_template(self): 11 | t = Template("index.html", path=PATH) 12 | context = dict(output=dict(n=3), template_inject={}) 13 | t.on_success(context) 14 | output = context["output"] 15 | self.assertEqual(output, "0,1,2.\n") 16 | -------------------------------------------------------------------------------- /tests/test_url.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | 3 | from py4web import URL, request 4 | 5 | 6 | class TestURL(unittest.TestCase): 7 | def test_url(self): 8 | request.app_name = "_default" 9 | self.assertEqual(URL("index"), "/index") 10 | request.app_name = "app" 11 | self.assertEqual(URL("index"), "/app/index") 12 | self.assertEqual(URL("a", "b", vars=dict(x=1), hash="y"), "/app/a/b?x=1#y") 13 | 14 | 15 | if __name__ == "__main__": 16 | unittest.main() 17 | --------------------------------------------------------------------------------