{ "info": { "author": "Luke Hodkinson", "author_email": "luke.hodkinson@uptickhq.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python" ], "description": "# Django-CQ\n[![PyPI version](https://badge.fury.io/py/django-cq.svg)](https://badge.fury.io/py/django-cq)\n\n## Description\n\nAn attempt to implement a distributed task queue for use with Django channels.\nModelled after RQ and Celery, complex task workflows are possible, all leveraging\nthe Channels machinery.\n\n\n## Why\n\nThere are three reasons:\n\n 1. Aiming for more fault tolerant tasks. There are many occasions where information\n regarding how tests are progressing is needed to be stored persistently. For\n important tasks, this should be stored even in the case of a Redis fault, or if\n the worker goes down.\n\n 2. Prefer to leverage the same machinery as channels.\n\n 3. Would like to have a little extra functionality surrounding subtasks that didn't\n seem to be available via Celery or RQ.\n\n\n## Limitations\n\nThere are two limitations involved:\n\n * REDIS must be used as the Django cache.\n\n * `asgi_redis` must be used as the channel backend.\n\nThere is work being done to remove these restrictions.\n\n\n## Installation\n\nUse pip if you can:\n\n```bash\npip install django-cq\n```\n\nor live on the edge:\n\n```bash\npip install -e https://github.com/furious-luke/django-cq.git#egg=django-cq\n```\n\nAdd the package to your settings file:\n\n```python\nINSTALLED_APPS = [\n 'cq',\n ...\n]\n```\n\nAnd include the routing information in your channel routing list:\n\n```python\nchannel_routing = [\n include('cq.routing.channel_routing'),\n ...\n]\n```\n\nYou'll need to migrate to include the models:\n\n```bash\n./manage.py migrate\n```\n\nYou'll most likely want to create a new channel layer for your CQ\ntasks. The default layer has a short time-to-live on the channel messages,\nwhich causes slightly long running tasks to kill off any queued messages.\nUpdate your settings file to include the following:\n\n```python\nCHANNEL_LAYERS = {\n 'default': {\n ...\n },\n 'long': {\n 'BACKEND': 'asgi_redis.RedisChannelLayer',\n 'CONFIG': {\n 'hosts': [REDIS_URL],\n 'expiry': 1800,\n 'channel_capacity': {\n 'cq-tasks': 1000\n }\n },\n 'ROUTING': 'path.to.your.channels.channel_routing',\n },\n}\n\nCQ_CHANNEL_LAYER = 'long'\n```\n\nIn order to process messages sent on the \"cq-tasks\" channel a worker\nprocess needs to be launched:\n\n```\n./manage.py cq_runworker\n```\n\n\n## Tasks\n\nBasic task usage is straight forward:\n\n```python\n@task\ndef send_email(cqt, addr):\n ...\n return 'OK'\n\ntask = send_emails.delay('dummy@dummy.org')\ntask.wait()\nprint(task.result) # \"OK\"\n```\n\nHere, `cqt` is the task representation for the `send_email` task. This\ncan be used to launch subtasks, chain subsequent tasks, amongst other\nthings.\n\nTasks may also be run in serial by just calling them:\n\n```python\nresult = send_email('dummy@dummy.org')\nprint(result) # \"OK\"\n```\n\n\n## Subtasks\n\nFor more complex workflows, subtasks may be launched from within\nparent tasks:\n\n```python\n@task\ndef send_emails(cqt):\n ...\n for addr in email_addresses:\n cqt.subtask(send_email, addr)\n ...\n return 'OK'\n\ntask = send_emails.delay()\ntask.wait()\nprint(task.result) # \"OK\"\n```\n\nThe difference between a subtask and another task launched using `delay` from\nwithin a task is that the parent task of a subtask will not be marked as complete\nuntil all subtasks are also complete.\n\n```python\nfrom cq.models import Task\n\n@task\ndef parent(cqt):\n task_a.delay() # not a subtask\n cqt.subtask(task_b) # subtask\n\nparent.delay()\nparent.status == Task.STATUS_WAITING # True\n# once task_b completes\nparent.wait()\nparent.status == Task.STATUS_COMPLETE # True\n```\n\n\n## Chained Tasks\n\nTODO\n\n```python\n@task\ndef calculate_something(cqt):\n return calc_a.delay(3).chain(add_a_to_4, (4,))\n```\n\n\n## Non-atomic Tasks\n\nBy default every CQ task is atomic; no changes to the database will persist\nunless the task finishes without an exception. If you need to keep changes to\nthe database, even in the event of an error, then use the `atomic` flag:\n\n```python\n@task(atomic=False)\ndef unsafe_task(cqt):\n pass\n```\n\n\n## Logging\n\nFor longer running tasks it's useful to be able to access an ongoing log\nof the task's progress. CQ tasks have a `log` method to send logging\nmessages to both the standard Django log streams, and also cache them on\nthe running task.\n\n```python\n@task\ndef long_task(cqt):\n cqt.log('standard old log')\n cqt.log('debugging log', logging.DEBUG)\n```\n\nIf the current task is a subtask, the logs will go to the parent.\nThis way there is a central task (the top-level task) which can be used\nto monitor the progress and status of a network of sub and chained tasks.\n\n### Performance\n\nDue to the way logs are handled there can be issues with performance\nwith a lot of frequent log messages. There are two ways to prevent this.\n\nReduce the frequency of logs by setting `publish` to `False` on as many\nlog calls as you can. This will cache the logs locally and store them\non the next `publish=True` call.\n\n```python\n@task\ndef long_task(cqt):\n for ii in range(100):\n cqt.log('iteration %d' % ii, publish=False)\n cqt.log('done') # publish=True\n```\n\nSecondly, reducing the volume of logs may be accomplished by limiting the\nnumber of log lines that are kept. The `limit` option specifies this. The\nfollowing will only keep 10 of the logged iterations:\n\n```python\n@task\ndef long_task(cqt):\n for ii in range(100):\n cqt.log('iteration %d' % ii, publish=False)\n cqt.log('done', limit=10)\n```\n\n## Time-to-live\n\nTODO\n\n## Repeating Tasks\n\nCQ comes with robust repeating tasks. There are two ways to create\nrepeating tasks:\n\n 1. From the Django admin.\n\n 2. Using a data migration.\n\nFrom the admin, click into `cq` and `repeating tasks`. From there you\ncan create a new repeating task, specifying the background task to call,\nand a CRON time for repetition.\n\nTo create a repeating task from a migration, use the helper function\n`schedule_task`.\n\n```python\nfrom django.db import migrations\nfrom cq.models import schedule_task\n\nfrom myapp.tasks import a_task\n\n\ndef add_repeating(apps, scema_editor):\n RepeatingTask = apps.get_model('cq.RepeatingTask')\n schedule_task(\n RepeatingTask,\n '* * * * *',\n a_task\n )\n\n\nclass Migration(migrations.Migration):\n operations = [\n migrations.RunPython(add_repeating, reverse_code=migrations.RunPython.noop)\n ]\n```\n\n\n### Coalescing\nPending or queued instances of a coalescing task will prevent other instances of the task from running.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/uptick/django-cq", "keywords": "", "license": "BSD", "maintainer": "Uptick", "maintainer_email": "dev@uptickhq.com", "name": "django-cq", "package_url": "https://pypi.org/project/django-cq/", "platform": "", "project_url": "https://pypi.org/project/django-cq/", "project_urls": { "Homepage": "https://github.com/uptick/django-cq" }, "release_url": "https://pypi.org/project/django-cq/0.3.3/", "requires_dist": [ "setuptools", "six", "croniter", "channels (>=2.1.0)", "channels-redis (>=2.3.0)" ], "requires_python": "", "summary": "Distributed tasks for Django Channels.", "version": "0.3.3", "yanked": false, "yanked_reason": null }, "last_serial": 6010171, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "591cfad36e854c9f7441ce27988eeafd", "sha256": "064ad27de13b415613ca240d7369f1b957eb1e3bb5eaaf369f09b441825ac20b" }, "downloads": -1, "filename": "django-cq-0.1.tar.gz", "has_sig": false, "md5_digest": "591cfad36e854c9f7441ce27988eeafd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18097, "upload_time": "2016-09-30T11:25:47", "upload_time_iso_8601": "2016-09-30T11:25:47.299163Z", "url": "https://files.pythonhosted.org/packages/27/a3/057cf3caecfc23ebc7e98a62a3dc72bd28883e510d639e27c436d7c88c3f/django-cq-0.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "d16672bc5ff6c3256b835e02fac2a94e", "sha256": "b365631f7d1e51f14451f662d80455d96dd6f8a2605ac77295b02c4b7c77ecd2" }, "downloads": -1, "filename": "django-cq-0.1.1.tar.gz", "has_sig": false, "md5_digest": "d16672bc5ff6c3256b835e02fac2a94e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19519, "upload_time": "2016-09-30T11:56:08", "upload_time_iso_8601": "2016-09-30T11:56:08.993784Z", "url": "https://files.pythonhosted.org/packages/5e/cf/8f5f93aa4862b0e9f74a66aa5287c180869ebdb539d3e83eb141b8e36bdd/django-cq-0.1.1.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.10": [ { "comment_text": "", "digests": { "md5": "20a0ebc76ccd1c28e5a20bd7d995c7de", "sha256": "59d7f32bc89952374ec6f575b340d45f5e36fc3c90a6de720852a7d63c162c8a" }, "downloads": -1, "filename": "django-cq-0.1.10.tar.gz", "has_sig": false, "md5_digest": "20a0ebc76ccd1c28e5a20bd7d995c7de", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22056, "upload_time": "2016-10-27T23:16:15", "upload_time_iso_8601": "2016-10-27T23:16:15.849778Z", "url": "https://files.pythonhosted.org/packages/74/6a/1c22441dc75a2d47ea9cc9b194099e610f170bc72448d793c3c2477cd16a/django-cq-0.1.10.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.11": [ { "comment_text": "", "digests": { "md5": "03ddb85230490bcf821aac13059d3263", "sha256": "6b08f68c41f25fb98280554c177b885386f4992e7e16fc094cfd16afb1e51bf7" }, "downloads": -1, "filename": "django-cq-0.1.11.tar.gz", "has_sig": false, "md5_digest": "03ddb85230490bcf821aac13059d3263", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22130, "upload_time": "2016-11-17T23:51:29", "upload_time_iso_8601": "2016-11-17T23:51:29.477288Z", "url": "https://files.pythonhosted.org/packages/16/79/34f6c77a96d7a0f54dfb11de23729270435db34e2eed1412e329c18f4294/django-cq-0.1.11.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.12": [ { "comment_text": "", "digests": { "md5": "bc4f7fd1297f892ab4eda660ae9b5094", "sha256": "b6d2762c11fdbead8d77d506ab9ebad6978dc0cfb2c4fb52e33e2ad67985e27c" }, "downloads": -1, "filename": "django-cq-0.1.12.tar.gz", "has_sig": false, "md5_digest": "bc4f7fd1297f892ab4eda660ae9b5094", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22055, "upload_time": "2016-11-18T00:58:01", "upload_time_iso_8601": "2016-11-18T00:58:01.819295Z", "url": "https://files.pythonhosted.org/packages/55/11/dcbc72d42b0c92a12090cbb6f75b237123156ddbe322ae43fb726120b797/django-cq-0.1.12.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.13": [ { "comment_text": "", "digests": { "md5": "ce9a806e41416a0e0eb95a0d798104a4", "sha256": "62120fd074241d03742f7e1cbbd077e6b4054a144256776e4589f684c18ed83b" }, "downloads": -1, "filename": "django-cq-0.1.13.tar.gz", "has_sig": false, "md5_digest": "ce9a806e41416a0e0eb95a0d798104a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22054, "upload_time": "2016-11-18T01:18:56", "upload_time_iso_8601": "2016-11-18T01:18:56.782021Z", "url": "https://files.pythonhosted.org/packages/92/51/d3ccf992018532652357dff5a29100c449f4125c21fce6ebb3a4a8cab9c8/django-cq-0.1.13.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.14": [ { "comment_text": "", "digests": { "md5": "c20ab761ff5460e4cc12eb604d70603b", "sha256": "fb12fa861f55622b560dfa19558aa612023d05114a4038a5d17a3e9b8c7378d5" }, "downloads": -1, "filename": "django-cq-0.1.14.tar.gz", "has_sig": false, "md5_digest": "c20ab761ff5460e4cc12eb604d70603b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22081, "upload_time": "2016-12-02T02:48:16", "upload_time_iso_8601": "2016-12-02T02:48:16.863258Z", "url": "https://files.pythonhosted.org/packages/de/58/f759052f8d6003f38d293e2722e3ba73fe2ba6fd63ed468d25c16d915565/django-cq-0.1.14.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.15": [ { "comment_text": "", "digests": { "md5": "1557a379c44f59908485c4f4b333f8ae", "sha256": "e89c72bba9e532d9779653abef681f1760ab785f594803e979eb1992e62e4d50" }, "downloads": -1, "filename": "django-cq-0.1.15.tar.gz", "has_sig": false, "md5_digest": "1557a379c44f59908485c4f4b333f8ae", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22683, "upload_time": "2017-01-12T23:02:18", "upload_time_iso_8601": "2017-01-12T23:02:18.199613Z", "url": "https://files.pythonhosted.org/packages/24/cf/9c910708380ad92f399cb57ea4a559543d2ce41e01643794ae452099c05c/django-cq-0.1.15.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.16": [ { "comment_text": "", "digests": { "md5": "75b5d226728b8c27cd64540598462d5e", "sha256": "92fee7578290f6e3ba2e9443c96ad27dc41a78811bcb587f8fa5d8ace3b073fb" }, "downloads": -1, "filename": "django-cq-0.1.16.tar.gz", "has_sig": false, "md5_digest": "75b5d226728b8c27cd64540598462d5e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24355, "upload_time": "2017-06-08T01:58:25", "upload_time_iso_8601": "2017-06-08T01:58:25.911650Z", "url": "https://files.pythonhosted.org/packages/30/68/294abe2680b688014ab1d71ece6b437eb33143a50ec3152b1b00888ed48b/django-cq-0.1.16.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.17": [ { "comment_text": "", "digests": { "md5": "acfba61e9434c9af69bcfb4e9174996f", "sha256": "93abc2437bc764bcdb3f32eecf9f439cbddd41713cab3ecb1cd860ab4555c9ba" }, "downloads": -1, "filename": "django-cq-0.1.17.tar.gz", "has_sig": false, "md5_digest": "acfba61e9434c9af69bcfb4e9174996f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23116, "upload_time": "2018-03-22T00:44:57", "upload_time_iso_8601": "2018-03-22T00:44:57.500416Z", "url": "https://files.pythonhosted.org/packages/a3/2f/e0c17bb6a83fafb0e247081ce210afc3c47d80f821da0e5879fbef48c189/django-cq-0.1.17.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "b92c125aad85c8e137d655e38de72786", "sha256": "403314f9b2a8365422e5ee495fa86225b6fdf7020567c8af9beb823c6d111247" }, "downloads": -1, "filename": "django-cq-0.1.2.tar.gz", "has_sig": false, "md5_digest": "b92c125aad85c8e137d655e38de72786", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19525, "upload_time": "2016-09-30T12:31:53", "upload_time_iso_8601": "2016-09-30T12:31:53.145061Z", "url": "https://files.pythonhosted.org/packages/b1/4b/6e8d216a58ac2d0ab12c6215c69d1feabfee70f498db456669841464bf31/django-cq-0.1.2.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "e962da0a52cce935b3377209e23372a0", "sha256": "d5fa7ea6ab8e1eb135ee8b48b6a6cf22a65600dde970665fb3e7e7f961f45b82" }, "downloads": -1, "filename": "django-cq-0.1.3.tar.gz", "has_sig": false, "md5_digest": "e962da0a52cce935b3377209e23372a0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18199, "upload_time": "2016-10-03T03:15:49", "upload_time_iso_8601": "2016-10-03T03:15:49.156424Z", "url": "https://files.pythonhosted.org/packages/e6/51/c3f085837b4ec7e3c95e6fcde151396098745303386d0f7679f43b4ff39c/django-cq-0.1.3.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "fc610d7019981fb258eb24c8fa667a1d", "sha256": "96da66106fdf8f489b03e1fcedc1d374673694624423e25f738d2046431f0be1" }, "downloads": -1, "filename": "django-cq-0.1.4.tar.gz", "has_sig": false, "md5_digest": "fc610d7019981fb258eb24c8fa667a1d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18263, "upload_time": "2016-10-04T00:15:49", "upload_time_iso_8601": "2016-10-04T00:15:49.398108Z", "url": "https://files.pythonhosted.org/packages/18/9e/a97bb39b351196170644239230c9ecee05333755da0e993eb6cfa1f83da4/django-cq-0.1.4.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "390111cf6f949a1ead520c9a738cb53b", "sha256": "4944a2d43b24e6166bcfb39e496b35daac8337e4b286850f9a5e567d37f11d67" }, "downloads": -1, "filename": "django-cq-0.1.5.tar.gz", "has_sig": false, "md5_digest": "390111cf6f949a1ead520c9a738cb53b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18290, "upload_time": "2016-10-06T22:10:48", "upload_time_iso_8601": "2016-10-06T22:10:48.562075Z", "url": "https://files.pythonhosted.org/packages/8f/bf/ac592fc9c8f802a8499599ab367ffaf9cafbfbfa93d60c81526e88556b53/django-cq-0.1.5.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "55d5d49ee01028e62e1b595a91749794", "sha256": "281a5b789f31fcc49a2f71b0831f7164fa2280e7086eddad307cbd18076d2d43" }, "downloads": -1, "filename": "django-cq-0.1.6.tar.gz", "has_sig": false, "md5_digest": "55d5d49ee01028e62e1b595a91749794", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19599, "upload_time": "2016-10-10T01:51:42", "upload_time_iso_8601": "2016-10-10T01:51:42.048611Z", "url": "https://files.pythonhosted.org/packages/f1/27/b5c8445184ab699cecb2ed0ad3634d841f941b7fecc620c9a385c498e2c5/django-cq-0.1.6.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "8dfdc7204b4c0afff6f4826d0a501a03", "sha256": "7eada58d380c2ea7c10f3b05d86c61091f87267ca5b9ba94d5b6b968ea851ab7" }, "downloads": -1, "filename": "django-cq-0.1.7.tar.gz", "has_sig": false, "md5_digest": "8dfdc7204b4c0afff6f4826d0a501a03", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19790, "upload_time": "2016-10-10T05:47:02", "upload_time_iso_8601": "2016-10-10T05:47:02.802963Z", "url": "https://files.pythonhosted.org/packages/b3/3f/3e91c3f3219c5a765aca0e9ff76929b7b8a57d9efe1e102b4c602c939edb/django-cq-0.1.7.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "c0b8e4aa8083f83d7146d8e018948bd7", "sha256": "eb7d75023205caed9e2610cc4262ac023d1f9106aa1aac85792ed9dd55ee8cc9" }, "downloads": -1, "filename": "django-cq-0.1.8.tar.gz", "has_sig": false, "md5_digest": "c0b8e4aa8083f83d7146d8e018948bd7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20201, "upload_time": "2016-10-24T01:19:13", "upload_time_iso_8601": "2016-10-24T01:19:13.292104Z", "url": "https://files.pythonhosted.org/packages/f0/8d/4aaf793edd41286177d6ead967e5de158ee234ca159bbceb5cf69235fe65/django-cq-0.1.8.tar.gz", "yanked": false, "yanked_reason": null } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "a6baceeb7a7ad917781bbb9578b06307", "sha256": "513e17b94e4ede74420d1b469ea591f1b0f7b4a81e6376c565c274bb232907dd" }, "downloads": -1, "filename": "django-cq-0.1.9.tar.gz", "has_sig": false, "md5_digest": "a6baceeb7a7ad917781bbb9578b06307", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20711, "upload_time": "2016-10-24T02:50:59", "upload_time_iso_8601": "2016-10-24T02:50:59.911225Z", "url": "https://files.pythonhosted.org/packages/2b/5c/42e1da370829abde24c079f08f00bdb21f53f07dcd54924af94788729d6d/django-cq-0.1.9.tar.gz", "yanked": false, "yanked_reason": null } ], "0.2": [ { "comment_text": "", "digests": { "md5": "6c6f53e5c88733c06b3f765e4966a59b", "sha256": "ca1979e82c692953b99396ede3fad9cb430fd9924af68f7140edf79ef78f0924" }, "downloads": -1, "filename": "django_cq-0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "6c6f53e5c88733c06b3f765e4966a59b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32311, "upload_time": "2019-03-05T11:21:53", "upload_time_iso_8601": "2019-03-05T11:21:53.106488Z", "url": "https://files.pythonhosted.org/packages/89/6c/2f82e1a106d47db9e9d59bba71b0cad13169f496976565e3a163989d6eef/django_cq-0.2-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "59f945fb4a54e07e35a402e7f4b1eb48", "sha256": "7ed573d54cccc6795030ce4d5c211aa06fee7d3ce21dc7c3492afa5190cbf067" }, "downloads": -1, "filename": "django_cq-0.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "59f945fb4a54e07e35a402e7f4b1eb48", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32347, "upload_time": "2019-03-22T05:53:02", "upload_time_iso_8601": "2019-03-22T05:53:02.427316Z", "url": "https://files.pythonhosted.org/packages/d4/63/de71e30ba75673a36dd909f435cf115eedfbf7865ce9dc9362ef55595e40/django_cq-0.2.1-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "8b5224171d70e97a30ffc26b4fb427fa", "sha256": "07a131178ecbb24f78d95f717a21291d09ac0bab27609c30284ef24cbf3d4a16" }, "downloads": -1, "filename": "django_cq-0.2.2-py3-none-any.whl", "has_sig": false, "md5_digest": "8b5224171d70e97a30ffc26b4fb427fa", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32350, "upload_time": "2019-03-22T06:12:10", "upload_time_iso_8601": "2019-03-22T06:12:10.433553Z", "url": "https://files.pythonhosted.org/packages/6e/ab/496c755faa47791b9b404c70f6d59e0510e41884cdabef3bc880a1bc02b4/django_cq-0.2.2-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.2.3": [ { "comment_text": "", "digests": { "md5": "b2453a129d1b5c8637df807a488a4db7", "sha256": "8db433ad3523b0b636752a4f2ac4dae259475e1dba5233156f41a0d152e51fce" }, "downloads": -1, "filename": "django_cq-0.2.3-py3-none-any.whl", "has_sig": false, "md5_digest": "b2453a129d1b5c8637df807a488a4db7", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32354, "upload_time": "2019-03-28T05:53:30", "upload_time_iso_8601": "2019-03-28T05:53:30.275260Z", "url": "https://files.pythonhosted.org/packages/70/06/e09d77e09c1fe418c0977a80c96e862d4fbdf0b2f4a0fc14ab5564d278d0/django_cq-0.2.3-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.3": [ { "comment_text": "", "digests": { "md5": "2ed98765a796e310be9d0f6ec8ba5184", "sha256": "d7fc8d7f0002122e736fd14887bd4ff7cd751cb47b1f5beadc9201e65f2c7391" }, "downloads": -1, "filename": "django_cq-0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "2ed98765a796e310be9d0f6ec8ba5184", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32541, "upload_time": "2019-07-11T03:56:54", "upload_time_iso_8601": "2019-07-11T03:56:54.097993Z", "url": "https://files.pythonhosted.org/packages/fe/85/008d23267d84245daab07c465fc1783457c4e3aa912c3ff492fee0c44504/django_cq-0.3-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "5e52afb52e10d7bff357f18774d7aac2", "sha256": "7a4721dc1cba5491ad260039796655b2a55040f9d6038f51aa3bf1a6c61250a8" }, "downloads": -1, "filename": "django_cq-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "5e52afb52e10d7bff357f18774d7aac2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32668, "upload_time": "2019-07-15T05:11:01", "upload_time_iso_8601": "2019-07-15T05:11:01.306254Z", "url": "https://files.pythonhosted.org/packages/12/6c/b1f3920b55c24ed68050fd456cc63821fc0166f783f05d6afb4fe541c661/django_cq-0.3.1-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "0bb756ec0333103836c5814d36751197", "sha256": "8de39b858f7c67aa81a3c94c1b73e7302848eddd3c84b34ce0bab208d59de985" }, "downloads": -1, "filename": "django_cq-0.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "0bb756ec0333103836c5814d36751197", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32711, "upload_time": "2019-08-28T14:57:38", "upload_time_iso_8601": "2019-08-28T14:57:38.680688Z", "url": "https://files.pythonhosted.org/packages/07/3d/065acb2befa04b40bdf9c801d5eda8c85f686232d128761de32a5bff4fba/django_cq-0.3.2-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "e15089339bade72295fa6b6f1cfb8e93", "sha256": "93dcf2ea6dccb85fc5e00b6454fc8fb0d715aa94c4f91d797396f387e743caea" }, "downloads": -1, "filename": "django_cq-0.3.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e15089339bade72295fa6b6f1cfb8e93", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32709, "upload_time": "2019-10-22T02:32:42", "upload_time_iso_8601": "2019-10-22T02:32:42.790127Z", "url": "https://files.pythonhosted.org/packages/1b/c2/091e8837e10d90087605ca122465a6b112d3a54ab99a236e5c9bcbbb9af7/django_cq-0.3.3-py3-none-any.whl", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "e15089339bade72295fa6b6f1cfb8e93", "sha256": "93dcf2ea6dccb85fc5e00b6454fc8fb0d715aa94c4f91d797396f387e743caea" }, "downloads": -1, "filename": "django_cq-0.3.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e15089339bade72295fa6b6f1cfb8e93", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32709, "upload_time": "2019-10-22T02:32:42", "upload_time_iso_8601": "2019-10-22T02:32:42.790127Z", "url": "https://files.pythonhosted.org/packages/1b/c2/091e8837e10d90087605ca122465a6b112d3a54ab99a236e5c9bcbbb9af7/django_cq-0.3.3-py3-none-any.whl", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }