Simple alternative to Doodle polls and scheduling (Python 3, Django 3, JavaScript)

Overview

What is jawanndenn?

Screenshot of poll creation in jawanndenn

jawanndenn is a simple web application to schedule meetings and run polls, a libre alternative to Doodle. It is using the following technology:

jawanndenn is libre software developed by Sebastian Pipping. The server code is licensed under the GNU Affero GPL license version 3 or later whereas the client code is licensed under the GNU GPL license version 3 or later.

Please report bugs and let me know if you like it.

Poll Setup Format

The textarea titled "Setup (JSON)" uses a simple JSON-based format that knows the following keys:

  • equal_width — a bool to control whether all options are pumped up to the same width (true or false) to counter potential voter bias
  • lifetime — duration after which this poll will be deleted; can be "week" or "month"; an enum-like string
  • options — a list of strings, one for each option; supports Markdown-like syntax for: bold, italic, inline code
  • title — the title or headline of the poll to run; supports Markdown-like syntax for: bold, italic, inline code

Installation

To install the latest release without cloning the Git repository:

# pip3 install jawanndenn --user

To install from a Git clone:

# ./setup.py install --user

Deployment with docker-compose

Create a simple file .env like this one:

JAWANNDENN_POSTGRES_NAME=jawanndenn
JAWANNDENN_POSTGRES_USER=jawanndenn
JAWANNDENN_POSTGRES_PASSWORD=dEb2PIcinemA8poH
JAWANNDENN_SECRET_KEY=606ea88f183a27919d5c27ec7f948906d23fdd7821684eb59e8bcf7377e3853b

Make sure to use your own values!

You can then build and run a docker image using docker-compose up --build.

PostgreSQL data is saved to ~/.jawanndenn-docker-pgdata/ on the host system. The app is served on localhost:54080.

Command line usage

When installed, invocation is as simple as

# jawanndenn

During development, you may want to run jawanndenn from the Git clone using

# PYTHONPATH=. python3 -m jawanndenn --debug

Currently supported arguments are:

# jawanndenn --help
usage: jawanndenn [-h] [--debug] [--host HOST] [--port PORT]
                  [--url-prefix PATH] [--database-sqlite3 FILE]
                  [--django-secret-key-file FILE] [--max-polls COUNT]
                  [--max-votes-per-poll COUNT] [--dumpdata]
                  [--loaddata FILE.json]

optional arguments:
  -h, --help            show this help message and exit
  --debug               Enable debug mode (default: disabled)
  --host HOST           Hostname or IP address to listen at (default:
                        127.0.0.1)
  --port PORT           Port to listen at (default: 8080)
  --url-prefix PATH     Path to prepend to URLs (default: "")
  --database-sqlite3 FILE
                        File to write the database to (default:
                        ~/jawanndenn.sqlite3)
  --django-secret-key-file FILE
                        File to use for Django secret key data (default:
                        ~/jawanndenn.secret_key)

limit configuration:
  --max-polls COUNT     Maximum number of polls total (default: 1000)
  --max-votes-per-poll COUNT
                        Maximum number of votes per poll (default: 40)

data import/export arguments:
  --dumpdata            Dump a JSON export of the database to standard output,
                        then quit.
  --loaddata FILE.json  Load a JSON export of the database from FILE.json,
                        then quit.

Migrating data from jawanndenn 1.x to 2.x

Migration takes four steps:

  1. Update to the latest version of jawanndenn 1.x, e.g. by running: pip2 install --upgrade 'jawanndenn<2'; the JSON data export was first introduced with release 1.6.3.
  2. Export existing polls:
    1. If you're using the commend line app: python2 -m jawanndenn --dumpdata > dump.json
    2. If you're using docker-compose: docker-compose run -T jawanndenn --database-pickle /data/polls.pickle --dumpdata > dump.json
  3. Deploy latest jawanndenn 2.x somewhere (as described above) or just pip3 install 'jawanndenn>=2' it somewhere
  4. Import the JSON dump created in step (2):
    1. If you're using the commend line app: python3 -m jawanndenn --loaddata dump.json
    2. If you're using docker-compose: docker-compose run -T jawanndenn sh -c 'cat > /tmp/dump.json && DJANGO_SETTINGS_MODULE=jawanndenn.settings python3 -m django loaddata /tmp/dump.json' < dump.json

