{ "info": { "author": "Micha\u0142 G\u00f3ral", "author_email": "dev@mgoral.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Web Environment", "Framework :: Flask", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Natural Language :: English", "Operating System :: POSIX", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3 :: Only", "Topic :: Internet :: WWW/HTTP :: WSGI :: Application", "Topic :: Utilities" ], "description": "TWWeb is `Taskwarrior's `__ web interface.\n\nIt's aimed to be run on a internet-facing web server by a single user (it\ncurrently supports only a single registered user and a single taskrc). It\nincludes mobile-first responsive design and\n`PWA `__.\n\nScreenshots\n===========\n\n.. image:: docs/img/login.png\n :width: 400\n :alt: Login screen\n\n.. image:: docs/img/task_list.png\n :width: 400\n :alt: List of tasks\n\n.. image:: docs/img/task_boxes.png\n :width: 400\n :alt: Alternate view for task list\n\n.. image:: docs/img/new_task.png\n :width: 400\n :alt: New task screen\n\n\nQuick test\n==========\n\nYou can quickly check if TWWeb suits your needs by running a development server\nlocally on your computer.\n\n::\n\n $ tox -e dev\n\nAfter running this command TWWeb will be accessible on ``localhost:5000``. You\ncan change the port on which development server listens this way:\n\n::\n\n $ tox -e dev -- --port=3333\n\nInstallation with Docker\n========================\n\nTWWeb provides a Docker image. You can quickly build a container and run an\nimage like that:\n\n::\n\n # docker build . -t twweb\n # docker run -p 5456:5456 twweb\n\nAfter that you should be able to open TWWeb in your browser on address\n``localhost:5456``. Image preserves all data and configuration inside ``/data``\ndirectory, so it's preferable to mount it as a volume:\n\n::\n\n # docker run -v data:/data -p 5456:5456 twweb\n\nDocker image will pre-populate ``/data`` with TWWeb's settings as long as\nconfiguration file is not found. Other settings (uwsgi configuration and\ntaskrc) won't be pre-populated when ``/data`` is mounted as a host directory.\n\nYou can change settings before the first run with the following environment\nvariables (listed together with their default values):\n\n- ``TWWEB_SETTINGS`` [/data/twweb.cfg]: path to TWWeb's configuration file.\n- ``TWW_CFG_SECRET`` [empty]: TWWeb's secret key used for encryption. If this is\n empty, image will generate a random secret on first run. Leave it empty in\n most cases.\n- ``TWW_CFG_PIN`` [twweb]: PIN used for registration of the first user. You\n probably should change it\n- ``TWW_CFG_DB_ENGINE`` [sqlite]\n- ``TWW_CFG_DB_HOST`` [/data/twweb.db]\n- ``TWW_CFG_TW_TASKRC`` [/data/taskrc]\n\nExample:\n\n::\n\n # docker run -v data:/data -p 5456:5456 \\\n -e TWW_CFG_SECRET=extraSecret1122 \\\n -e TWW_CFG_PIN=supersecret \\\n twweb\n\nYou can also build and run the image via a docker-compose.\n\nManual Installation\n===================\n\nTo install TWWeb you'll need a web server able to run Python applications.\nYou'll also need a database, but sqlite should be fine as TWWeb doesn't store a\nlot. Obviously you'll also need a working Taskwarrior.\n\nWe'll install all required components inside a virtualenv. Before you start, you\nshould select and create a directory in which TWWeb will be placed. For now\nwe'll assume ``/var/www/example.com/twweb``, where \"example.com\" part is\ntypically replaced with a name of your domain.\n\n::\n\n $ sudo mkdir -p /var/www/example.com/twweb\n $ sudo chown $USER:www-data /var/www/example.com/twweb\n $ chmod 775 /var/www/example.com/twweb\n $ cd /var/www/example.com/twweb\n\nAbove commands create and set appropriate permissions for TWWeb's directory.\nWhen following this installation method, TWWeb itself will need write\npermissions in this directory so that's why we change the group permission to\n``rwx``.\n\nTaskwarrior configuration\n-------------------------\n\nFor Taskwarrior, choose the most appropriate installation method for your\nserver. Keep in mind that you'll need a ``task`` executable which will be\navailable in ``$PATH`` of a user which will run TWWeb (typically ``www-data``).\n\nFor example, for Debian-based distributions the following command should do the\ntrick:\n\n::\n\n $ sudo apt install task\n\nNow create a separate taskrc and task directory in which Taskwarrior will store\nits data:\n\n::\n\n $ mkdir -m 775 task && chown $USER:www-data task\n $ echo \"data.location=`pwd`/task\" > taskrc\n\nIf you want to use synchronization with Task Server, you can place your\ncertificates in this directory and configure it inside a newly created\n``taskrc`` file.\n\nInstallation with uWSGI\n-----------------------\n\nNow we'll install TWWeb and uWSGI inside a new virtualenv:\n\n::\n\n $ virtualenv -p python3 venv\n $ venv/bin/pip install twweb uwsgi\n $ inst=`find venv -name twweb -type d`\n\nThe last command saves the path to the directory in which TWWeb package is\nlocated. It's not strictly required, but will become handy later. Typically it\nwill be found in a directory like ``venv/lib/python3.5/site-packages/twweb``.\n\nInside ``utils`` directory in Git repository there are various example\nconfiguration files. One of them is ``twweb-uwsgi.ini`` which is a configuration\nfor uwsgi. You can edit it to your likings, but the original one should work\nfine as well. Copy it to your current directory.\n\nNow we'll create TWWeb's configuration file, named ``twweb.cfg``. We'll add a\ncustom ``SECRET_KEY`` and ``PIN`` to it (*VERY IMPORTANT*). We'll also point\nsqlite database to our directory and taskrc to the previously created one:\n\n::\n\n SECRET_KEY = 'this should be secret and complex'\n PIN = 'additional password used for first register'\n\n DB_ENGINE = 'sqlite'\n DB_HOST = '/var/www/example.com/twweb/twweb.db'\n\n TW_TASKRC = '/var/www/example.com/twweb/taskrc'\n\nYou have to point to it via ``TWWEB_SETTINGS`` environment variable, for example\nthis way:\n\n::\n\n $ export TWWEB_SETTINGS=`pwd`/twweb.cfg\n\nAnd that's it! You can run TWWeb with ``venv/bin/uwsgi --ini twweb-uwsgi.ini``.\nLogs are stored inside ``/var/log/uwsgi/twweb.log``.\n\nNow you'll have to configure your web server (e.g. Apache or Nginx) to forward\nall requests to your uwsgi app. For example for Nginx you can add something like\nthat:\n\n::\n\n location /update {\n include uwsgi_params;\n uwsgi_pass unix:/run/uwsgi/twweb.socket\n }\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "GPLv3+", "maintainer": "", "maintainer_email": "", "name": "twweb", "package_url": "https://pypi.org/project/twweb/", "platform": "linux", "project_url": "https://pypi.org/project/twweb/", "project_urls": null, "release_url": "https://pypi.org/project/twweb/0.6.1/", "requires_dist": [ "Flask (==1.0.2)", "flask-login (==0.4.1)", "flask-sqlalchemy (==2.3.1)", "flask-wtf (==0.14.2)", "passlib (==1.7.1)", "taskw (==1.2.0)" ], "requires_python": "", "summary": "Taskwarrior Web View", "version": "0.6.1" }, "last_serial": 4275641, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "6c3f95dad41c0db080ea48bc57e1d62d", "sha256": "2f9189242a03b39eeb6e35ab0a5e3071a861ca1f9380dbe8332b916d85fb585a" }, "downloads": -1, "filename": "twweb-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6c3f95dad41c0db080ea48bc57e1d62d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17342, "upload_time": "2018-05-31T10:42:24", "url": "https://files.pythonhosted.org/packages/d7/96/3e13b186617b3abd98b534755f99a4596873587f1e831b7e2e09f2c57dfe/twweb-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "baba98dfe53afa6df1886064daf6884d", "sha256": "965a579d6e8ebe159502bf0dc0ec19858e05ad4a760ad1adb0efb8fe747fac74" }, "downloads": -1, "filename": "twweb-0.1.0.tar.gz", "has_sig": false, "md5_digest": "baba98dfe53afa6df1886064daf6884d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27813, "upload_time": "2018-05-31T10:42:25", "url": "https://files.pythonhosted.org/packages/73/bb/3de57a9aee1f85fffbe5a6affa9cc6a90eed6e4b94587cf91b37277ac358/twweb-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "07b6c4289d1c266a48024ed7891a9a53", "sha256": "bcd24c72a073eba267aaeb9fe3fe595426ecf6d3e297a0763272580bf25f11ac" }, "downloads": -1, "filename": "twweb-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "07b6c4289d1c266a48024ed7891a9a53", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 25661, "upload_time": "2018-05-31T11:13:39", "url": "https://files.pythonhosted.org/packages/da/d4/9766e21404654625cae9338252cb6b42006a51dbbcde2780ea8cdddd8eeb/twweb-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5fb261d4ec2d649a67792d81cab528f6", "sha256": "1d5d3ce42de0fad9b365ff77e330703306a061564ae8a5d26c71f2646e9e28f1" }, "downloads": -1, "filename": "twweb-0.1.1.tar.gz", "has_sig": false, "md5_digest": "5fb261d4ec2d649a67792d81cab528f6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27963, "upload_time": "2018-05-31T11:13:41", "url": "https://files.pythonhosted.org/packages/81/aa/12c3f652e40fd0ecbb021475517061e87dcf373b0f2f6dcbda6abfdb25ef/twweb-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "f0ede43ab864b8c05991c73b711c2d55", "sha256": "d0d6ea974ecd904746a5499182903e0d42c5a079960c95e67576e2976f6006c6" }, "downloads": -1, "filename": "twweb-0.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "f0ede43ab864b8c05991c73b711c2d55", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 28913, "upload_time": "2018-05-31T21:53:09", "url": "https://files.pythonhosted.org/packages/36/19/128394705c51043f561f325bca4a9ab983bec6c2129bdeab93d847ed51fe/twweb-0.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "115575a17911587a94714d54f0586024", "sha256": "ef14d6322d497b6228eaf0552b548ff7092f86ba94120226f62dae659bdea8ad" }, "downloads": -1, "filename": "twweb-0.1.2.tar.gz", "has_sig": false, "md5_digest": "115575a17911587a94714d54f0586024", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32817, "upload_time": "2018-05-31T21:53:11", "url": "https://files.pythonhosted.org/packages/e6/89/5924937e993d1e8309483753724f82d733e046ae6671025ff6a4fc93ed77/twweb-0.1.2.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "e664338aec90afc8ced801ac5ace1cdf", "sha256": "9c01a6d4562d98bfafbae276a2265c3332c50f81a00ca16dc5452e686dbde5f8" }, "downloads": -1, "filename": "twweb-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e664338aec90afc8ced801ac5ace1cdf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31809, "upload_time": "2018-06-01T18:47:50", "url": "https://files.pythonhosted.org/packages/eb/0e/1b1157a261eb08bf1506a28f21ea79d8b6a887be2ccf499ca1d34c123789/twweb-0.2.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "15ce70880ec00a0ad6fd00561993e860", "sha256": "f41068657ac7b827aa58889a2cd8b20a89debc85f6b3308f221f7fc021336c74" }, "downloads": -1, "filename": "twweb-0.2.1.tar.gz", "has_sig": false, "md5_digest": "15ce70880ec00a0ad6fd00561993e860", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35022, "upload_time": "2018-06-01T18:47:51", "url": "https://files.pythonhosted.org/packages/d7/91/55e2d636598d7a7b119f57b3b979a508090733ac287903f5b04f49205355/twweb-0.2.1.tar.gz" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "839605f6f0074518be0bfc932c0b3f6e", "sha256": "f51a40209892bbfe60c81372fb28f9214e2acf4cdb8b4b4f8bc4fce5701dacbd" }, "downloads": -1, "filename": "twweb-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "839605f6f0074518be0bfc932c0b3f6e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 36072, "upload_time": "2018-06-01T20:20:25", "url": "https://files.pythonhosted.org/packages/c4/15/77957b9ac2d7e54197e3ee96142e0deb16f9732d2c81095bd43b3a5c8c91/twweb-0.2.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cd21c1ebcf827c2b6820fb81bfd2c35d", "sha256": "d35e1101abfe9d0cff9356c8ce66e4ccc0bcf08550a87aec7171270194292e8d" }, "downloads": -1, "filename": "twweb-0.2.2.tar.gz", "has_sig": false, "md5_digest": "cd21c1ebcf827c2b6820fb81bfd2c35d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38078, "upload_time": "2018-06-01T20:20:27", "url": "https://files.pythonhosted.org/packages/7a/2d/0b1022103d2f709e5dd788b9462ffca109f693ad3ba6f19ffe6b85d9837e/twweb-0.2.2.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "da2bbc168010cebd87cc6d7b214b6a71", "sha256": "6a4a05d99f24c5631c121debb5dbc3f4c1d891fd6409bd84a96aa8fa042ab307" }, "downloads": -1, "filename": "twweb-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "da2bbc168010cebd87cc6d7b214b6a71", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 39775, "upload_time": "2018-06-06T21:24:48", "url": "https://files.pythonhosted.org/packages/2c/1e/b00cc5e62609d43ad057726a4ecb8e08da3ae310bffc54ef6338946886f6/twweb-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "caaf5e62b77255b84a52bb8428657242", "sha256": "67537013fbf18c6a53fe43a5eb1f2e4664967a13a04ba9d73c62900f7a3eca3d" }, "downloads": -1, "filename": "twweb-0.3.0.tar.gz", "has_sig": false, "md5_digest": "caaf5e62b77255b84a52bb8428657242", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40291, "upload_time": "2018-06-06T21:24:49", "url": "https://files.pythonhosted.org/packages/38/6c/7f7ab118ffea125e5d8148848506966f0ee3a979df3ee7624369d319307a/twweb-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "034b4d4b9a2cb8106e64bd573ba725c1", "sha256": "b94ad379a778c46580c3da640b39c01a40104571403db2f9e9b3b1f46413feea" }, "downloads": -1, "filename": "twweb-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "034b4d4b9a2cb8106e64bd573ba725c1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 44571, "upload_time": "2018-06-15T22:36:01", "url": "https://files.pythonhosted.org/packages/69/66/249053c469d84d665f2218437ce918b054954439119e1d6e2144483f49aa/twweb-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c5c111aede1ed023e61cac47e4ce832a", "sha256": "e9ec0e99ef2a1c9574e21077da1af1c45e1768c8b3ccd87429d76c109e11b846" }, "downloads": -1, "filename": "twweb-0.4.0.tar.gz", "has_sig": false, "md5_digest": "c5c111aede1ed023e61cac47e4ce832a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42492, "upload_time": "2018-06-15T22:36:03", "url": "https://files.pythonhosted.org/packages/2b/fd/cb70635ab41dc16bb03e83cc9d99178dd35afdfcadc1c79268888ef5b140/twweb-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "5d53fd6e6d9c523a3c513559bcc0b912", "sha256": "8af53a5f67b8450a31c7620abbce51f0fbde006ab8cbf9002415bfcd2ea80613" }, "downloads": -1, "filename": "twweb-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "5d53fd6e6d9c523a3c513559bcc0b912", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 46310, "upload_time": "2018-06-26T19:19:46", "url": "https://files.pythonhosted.org/packages/41/1f/f243c53178ad00d1587fc4fb8870c026871b2bde8175b43197b2d696cf81/twweb-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "866439ac9782fe23f60143caf59227ae", "sha256": "eb128dc12dca68105a079eb5ecc7719ef9fe37d1aee11686776b4867f9aa21cb" }, "downloads": -1, "filename": "twweb-0.5.0.tar.gz", "has_sig": false, "md5_digest": "866439ac9782fe23f60143caf59227ae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43922, "upload_time": "2018-06-26T19:19:47", "url": "https://files.pythonhosted.org/packages/df/59/c799b824098190fac9475b5ae59904540a98ec15cdc98e008d60168a959d/twweb-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "3c68e907297ca815c6bd0469374b2301", "sha256": "c48e6d4f58713229484b1d47e2aa031338a19d61c5f4ca1a22ec8a4b8bfeaddd" }, "downloads": -1, "filename": "twweb-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "3c68e907297ca815c6bd0469374b2301", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 47312, "upload_time": "2018-09-13T07:08:52", "url": "https://files.pythonhosted.org/packages/f3/7c/d1c54c0e21de6077db56eb23021ebd102520837cfbb453b520f0024a24b0/twweb-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "437c57ac8ceb310bdcc21a85a58d4d4e", "sha256": "3286c764a67ee52dd65ffd57e76082362c5721df1ebca704e3034efe7ace15f5" }, "downloads": -1, "filename": "twweb-0.6.0.tar.gz", "has_sig": false, "md5_digest": "437c57ac8ceb310bdcc21a85a58d4d4e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 46698, "upload_time": "2018-09-13T07:08:54", "url": "https://files.pythonhosted.org/packages/21/52/96af8bb4894e6c16531533aeea2a12a3cdb8ff324d9546dfbdb5b89d4182/twweb-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "ff117c0a9c871b4d9250e2b308b9cd5a", "sha256": "b7823cb80390e03414387d4004ea6cb85498ff8d7d9cf20ae59c566e49282f00" }, "downloads": -1, "filename": "twweb-0.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ff117c0a9c871b4d9250e2b308b9cd5a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 47685, "upload_time": "2018-09-15T22:49:17", "url": "https://files.pythonhosted.org/packages/08/1a/391a521b6c042b7d94c7d6930564f633822dce37a21c37987730fe2e729d/twweb-0.6.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "98e904a5294165eff669c3b04a9ea318", "sha256": "756e00739c681aff1092cf910732e8c0e4a278958b8dc53af91bd2a8a6311d81" }, "downloads": -1, "filename": "twweb-0.6.1.tar.gz", "has_sig": false, "md5_digest": "98e904a5294165eff669c3b04a9ea318", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 164339, "upload_time": "2018-09-15T22:49:19", "url": "https://files.pythonhosted.org/packages/b9/6b/91966a92a7256a870331e3e1b3e06a2bf8f3f28a7056511985b7e82ca265/twweb-0.6.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ff117c0a9c871b4d9250e2b308b9cd5a", "sha256": "b7823cb80390e03414387d4004ea6cb85498ff8d7d9cf20ae59c566e49282f00" }, "downloads": -1, "filename": "twweb-0.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ff117c0a9c871b4d9250e2b308b9cd5a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 47685, "upload_time": "2018-09-15T22:49:17", "url": "https://files.pythonhosted.org/packages/08/1a/391a521b6c042b7d94c7d6930564f633822dce37a21c37987730fe2e729d/twweb-0.6.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "98e904a5294165eff669c3b04a9ea318", "sha256": "756e00739c681aff1092cf910732e8c0e4a278958b8dc53af91bd2a8a6311d81" }, "downloads": -1, "filename": "twweb-0.6.1.tar.gz", "has_sig": false, "md5_digest": "98e904a5294165eff669c3b04a9ea318", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 164339, "upload_time": "2018-09-15T22:49:19", "url": "https://files.pythonhosted.org/packages/b9/6b/91966a92a7256a870331e3e1b3e06a2bf8f3f28a7056511985b7e82ca265/twweb-0.6.1.tar.gz" } ] }