Goals

Please check out the list of upcoming features.

Non-goals

  • Use of heavy frontend frameworks: building blocks only
  • Read availability from calendars

Thanks

Special thanks to Arne Maier (@KordonDev) for reporting an XSS vulnerability, responsibly.

Comments
  • Domain Subfolder

    Domain Subfolder

    Hi,

    I have installed jawanndenn under docker. As each web application, I access it throw an nginx web proxy (running on another docker container). There is SSL till the nginx proxy, then there is no SSL anymore.

    All web application have their specific unique subfolder. So, I want to access the jawanndenn application via the following URL: https://mydomain.com/jawanndenn. For other applications, I used to change the server (nginx, apache, tomcat, etc) root folder into the application container. Since jawanndenn is using bottle python which I am not familiar with, I have difficulties to configure the root folder. The application is not working as excepted since it cannot load other resources such as css and js files: see screenshot with a black square to hide my domain.

    image

    According the bottle documentation, it is possible to define a route somewhere inside the application. Is it really possible? If yes, where do I need to add the statement? I can edit the code when creating the docker image, it is fine for me...

    Thank you

    enhancement question 
    opened by JayBeeDe 7
  • Detailed Installation Instructions

    Detailed Installation Instructions

    Hi,

    there are a few environment variables in the docker-compose file which need to be filled. I can not find an explanation in the documentation, for example:

    JAWANNDENN_SENTRY_DSN JAWANNDENN_ALLOWED_HOSTS JAWANNDENN_URL_PREFIX JAWANNDENN_DEBUG

    Furthermore the cron container is not mentioned anywhere in the documentation.

    Thanks!

    opened by floari 4
  • Scroll?

    Scroll?

    The current https://jawanndenn.de/poll/858dd89c4f336eb4469391068e00ca363119204ff0cc58d194668d6e15aae4d7

    Doesn't scroll and there is no chance to add answers

    duplicate 
    opened by cquiroga95-zz 3
  • docker-compose installation results in 'ImportError: No module named main'

    docker-compose installation results in 'ImportError: No module named main'

    After trying for an hour I would like to ask for your help here: I was trying to install jawanndenn via docker-compose. Because of a proxy I had to change my docker-compose.yml like following:

    version: '2'
    
    services:
      jawanndenn:
        restart: always
        networks:
          - proxy
        build: .
        volumes:
          - '/data/docker/jawanndenn:/data'
        environment:
          - 'VIRTUAL_HOST=jawanndenn.mydomain.com'
          - 'LETSENCRYPT_HOST=jawanndenn.mydomain.com'
          - '[email protected]'
          - 'LETSENCRYPT_TEST=true'
    
    networks:
      proxy:
        external:
          name: proxy_proxy
    

    Running dc up -d && dc logs -f --tail=100 always gives me following log messages:

    Creating jawanndenn_jawanndenn_1
    Attaching to jawanndenn_jawanndenn_1
    jawanndenn_1  | Traceback (most recent call last):
    jawanndenn_1  |   File "/root/.local/bin/jawanndenn", line 11, in <module>
    jawanndenn_1  |     load_entry_point('jawanndenn==1.5', 'console_scripts', 'jawanndenn')()
    jawanndenn_1  |   File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point
    jawanndenn_1  |     return get_distribution(dist).load_entry_point(group, name)
    jawanndenn_1  |   File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2691, in load_entry_point
    jawanndenn_1  |     return ep.load()
    jawanndenn_1  |   File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2322, in load
    jawanndenn_1  |     return self.resolve()
    jawanndenn_1  |   File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2328, in resolve
    jawanndenn_1  |     module = __import__(self.module_name, fromlist=['__name__'], level=0)
    jawanndenn_1  | ImportError: No module named main
    jawanndenn_1  | Traceback (most recent call last):
    jawanndenn_1  |   File "/root/.local/bin/jawanndenn", line 11, in <module>
    jawanndenn_1  |     load_entry_point('jawanndenn==1.5', 'console_scripts', 'jawanndenn')()
    jawanndenn_1  |   File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 480, in load_entry_point
    jawanndenn_1  |     return get_distribution(dist).load_entry_point(group, name)
    jawanndenn_1  |   File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2691, in load_entry_point
    jawanndenn_1  |     return ep.load()
    jawanndenn_1  |   File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2322, in load
    jawanndenn_1  |     return self.resolve()
    jawanndenn_1  |   File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py", line 2328, in resolve
    jawanndenn_1  |     module = __import__(self.module_name, fromlist=['__name__'], level=0)
    jawanndenn_1  | ImportError: No module named main
    jawanndenn_jawanndenn_1 exited with code 1
    

    Am I doing something wrong?

    opened by ghost 3
  • requirements(deps): bump sqlparse from 0.4.2 to 0.4.3

    requirements(deps): bump sqlparse from 0.4.2 to 0.4.3

    Bumps sqlparse from 0.4.2 to 0.4.3.

    Changelog

    Sourced from sqlparse's changelog.

    Release 0.4.3 (Sep 23, 2022)

    Enhancements

    • Add support for DIV operator (pr664, by chezou).
    • Add support for additional SPARK keywords (pr643, by mrmasterplan).
    • Avoid tokens copy (pr622, by living180).
    • Add REGEXP as a comparision (pr647, by PeterSandwich).
    • Add DISTINCTROW keyword for MS Access (issue677).
    • Improve parsing of CREATE TABLE AS SELECT (pr662, by chezou).

    Bug Fixes

    • Fix spelling of INDICATOR keyword (pr653, by ptld).
    • Fix formatting error in EXTRACT function (issue562, issue670, pr676, by ecederstrand).
    • Fix bad parsing of create table statements that use lower case (issue217, pr642, by mrmasterplan).
    • Handle backtick as valid quote char (issue628, pr629, by codenamelxl).
    • Allow any unicode character as valid identifier name (issue641).

    Other

    • Update github actions to test on Python 3.10 as well (pr661, by cclaus).
    Commits
    • fba15d3 Bump version.
    • b72a8ff Allow any unicode character as identifier name (fixes #641).
    • 07a2e81 Add docstring and comments.
    • 4235eb8 Add tests for utils.remove_quotes.
    • e269881 Update Changelog and authors.
    • c1a597e add backtick to remove_quotes character list
    • 893d7b2 Update CHANGELOG.
    • 403de6f Fixed bad parsing of create table statements that use lower case
    • a172486 Update Changelog.
    • 7de1999 CREATE TABLE tbl AS SELECT should return get_alias() for its column
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    enhancement dependencies 
    opened by dependabot[bot] 2
  • requirements(deps): bump faker from 14.0.0 to 14.1.0

    requirements(deps): bump faker from 14.0.0 to 14.1.0

    Bumps faker from 14.0.0 to 14.1.0.

    Release notes

    Sourced from faker's releases.

    Release v14.1.0

    See CHANGELOG.md.

    Changelog

    Sourced from faker's changelog.

    v14.1.0 - 2022-08-17

    • Add providers for bn_BD: address, automotive, bank, color, company, currency, date_time, geo, internet, job, person, phone_number and ssn. Thanks @​saanpritom.
    Commits
    • e0c2d8f Bump version: 14.0.0 → 14.1.0
    • ce60a34 :pencil: update CHANGELOG.md
    • 598b31a Add providers for bn_BD: address, automotive, bank, color, company, currenc...
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    enhancement dependencies 
    opened by dependabot[bot] 2
  • requirements(deps): bump tomli from 1.2.3 to 2.0.0

    requirements(deps): bump tomli from 1.2.3 to 2.0.0

    Bumps tomli from 1.2.3 to 2.0.0.

    Changelog

    Sourced from tomli's changelog.

    1.2.3

    • Fixed
      • Backport: Allow lower case "t" and "z" in datetimes

    2.0.0

    • Removed
      • Python 3.6 support
      • Support for text file objects as load input. Use binary file objects instead.
      • First argument of load and loads can no longer be passed by keyword.
    • Fixed
      • Allow lower case "t" and "z" in datetimes
    • Improved
      • Raise an error when dotted keys define values outside the "current table". Technically speaking TOML v1.0.0 does allow such assignments but that isn't intended by specification writers, and will change in a future specification version (see the pull request).

    1.2.2

    • Fixed
      • Illegal characters in error messages were surrounded by two pairs of quotation marks
    • Improved
      • TOMLDecodeError.__module__ is now the public import path (tomli) instead of private import path (tomli._parser)
      • Eliminated an import cycle when typing.TYPE_CHECKING is True. This allows sphinx-autodoc-typehints to resolve type annotations.

    1.2.1

    • Fixed
      • Raise an error if a carriage return (without a following line feed) is found in a multi-line basic string
    • Type annotations
      • Type annotate load input as typing.BinaryIO only to discourage use of deprecated text file objects.
    • Packaging
      • Remove legacy setup.py from PyPI source distribution. If you're a packager and absolutely need this file, please create an issue.

    1.2.0

    • Deprecated
      • Text file objects as input to load. Binary file objects should be used instead to avoid opening a TOML file with universal newlines or with an encoding other than UTF-8.

    1.1.0

    • Added
      • load can now take a binary file object

    1.0.4

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    enhancement dependencies 
    opened by dependabot[bot] 2
  • Where can ALLOWED_HOSTS be changed for testing?

    Where can ALLOWED_HOSTS be changed for testing?

    I am trying out jawanndenn on own server, but I cannot quite get it to work.

    I set up jawanndenn inside a virtualenv, where it was installed with pip3 install jawanndenn; then, I try to test it with:

    $ JAWANNDENN_ALLOWED_HOSTS="mysite.com" jawanndenn --host 0.0.0.0 --port 6789
    

    Then, when I fire up the browser at mysite.com:6789, I get Bad Request (400) in the browser, and the server terminal reports:

    Invalid HTTP_HOST header: 'mysite.com:6789'. You may need to add 'mysite.com' to ALLOWED_HOSTS (['0.0.0.0', '127.0.0.1', '0.0.0.0', 'localhost']).
    XX.YY.ZZ.WW- - [30/Nov/2021:11:37:59 +0000] "GET / HTTP/1.1" 400 143 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0"
    

    Eh, however, I added it here in ALLOWED_HOSTS already:

    jawanndenn/lib/python3.8/site-packages/jawanndenn/settings.py:    'mysite.com',
    jawanndenn/lib/python3.8/site-packages/django/conf/global_settings.py:ALLOWED_HOSTS = [ "mysite.com" ]
    

    ... and I still get the above message.

    Any suggestions how can I get this running for testing?

    question 
    opened by sdbbs 2
  • requirements(deps): bump packaging from 21.0 to 21.2

    requirements(deps): bump packaging from 21.0 to 21.2

    Bumps packaging from 21.0 to 21.2.

    Release notes

    Sourced from packaging's releases.

    21.2

    • Update changelog entry for 21.1

    Full Changelog: https://github.com/pypa/packaging/compare/21.1...21.2

    21.1

    What's Changed

    New Contributors

    Full Changelog: https://github.com/pypa/packaging/compare/21.0...21.1

    Changelog

    Sourced from packaging's changelog.

    21.2 - 2021-10-29

    
    * Update documentation entry for 21.1.
    

    21.1 - 2021-10-29

    • Update pin to pyparsing to exclude 3.0.0.
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    enhancement dependencies 
    opened by dependabot[bot] 2
  • use valid value for X-Frame-Options

    use valid value for X-Frame-Options

    SAMESITE is not a valid value for the X-Frame-Options header.

    This is also causing an error in the Firefox developer console:

    Invalid X-Frame-Options: “SAMESITE” header from “https://jawanndenn.de/static/3rdparty/github-buttons-4.0.1/d…-btn.html?user=hartwork&repo=jawanndenn&type=star&count=true” loaded into “https://jawanndenn.de/”.
    

    The intention was probably to set it to sameorigin, see: https://developer.mozilla.org/de/docs/Web/HTTP/Headers/X-Frame-Options

    bug 
    opened by hannob 2
  • Image now needs no root privilege

    Image now needs no root privilege

    Hi, I've change the dockerfile so runs with a non-root user. To resolve issue https://github.com/hartwork/jawanndenn/issues/37 and to help myself. Thanks for your work.

    opened by flusile 2
  • "docker-compose up --build" fails with docker-compose 2.x.x (but not 1.x.x)

    [[email protected] jawanndenn]# docker-compose up --build
    WARN[0000] The "JAWANNDENN_DEBUG" variable is not set. Defaulting to a blank string.
    WARN[0000] The "JAWANNDENN_URL_PREFIX" variable is not set. Defaulting to a blank string.
    WARN[0000] The "JAWANNDENN_SENTRY_DSN" variable is not set. Defaulting to a blank string.
    WARN[0000] The "JAWANNDENN_ALLOWED_HOSTS" variable is not set. Defaulting to a blank string.
    WARN[0000] The "JAWANNDENN_SENTRY_DSN" variable is not set. Defaulting to a blank string.
    WARN[0000] The "JAWANNDENN_URL_PREFIX" variable is not set. Defaulting to a blank string.
    WARN[0000] The "JAWANNDENN_ALLOWED_HOSTS" variable is not set. Defaulting to a blank string.
    WARN[0000] The "JAWANNDENN_DEBUG" variable is not set. Defaulting to a blank string.
    WARN[0000] The "JAWANNDENN_SENTRY_DSN" variable is not set. Defaulting to a blank string.
    [+] Running 0/3
     ⠿ postgres Error                                                                                                                                        1.4s
     ⠿ redis Error                                                                                                                                           1.4s
     ⠿ cron Error                                                                                                                                            1.4s
    Error response from daemon: pull access denied for jawanndenn_jawanndenn, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
    [[email protected] jawanndenn]#
    
    question 
    opened by beppe9000 2
  • Footer should include an possibility to insert an impressum

    Footer should include an possibility to insert an impressum

    Great small piece of software. Works like a charm. I miss a possibility to insert a Impressum which is obligatory for public web services in Germany in my opinion all over the in the EU

    How can I insert such a Impressum or a link to a Impressum?

    opened by elearningdienst 1
  • Add ternary choice

    Add ternary choice "maybe/dunno"

    Really cool project, I feeled desperate to find a nice meetings scheduler!

    Would be nice to have a three possible vote values: yes, no but also dunno/possible if really needed.

    Doodle provides that (as well as framadate), I think that's somehow the only choice you can answer sometimes.

    enhancement 
    opened by bagage 4
Releases(2.4.5)
Full featured redis cache backend for Django.

Redis cache backend for Django This is a Jazzband project. By contributing you agree to abide by the Contributor Code of Conduct and follow the guidel

Jazzband 2.5k Jan 03, 2023
Django React Project Setup

Django-React-Project-Setup INSTALLATION: python -m pip install drps USAGE: in your cmd: python -m drps Starting fullstack project with Django and Reac

Ghazi Zabalawi 7 Feb 06, 2022
Let AngularJS play well with Django

django-angular Let Django play well with AngularJS What does it offer? Add AngularJS directives to Django Forms. This allows to handle client side for

Jacob Rief 1.2k Dec 27, 2022
A ToDO Rest API using Django, PostgreSQL and Docker

This Rest API uses PostgreSQL, Docker and Django to implements a ToDo application.

Brenno Lima dos Santos 2 Jan 05, 2022
a little task queue for python

a lightweight alternative. huey is: a task queue (2019-04-01: version 2.0 released) written in python (2.7+, 3.4+) clean and simple API redis, sqlite,

Charles Leifer 4.3k Dec 29, 2022
Use minify-html, the extremely fast HTML + JS + CSS minifier, with Django.

django-minify-html Use minify-html, the extremely fast HTML + JS + CSS minifier, with Django. Requirements Python 3.8 to 3.10 supported. Django 2.2 to

Adam Johnson 60 Dec 28, 2022
📝 Sticky Notes in Django admin

django-admin-sticky-notes Share notes between superusers. Installation Install via pip: pip install django_admin_sticky_notes Put django_admin_sticky_

Dariusz Choruży 7 Oct 06, 2021
Transparently use webpack with django

Looking for maintainers This repository is unmaintained as I don't have any free time to dedicate to this effort. If you or your organisation are heav

Owais Lone 2.4k Jan 06, 2023
Use watchfiles in Django’s autoreloader.

django-watchfiles Use watchfiles in Django’s autoreloader. Requirements Python 3.7 to 3.10 supported. Django 2.2 to 4.0 supported. Installation Instal

Adam Johnson 43 Dec 14, 2022
pytest-django allows you to test your Django project/applications with the pytest testing tool.

pytest-django allows you to test your Django project/applications with the pytest testing tool.

pytest-dev 1.1k Dec 14, 2022
The little ASGI framework that shines. 🌟

✨ The little ASGI framework that shines. ✨ Documentation: https://www.starlette.io/ Community: https://discuss.encode.io/c/starlette Starlette Starlet

Encode 7.7k Dec 31, 2022
Simple Login Logout System using Django, JavaScript and ajax.

Djanog-UserAuthenticationSystem Technology Use #version Python 3.9.5 Django 3.2.7 JavaScript --- Ajax Validation --- Login and Logout Functionality, A

Bhaskar Mahor 3 Mar 26, 2022
Comprehensive Markdown plugin built for Django

Django MarkdownX Django MarkdownX is a comprehensive Markdown plugin built for Django, the renowned high-level Python web framework, with flexibility,

neutronX 738 Dec 21, 2022
A drop-in replacement for django's ImageField that provides a flexible, intuitive and easily-extensible interface for quickly creating new images from the one assigned to the field.

django-versatileimagefield A drop-in replacement for django's ImageField that provides a flexible, intuitive and easily-extensible interface for creat

Jonathan Ellenberger 490 Dec 13, 2022
🏭 An easy-to-use implementation of Creation Methods for Django, backed by Faker.

Django-fakery An easy-to-use implementation of Creation Methods (aka Object Factory) for Django, backed by Faker. django_fakery will try to guess the

Flavio Curella 93 Oct 12, 2022
Bleach is an allowed-list-based HTML sanitizing library that escapes or strips markup and attributes

Bleach Bleach is an allowed-list-based HTML sanitizing library that escapes or strips markup and attributes. Bleach can also linkify text safely, appl

Mozilla 2.5k Dec 29, 2022
A Blog Management System Built with django

Blog Management System Backend use: Django Features Enhanced Ui

Vishal Goswami 1 Dec 06, 2021
Per object permissions for Django

django-guardian django-guardian is an implementation of per object permissions [1] on top of Django's authorization backend Documentation Online docum

3.3k Jan 04, 2023
This is a repository for collecting global custom management extensions for the Django Framework.

Django Extensions Django Extensions is a collection of custom extensions for the Django Framework. Getting Started The easiest way to figure out what

Django Extensions 6k Dec 26, 2022
Sampling profiler for Python programs

py-spy: Sampling profiler for Python programs py-spy is a sampling profiler for Python programs. It lets you visualize what your Python program is spe

Ben Frederickson 9.5k Jan 01, 2023