{"action":"closed","number":22,"pull_request":{"url":"https://api.github.com/repos/sjansen/mecha-django-demo/pulls/22","id":306629938,"node_id":"MDExOlB1bGxSZXF1ZXN0MzA2NjI5OTM4","html_url":"https://github.com/sjansen/mecha-django-demo/pull/22","diff_url":"https://github.com/sjansen/mecha-django-demo/pull/22.diff","patch_url":"https://github.com/sjansen/mecha-django-demo/pull/22.patch","issue_url":"https://api.github.com/repos/sjansen/mecha-django-demo/issues/22","number":22,"state":"closed","locked":false,"title":"Scheduled weekly dependency update for week 32","user":{"login":"pyup-bot","id":16239342,"node_id":"MDQ6VXNlcjE2MjM5MzQy","avatar_url":"https://avatars0.githubusercontent.com/u/16239342?v=4","gravatar_id":"","url":"https://api.github.com/users/pyup-bot","html_url":"https://github.com/pyup-bot","followers_url":"https://api.github.com/users/pyup-bot/followers","following_url":"https://api.github.com/users/pyup-bot/following{/other_user}","gists_url":"https://api.github.com/users/pyup-bot/gists{/gist_id}","starred_url":"https://api.github.com/users/pyup-bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pyup-bot/subscriptions","organizations_url":"https://api.github.com/users/pyup-bot/orgs","repos_url":"https://api.github.com/users/pyup-bot/repos","events_url":"https://api.github.com/users/pyup-bot/events{/privacy}","received_events_url":"https://api.github.com/users/pyup-bot/received_events","type":"User","site_admin":false},"body":"\n\n\n\n\n### Update [amqp](https://pypi.org/project/amqp) from **2.3.2** to **2.5.0**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 2.5.0\n   ```\n   =====\n:release-date: 2019-05-30 17.30 P.M UTC+6:00\n:release-by: Asif Saif Uddin\n\n- Drop Python 3.4\n- Add new platform\n- Numerious bug fixes\n\n.. _version-2.4.2:\n   ```\n   \n  \n  \n   ### 2.4.2\n   ```\n   =====\n:release-date: 2019-03-03 10:45 P.M UTC+2:00\n:release-by: Omer Katz\n\n- Added support for the Cygwin platform\n\n  Contributed by **Matus Valo**\n\n- Correct offset incrementation when parsing bitmaps.\n\n  Contributed by **Allan Simon** &amp; **Omer Katz**\n\n- Consequent bitmaps are now parsed correctly.\n\n  Previously the bit counter was reset with every bit.\n  We now reset it once per 8 bits, when we consume the next byte.\n\n  Contributed by **Omer Katz**\n\nCode Cleanups &amp; Improvements:\n\n  - **Patrick Cloke**\n  - **Matus Valo**\n  - **Jeremiah Cooper**\n  - **Omer Katz**\n\nTest Coverage &amp; CI Improvements:\n\n  - **Matus Valo**\n  - **Omer Katz**\n  - **Jeremiah Cooper**\n  - **Omer Katz**\n\n.. _version-2.4.1:\n   ```\n   \n  \n  \n   ### 2.4.1\n   ```\n   =====\n:release-date: 2018-04-02 9:00 A.M UTC+2\n:release-by: Omer Katz\n\n- To avoid breaking the API basic_consume() now returns the consumer tag\n  instead of a tuple when nowait is True.\n\n  Fix contributed by **Matus Valo**\n\n- Fix crash in basic_publish when broker does not support connection.blocked\n  capability.\n\n  Fix contributed by **Matus Valo**\n\n- read_frame() is now Python 3 compatible for large payloads.\n\n  Fix contributed by **Antonio Ojea**\n\n- Support float read_timeout/write_timeout.\n\n  Fix contributed by **:github_user:`cadl`**\n\n- Always treat SSLError timeouts as socket timeouts.\n\n  Fix contributed by **Dirk Mueller** and **Antonio Ojea**\n\n- Treat EWOULDBLOCK as timeout.\n\n  This fixes a regression on Windows from 2.4.0.\n\n  Fix contributed by **Lucian Petrut**\n\nTest Coverage &amp; CI Improvements:\n\n- **Matus Valo**\n- **Antonio Ojea**\n\n.. _version-2.4.0:\n   ```\n   \n  \n  \n   ### 2.4.0\n   ```\n   =====\n:release-date: 2018-13-01 1:00 P.M UTC+2\n:release-by: Omer Katz\n\n- Fix inconsistent frame_handler return value.\n\n  The function returned by frame_handler is meant to return True\n  once the complete message is received and the callback is called,\n  False otherwise.\n\n  This fixes the return value for messages with a body split across\n  multiple frames, and heartbeat frames.\n\n  Fix contributed by **:github_user:`evanunderscore`**\n\n- Don&#39;t default content_encoding to utf-8 for bytes.\n\n  This is not an acceptable default as the content may not be\n  valid utf-8, and even if it is, the producer likely does not\n  expect the message to be decoded by the consumer.\n\n  Fix contributed by **:github_user:`evanunderscore`**\n\n- Fix encoding of messages with multibyte characters.\n\n  Body length was previously calculated using string length,\n  which may be less than the length of the encoded body when\n  it contains multibyte sequences. This caused the body of\n  the frame to be truncated.\n\n  Fix contributed by **:github_user:`evanunderscore`**\n\n- Respect content_encoding when encoding messages.\n\n  Previously the content_encoding was ignored and messages\n  were always encoded as utf-8. This caused messages to be\n  incorrectly decoded if content_encoding is properly respected\n  when decoding.\n\n  Fix contributed by **:github_user:`evanunderscore`**\n\n- Fix AMQP protocol header for AMQP 0-9-1.\n\n  Previously it was set to a different value for unknown reasons.\n\n  Fix contributed by **Carl Hörberg**\n\n- Add support for Python 3.7.\n\n  Change direct SSLSocket instantiation with wrap_socket.\n  Added Python 3.7 to CI.\n\n  Fix contributed by **Omer Katz** and **:github_user:`avborhanian`**\n\n- Add support for field type &quot;x&quot; (byte array).\n\n  Fix contributed by **Davis Kirkendall**\n\n- If there is an exception raised on Connection.connect or Connection.close,\n  ensure that the underlying transport socket is closed.\n\n  Adjust exception message on connection errors as well.\n\n  Fix contributed by **:github_user:`tomc797`**\n\n- TCP_USER_TIMEOUT has to be excluded from KNOWN_TCP_OPTS in BSD platforms.\n\n  Fix contributed by **George Tantiras**\n\n- Handle negative acknowledgments.\n\n  Fix contributed by **Matus Valo**\n\n- Added integration tests.\n\n  Fix contributed by **Matus Valo**\n\n- Fix basic_consume() with no consumer_tag provided.\n\n  Fix contributed by **Matus Valo**\n\n- Improved empty AMQPError string representation.\n\n  Fix contributed by **Matus Valo**\n\n- Drain events before publish.\n\n  This is needed to capture out of memory messages for clients that only\n  publish. Otherwise on_blocked is never called.\n\n  Fix contributed by **Jelte Fennema** and **Matus Valo**\n\n- Don&#39;t revive channel when connection is closing.\n\n  When connection is closing don&#39;t raise error when Channel.Close method is received.\n\n  Fix contributed by **Matus Valo**\n\n.. _version-2.3.2:\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/amqp\n  - Changelog: https://pyup.io/changelogs/amqp/\n  - Repo: http://github.com/celery/py-amqp\n</details>\n\n\n\n\n\n### Update [asgiref](https://pypi.org/project/asgiref) from **2.3.2** to **3.2.1**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 3.2.1\n   ```\n   ------------------\n\n* sys.exc_info() is now propagated across thread boundaries\n   ```\n   \n  \n  \n   ### 3.2.0\n   ```\n   ------------------\n\n* New &quot;thread_sensitive&quot; argument to SyncToAsync allows for pinning of code into\n  the same thread as other thread_sensitive code.\n* Test collection on Python 3.7 fixed\n   ```\n   \n  \n  \n   ### 3.1.4\n   ```\n   ------------------\n\n* Fixed an incompatibility with Python 3.5 introduced in the last release.\n   ```\n   \n  \n  \n   ### 3.1.3\n   ```\n   ------------------\n\n* async_timeout has been removed as a dependency, so there are now no required\n  dependencies.\n* The WSGI adapter now sets ``REMOTE_ADDR`` from the ASGI ``client``.\n   ```\n   \n  \n  \n   ### 3.1.2\n   ```\n   ------------------\n\n* New thread_critical argument to Local to tell it to not inherit contexts\n  across threads/tasks.\n* Local now inherits across any number of sync_to_async to async_to_sync calls\n  nested inside each other\n   ```\n   \n  \n  \n   ### 3.1.1\n   ```\n   ------------------\n\n* Local now cleans up storage of old threads and tasks to prevent a memory leak.\n   ```\n   \n  \n  \n   ### 3.1.0\n   ```\n   ------------------\n\n* Added ``asgiref.local`` module to provide threading.local drop-in replacement.\n   ```\n   \n  \n  \n   ### 3.0.0\n   ```\n   ------------------\n\n* Updated to match new ASGI 3.0 spec\n* Compatibility library added that allows adapting ASGI 2 apps into ASGI 3 apps\n  losslessly\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/asgiref\n  - Changelog: https://pyup.io/changelogs/asgiref/\n  - Repo: http://github.com/django/asgiref/\n</details>\n\n\n\n\n\n### Update [attrs](https://pypi.org/project/attrs) from **18.2.0** to **19.1.0**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 19.1.0\n   ```\n   -------------------\n\nBackward-incompatible Changes\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- Fixed a bug where deserialized objects with ``cache_hash=True`` could have incorrect hash code values.\n  This change breaks classes with ``cache_hash=True`` when a custom ``__setstate__`` is present.\n  An exception will be thrown when applying the ``attrs`` annotation to such a class.\n  This limitation is tracked in issue `494 &lt;https://github.com/python-attrs/attrs/issues/494&gt;`_.\n  `482 &lt;https://github.com/python-attrs/attrs/issues/482&gt;`_\n\n\nChanges\n^^^^^^^\n\n- Add ``is_callable``, ``deep_iterable``, and ``deep_mapping`` validators.\n\n  * ``is_callable``: validates that a value is callable\n  * ``deep_iterable``: Allows recursion down into an iterable,\n    applying another validator to every member in the iterable\n    as well as applying an optional validator to the iterable itself.\n  * ``deep_mapping``: Allows recursion down into the items in a mapping object,\n    applying a key validator and a value validator to the key and value in every item.\n    Also applies an optional validator to the mapping object itself.\n\n  You can find them in the ``attr.validators`` package.\n  `425 &lt;https://github.com/python-attrs/attrs/issues/425&gt;`_\n- Fixed stub files to prevent errors raised by mypy&#39;s ``disallow_any_generics = True`` option.\n  `443 &lt;https://github.com/python-attrs/attrs/issues/443&gt;`_\n- Attributes with ``init=False`` now can follow after ``kw_only=True`` attributes.\n  `450 &lt;https://github.com/python-attrs/attrs/issues/450&gt;`_\n- ``attrs`` now has first class support for defining exception classes.\n\n  If you define a class using ``attr.s(auto_exc=True)`` and subclass an exception, the class will behave like a well-behaved exception class including an appropriate ``__str__`` method, and all attributes additionally available in an ``args`` attribute.\n  `500 &lt;https://github.com/python-attrs/attrs/issues/500&gt;`_\n- Clarified documentation for hashing to warn that hashable objects should be deeply immutable (in their usage, even if this is not enforced).\n  `503 &lt;https://github.com/python-attrs/attrs/issues/503&gt;`_\n\n\n----\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/attrs\n  - Changelog: https://pyup.io/changelogs/attrs/\n  - Homepage: https://www.attrs.org/\n</details>\n\n\n\n\n\n### Update [autobahn](https://pypi.org/project/autobahn) from **18.11.2** to **19.8.1**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 19.8.1\n   ```\n   ------\n\n* new: implement XBR off-chain delegate transaction signing and verification (1202)\n* new: update XBR for new contract ABIs\n   ```\n   \n  \n  \n   ### 19.7.2\n   ```\n   ------\n\n* fix: monkey patch re-add removed helper functions removed in eth-abi\n* new: simple blockchain (XBR) client\n* new: update XBR ABI files\n* new: XBR endpoint transaction signing\n* new: client side catching of WAMP URI errors in `session.call|register|publish|subscribe`\n   ```\n   \n  \n  \n   ### 19.7.1\n   ```\n   ------\n\n* fix: implement client side payload exceed max size; improve max size exceeded handling\n* fix: detect when our transport is &quot;already&quot; closed at connect time (1215)\n* fix: XBR examples\n   ```\n   \n  \n  \n   ### 19.6.2\n   ```\n   ------\n\n* fix: add forgotten cryptography dependency (1205)\n   ```\n   \n  \n  \n   ### 19.6.1\n   ```\n   ------\n\n* new: XBR client library integrated (1201)\n* new: add entropy depletion unit tests\n* fix: make CLI tool python2 compatible (1197)\n* fix: use cryptography pbkdf2 instead of custom (1198)\n* fix: include tests for packaging (1194)\n   ```\n   \n  \n  \n   ### 19.5.1\n   ```\n   ------\n\n* fix: authextra merging (1191)\n* fix: set default retry_delay_jitter (1190)\n* new: add rawsocket + twisted example (1189)\n* new: WebSocket testing support, via Agent-style interface (1186)\n* new: decorator for on_connectfailure\n* fix: delayed call leakage (1152)\n* new: CLI client (1150)\n* fix: set up TLS over proxy properly (1149)\n* new: expose ser modules (1148)\n* fix: base64 encodings, add hex encoding (1146)\n* new: onConnecting callback (with TransportDetails and\n  ConnectingRequest). **Note**: if you&#39;ve implemented a pure\n  `IWebSocketChannel` without inheriting from Autobahn base classes,\n  you&#39;ll need to add an `onConnecting()` method that just does `return\n  None`.\n   ```\n   \n  \n  \n   ### 19.3.3\n   ```\n   ------\n\n* fix: RegisterOptions should have details|bool parameter (1143)\n* new: WAMP callee disclosure\n* new: WAMP forward_for in more message types; expose forward_for in options/details types\n* new: expose underlying serializer modules on WAMP object serializers\n* fix: WAMP-cryptosign fix base64 encodings, add hex encoding (1146)\n   ```\n   \n  \n  \n   ### 19.3.2\n   ```\n   ------\n\n* fix: import guards for flatbuffers (missed in CI as we run with &quot;all deps installed&quot; there)\n   ```\n   \n  \n  \n   ### 19.3.1\n   ```\n   ------\n\n* new: add experimental support for WAMP-FlatBuffers serializer: EVENT and PUBLISH messages for now only\n* new: add FlatBuffers schema for WAMP messages\n* fix: improve serializer package preference behavior depending on CPy vs PyPy\n* fix: relax protocol violations: ignore unknown INTERRUPT and GOODBYE already sent; reduce log noise\n* fix: skipping Yield message if transport gets closed before success callback is called (1119)\n* fix: integer division in logging in py3 (1120)\n* fix: Await tasks after they&#39;ve been cancelled in `autobahn.asycio.component.nicely_exit` (1116)\n   ```\n   \n  \n  \n   ### 19.2.1\n   ```\n   ------\n\n* fix: set announced roles on appsession object (1109)\n* new: lower log noise on ApplicationErrors (1107)\n* new: allow explicit passing of tx endpoint and reactor (1103)\n* new: add attribute to forward applicationrunner to applicationsession via componentconfig\n   ```\n   \n  \n  \n   ### 19.1.1\n   ```\n   ------\n\n* new: adding marshal on SessionDetails\n   ```\n   \n  \n  \n   ### 18.12.1\n   ```\n   -------\n\n* fix: return the wrapped function from component decorators (1093)\n* new: add proxy= support for Component transports (1091)\n* fix: Ticket1077 stop start (1090)\n* fix: cleanup cancel handling (1087)\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/autobahn\n  - Changelog: https://pyup.io/changelogs/autobahn/\n  - Homepage: http://crossbar.io/autobahn\n</details>\n\n\n\n\n\n### Update [billiard](https://pypi.org/project/billiard) from **3.5.0.5** to **3.6.0.0**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 3.6.0.0\n   ```\n   --------------------\n\n- Add support of sending parent process death signal.\n\n- Previous fix for handling timeouts caused a problem in warm shutdowns due\n  to use of deepcopy.\n\n  We now use a shallow copy of the cache and do so only when it is needed.\n\n- Cleanup old checks and workarounds for Python versions we no longer support.\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/billiard\n  - Changelog: https://pyup.io/changelogs/billiard/\n  - Repo: https://github.com/celery/billiard\n</details>\n\n\n\n\n\n### Update [celery](https://pypi.org/project/celery) from **4.2.1** to **4.3.0**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 4.3.0\n   ```\n   =========\n:release-date: 2019-02-20 5:00 PM IST\n:release-by: Omer Katz\n\n- **Canvas**: :meth:`celery.chain.apply` does not ignore keyword arguments anymore when\n  applying the chain.\n\n  Contributed by **Korijn van Golen**\n\n- **Result Set**: Don&#39;t attempt to cache results in a :class:`celery.result.ResultSet`.\n\n  During a join, the results cache was populated using :meth:`celery.result.ResultSet.get`, if one of the results\n  contains an exception, joining unexpectedly failed.\n\n  The results cache is now removed.\n\n  Contributed by **Derek Harland**\n\n- **Application**: :meth:`celery.Celery.autodiscover_tasks` now attempts to import the package itself\n  when the `related_name` keyword argument is `None`.\n\n  Contributed by **Alex Ioannidis**\n\n- **Windows Support**: On Windows 10, stale PID files prevented celery beat to run.\n  We now remove them when a :class:`SystemExit` is raised.\n\n  Contributed by **:github_user:`na387`**\n\n- **Task**: Added the new :setting:`task_acks_on_failure_or_timeout` setting.\n\n  Acknowledging SQS messages on failure or timing out makes it impossible to use\n  dead letter queues.\n\n  We introduce the new option acks_on_failure_or_timeout,\n  to ensure we can totally fallback on native SQS message lifecycle,\n  using redeliveries for retries (in case of slow processing or failure)\n  and transitions to dead letter queue after defined number of times.\n\n  Contributed by **Mario Kostelac**\n\n- **RabbitMQ Broker**: Adjust HA headers to work on RabbitMQ 3.x.\n\n  This change also means we&#39;re ending official support for RabbitMQ 2.x.\n\n  Contributed by **Asif Saif Uddin**\n\n- **Command Line**: Improve :program:`celery update` error handling.\n\n  Contributed by **Federico Bond**\n\n- **Canvas**: Support chords with :setting:`task_always_eager` set to `True`.\n\n  Contributed by **Axel Haustant**\n\n- **Result Backend**: Optionally store task properties in result backend.\n\n  Setting the :setting:`result_extended` configuration option to `True` enables\n  storing additional task properties in the result backend.\n\n  Contributed by **John Arnold**\n\n- **Couchbase Result Backend**: Allow the Couchbase result backend to\n  automatically detect the serialization format.\n\n  Contributed by **Douglas Rohde**\n\n- **New Result Backend**: Added the Azure Block Blob Storage result backend.\n\n  The backend is implemented on top of the azure-storage library which\n  uses Azure Blob Storage for a scalable low-cost PaaS backend.\n\n  The backend was load tested via a simple nginx/gunicorn/sanic app hosted\n  on a DS4 virtual machine (4 vCores, 16 GB RAM) and was able to handle\n  600+ concurrent users at ~170 RPS.\n\n  The commit also contains a live end-to-end test to facilitate\n  verification of the backend functionality. The test is activated by\n  setting the `AZUREBLOCKBLOB_URL` environment variable to\n  `azureblockblob://{ConnectionString}` where the value for\n  `ConnectionString` can be found in the `Access Keys` pane of a Storage\n  Account resources in the Azure Portal.\n\n  Contributed by **Clemens Wolff**\n\n- **Task**: :meth:`celery.app.task.update_state` now accepts keyword arguments.\n\n  This allows passing extra fields to the result backend.\n  These fields are unused by default but custom result backends can use them\n  to determine how to store results.\n\n  Contributed by **Christopher Dignam**\n\n- Gracefully handle consumer :class:`kombu.exceptions.DecodeError`.\n\n  When using the v2 protocol the worker no longer crashes when the consumer\n  encounters an error while decoding a message.\n\n  Contributed by **Steven Sklar**\n\n- **Deployment**: Fix init.d service stop.\n\n  Contributed by **Marcus McHale**\n\n- **Django**: Drop support for Django &lt; 1.11.\n\n  Contributed by **Asif Saif Uddin**\n\n- **Django**: Remove old djcelery loader.\n\n  Contributed by **Asif Saif Uddin**\n\n- **Result Backend**: :class:`celery.worker.request.Request` now passes\n  :class:`celery.app.task.Context` to the backend&#39;s store_result functions.\n\n  Since the class currently passes `self` to these functions,\n  revoking a task resulted in corrupted task result data when\n  django-celery-results was used.\n\n  Contributed by **Kiyohiro Yamaguchi**\n\n- **Worker**: Retry if the heartbeat connection dies.\n\n  Previously, we keep trying to write to the broken connection.\n  This results in a memory leak because the event dispatcher will keep appending\n  the message to the outbound buffer.\n\n  Contributed by **Raf Geens**\n\n- **Celery Beat**: Handle microseconds when scheduling.\n\n  Contributed by **K Davis**\n\n- **Asynpool**: Fixed deadlock when closing socket.\n\n  Upon attempting to close a socket, :class:`celery.concurrency.asynpool.AsynPool`\n  only removed the queue writer from the hub but did not remove the reader.\n  This led to a deadlock on the file descriptor\n  and eventually the worker stopped accepting new tasks.\n\n  We now close both the reader and the writer file descriptors in a single loop\n  iteration which prevents the deadlock.\n\n  Contributed by **Joshua Engelman**\n\n- **Celery Beat**: Correctly consider timezone when calculating timestamp.\n\n  Contributed by **:github_user:`yywing`**\n\n- **Celery Beat**: :meth:`celery.beat.Scheduler.schedules_equal` can now handle\n  either arguments being a `None` value.\n\n  Contributed by **:github_user:` ratson`**\n\n- **Documentation/Sphinx**: Fixed Sphinx support for shared_task decorated functions.\n\n  Contributed by **Jon Banafato**\n\n- **New Result Backend**: Added the CosmosDB result backend.\n\n  This change adds a new results backend.\n  The backend is implemented on top of the pydocumentdb library which uses\n  Azure CosmosDB for a scalable, globally replicated, high-performance,\n  low-latency and high-throughput PaaS backend.\n\n  Contributed by **Clemens Wolff**\n\n- **Application**: Added configuration options to allow separate multiple apps\n  to run on a single RabbitMQ vhost.\n\n  The newly added :setting:`event_exchange` and :setting:`control_exchange`\n  configuration options allow users to use separate Pidbox exchange\n  and a separate events exchange.\n\n  This allow different Celery applications to run separately on the same vhost.\n\n  Contributed by **Artem Vasilyev**\n\n- **Result Backend**: Forget parent result metadata when forgetting\n  a result.\n\n  Contributed by **:github_user:`tothegump`**\n\n- **Task** Store task arguments inside :class:`celery.exceptions.MaxRetriesExceededError`.\n\n  Contributed by **Anthony Ruhier**\n\n- **Result Backend**: Added the :setting:`result_accept_content` setting.\n\n  This feature allows to configure different accepted content for the result\n  backend.\n\n  A special serializer (`auth`) is used for signed messaging,\n  however the result_serializer remains in json, because we don&#39;t want encrypted\n  content in our result backend.\n\n  To accept unsigned content from the result backend,\n  we introduced this new configuration option to specify the\n  accepted content from the backend.\n\n  Contributed by **Benjamin Pereto**\n\n- **Canvas**: Fixed error callback processing for class based tasks.\n\n  Contributed by **Victor Mireyev**\n\n- **New Result Backend**: Added the S3 result backend.\n\n  Contributed by **Florian Chardin**\n\n- **Task**: Added support for Cythonized Celery tasks.\n\n  Contributed by **Andrey Skabelin**\n\n- **Riak Result Backend**: Warn Riak backend users for possible Python 3.7 incompatibilities.\n\n  Contributed by **George Psarakis**\n\n- **Python Runtime**: Added Python 3.7 support.\n\n  Contributed by **Omer Katz** &amp; **Asif Saif Uddin**\n\n- **Auth Serializer**: Revamped the auth serializer.\n\n  The auth serializer received a complete overhaul.\n  It was previously horribly broken.\n\n  We now depend on cryptography instead of pyOpenSSL for this serializer.\n\n  Contributed by **Benjamin Pereto**\n\n- **Command Line**: :program:`celery report` now reports kernel version along\n  with other platform details.\n\n  Contributed by **Omer Katz**\n\n- **Canvas**: Fixed chords with chains which include sub chords in a group.\n\n  Celery now correctly executes the last task in these types of canvases:\n\n  .. code-block:: python\n\n    c = chord(\n      group([\n          chain(\n              dummy.si(),\n              chord(\n                  group([dummy.si(), dummy.si()]),\n                  dummy.si(),\n              ),\n          ),\n          chain(\n              dummy.si(),\n              chord(\n                  group([dummy.si(), dummy.si()]),\n                  dummy.si(),\n              ),\n          ),\n      ]),\n      dummy.si()\n    )\n\n    c.delay().get()\n\n  Contributed by **Maximilien Cuony**\n\n- **Canvas**: Complex canvases with error callbacks no longer raises an :class:`AttributeError`.\n\n  Very complex canvases such as `this &lt;https://github.com/merchise/xopgi.base/blob/6634819ad5c701c04bc9baa5c527449070843b71/xopgi/xopgi_cdr/cdr_agent.pyL181&gt;`_\n  no longer raise an :class:`AttributeError` which prevents constructing them.\n\n  We do not know why this bug occurs yet.\n\n  Contributed by **Manuel Vázquez Acosta**\n\n- **Command Line**: Added proper error messages in cases where app cannot be loaded.\n\n  Previously, celery crashed with an exception.\n\n  We now print a proper error message.\n\n  Contributed by **Omer Katz**\n\n- **Task**: Added the :setting:`task_default_priority` setting.\n\n  You can now set the default priority of a task using\n  the :setting:`task_default_priority` setting.\n  The setting&#39;s value will be used if no priority is provided for a specific\n  task.\n\n  Contributed by **:github_user:`madprogrammer`**\n\n- **Dependencies**: Bump minimum required version of Kombu to 4.3\n  and Billiard to 3.6.\n\n  Contributed by **Asif Saif Uddin**\n\n- **Result Backend**: Fix memory leak.\n\n  We reintroduced weak references to bound methods for AsyncResult callback promises,\n  after adding full weakref support for Python 2 in `vine &lt;https://github.com/celery/vine/tree/v1.2.0&gt;`_.\n  More details can be found in `celery/celery4839 &lt;https://github.com/celery/celery/pull/4839&gt;`_.\n\n  Contributed by **George Psarakis** and **:github_user:`monsterxx03`**.\n\n- **Task Execution**: Fixed roundtrip serialization for eager tasks.\n\n  When doing the roundtrip serialization for eager tasks,\n  the task serializer will always be JSON unless the `serializer` argument\n  is present in the call to :meth:`celery.app.task.Task.apply_async`.\n  If the serializer argument is present but is `&#39;pickle&#39;`,\n  an exception will be raised as pickle-serialized objects\n  cannot be deserialized without specifying to `serialization.loads`\n  what content types should be accepted.\n  The Producer&#39;s `serializer` seems to be set to `None`,\n  causing the default to JSON serialization.\n\n  We now continue to use (in order) the `serializer` argument to :meth:`celery.app.task.Task.apply_async`,\n  if present, or the `Producer`&#39;s serializer if not `None`.\n  If the `Producer`&#39;s serializer is `None`,\n  it will use the Celery app&#39;s `task_serializer` configuration entry as the serializer.\n\n  Contributed by **Brett Jackson**\n\n- **Redis Result Backend**: The :class:`celery.backends.redis.ResultConsumer` class no longer assumes\n  :meth:`celery.backends.redis.ResultConsumer.start` to be called before\n  :meth:`celery.backends.redis.ResultConsumer.drain_events`.\n\n  This fixes a race condition when using the Gevent workers pool.\n\n  Contributed by **Noam Kush**\n\n- **Task**: Added the :setting:`task_inherit_parent_priority` setting.\n\n  Setting the :setting:`task_inherit_parent_priority` configuration option to\n  `True` will make Celery tasks inherit the priority of the previous task\n  linked to it.\n\n  Examples:\n\n  .. code-block:: python\n\n    c = celery.chain(\n      add.s(2),  priority=None\n      add.s(3).set(priority=5),  priority=5\n      add.s(4),  priority=5\n      add.s(5).set(priority=3),  priority=3\n      add.s(6),  priority=3\n    )\n\n  .. code-block:: python\n\n    app.task(bind=True)\n    def child_task(self):\n      pass\n\n    app.task(bind=True)\n    def parent_task(self):\n      child_task.delay()\n\n     child_task will also have priority=5\n    parent_task.apply_async(args=[], priority=5)\n\n  Contributed by **:github_user:`madprogrammer`**\n\n- **Canvas**: Added the :setting:`result_chord_join_timeout` setting.\n\n  Previously, :meth:`celery.result.GroupResult.join` had a fixed timeout of 3\n  seconds.\n\n  The :setting:`result_chord_join_timeout` setting now allows you to change it.\n\n  Contributed by **:github_user:`srafehi`**\n\nCode Cleanups, Test Coverage &amp; CI Improvements by:\n\n  - **Jon Dufresne**\n  - **Asif Saif Uddin**\n  - **Omer Katz**\n  - **Brett Jackson**\n  - **Bruno Alla**\n  - **:github_user:`tothegump`**\n  - **Bojan Jovanovic**\n  - **Florian Chardin**\n  - **:github_user:`walterqian`**\n  - **Fabian Becker**\n  - **Lars Rinn**\n  - **:github_user:`madprogrammer`**\n  - **Ciaran Courtney**\n\nDocumentation Fixes by:\n\n  - **Lewis M. Kabui**\n  - **Dash Winterson**\n  - **Shanavas M**\n  - **Brett Randall**\n  - **Przemysław Suliga**\n  - **Joshua Schmid**\n  - **Asif Saif Uddin**\n  - **Xiaodong**\n  - **Vikas Prasad**\n  - **Jamie Alessio**\n  - **Lars Kruse**\n  - **Guilherme Caminha**\n  - **Andrea Rabbaglietti**\n  - **Itay Bittan**\n  - **Noah Hall**\n  - **Peng Weikang**\n  - **Mariatta Wijaya**\n  - **Ed Morley**\n  - **Paweł Adamczak**\n  - **:github_user:`CoffeeExpress`**\n  - **:github_user:`aviadatsnyk`**\n  - **Brian Schrader**\n  - **Josue Balandrano Coronel**\n  - **Tom Clancy**\n  - **Sebastian Wojciechowski**\n  - **Meysam Azad**\n  - **Willem Thiart**\n  - **Charles Chan**\n  - **Omer Katz**\n  - **Milind Shakya**\n\n\nChanges\n=======\n\npy-amqp is fork of amqplib used by Kombu containing additional features and improvements.\nThe previous amqplib changelog is here:\nhttp://code.google.com/p/py-amqplib/source/browse/CHANGES\n\n.. _version-2.5.0:\n   ```\n   \n  \n  \n   ### 4.2.2post1\n   ```\n   ===========\n:release-date: 2019-01-01 04:00 P.M IST\n:release-by: Omer Katz\n\n.. note::\n\n  The previous release contained code from master.\n  It is now deleted from PyPi.\n  Please use this release instead.\n\n- No changes since previous release.\n\n.. _version-4.2.2:\n   ```\n   \n  \n  \n   ### 4.2.2\n   ```\n   =====\n:release-date: 2018-12-06 04:30 P.M IST\n:release-by: Omer Katz\n\n- Support both Redis client version 2.x and version 3.x.\n\n  Contributed by **Ash Berlin-Taylor** and **Jeppe Fihl-Pearson**\n\n.. _version-4.2.1:\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/celery\n  - Changelog: https://pyup.io/changelogs/celery/\n  - Homepage: http://celeryproject.org\n  - Docs: https://pythonhosted.org/celery/\n</details>\n\n\n\n\n\n### Update [channels](https://pypi.org/project/channels) from **2.1.7** to **2.2.0**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 2.2.0\n   ```\n   ------------------\n\n* Updated requirements for ASGI v3 and Daphne 2.3.\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/channels\n  - Changelog: https://pyup.io/changelogs/channels/\n  - Repo: http://github.com/django/channels\n</details>\n\n\n\n\n\n### Update [channels-redis](https://pypi.org/project/channels-redis) from **2.3.3** to **2.4.0**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 2.4.0\n   ```\n   ------------------\n\n* Updated ASGI and Channels dependencies for ASGI v3.\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/channels-redis\n  - Changelog: https://pyup.io/changelogs/channels-redis/\n  - Repo: http://github.com/django/channels_redis/\n</details>\n\n\n\n\n\n### Update [daphne](https://pypi.org/project/daphne) from **2.2.3** to **2.3.0**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 2.3.0\n   ```\n   ------------------\n\n* Added support for ASGI v3.\n   ```\n   \n  \n  \n   ### 2.2.5\n   ```\n   ------------------\n\n* WebSocket handshakes are now affected by the websocket connect timeout, so\n  you can limit them from the command line.\n\n* Server name can now be set using --server-name\n   ```\n   \n  \n  \n   ### 2.2.4\n   ```\n   ------------------\n\n* No longer listens on port 8000 when a file descriptor is provided with --fd\n\n* Fixed a memory leak with WebSockets\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/daphne\n  - Changelog: https://pyup.io/changelogs/daphne/\n  - Repo: https://github.com/django/daphne\n</details>\n\n\n\n\n\n### Update [Django](https://pypi.org/project/Django) from **2.1.7** to **2.2.4**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 2.2.4\n   ```\n   ==========================\n\n*August 1, 2019*\n\nDjango 2.2.4 fixes security issues and several bugs in 2.2.3.\n\nCVE-2019-14232: Denial-of-service possibility in ``django.utils.text.Truncator``\n================================================================================\n\nIf ``django.utils.text.Truncator``&#39;s ``chars()`` and ``words()`` methods\nwere passed the ``html=True`` argument, they were extremely slow to evaluate\ncertain inputs due to a catastrophic backtracking vulnerability in a regular\nexpression. The ``chars()`` and ``words()`` methods are used to implement the\n:tfilter:`truncatechars_html` and :tfilter:`truncatewords_html` template\nfilters, which were thus vulnerable.\n\nThe regular expressions used by ``Truncator`` have been simplified in order to\navoid potential backtracking issues. As a consequence, trailing punctuation may\nnow at times be included in the truncated output.\n\nCVE-2019-14233: Denial-of-service possibility in ``strip_tags()``\n=================================================================\n\nDue to the behavior of the underlying ``HTMLParser``,\n:func:`django.utils.html.strip_tags` would be extremely slow to evaluate\ncertain inputs containing large sequences of nested incomplete HTML entities.\nThe ``strip_tags()`` method is used to implement the corresponding\n:tfilter:`striptags` template filter, which was thus also vulnerable.\n\n``strip_tags()`` now avoids recursive calls to ``HTMLParser`` when progress\nremoving tags, but necessarily incomplete HTML entities, stops being made.\n\nRemember that absolutely NO guarantee is provided about the results of\n``strip_tags()`` being HTML safe. So NEVER mark safe the result of a\n``strip_tags()`` call without escaping it first, for example with\n:func:`django.utils.html.escape`.\n\nCVE-2019-14234: SQL injection possibility in key and index lookups for ``JSONField``/``HStoreField``\n====================================================================================================\n\n:lookup:`Key and index lookups &lt;jsonfield.key&gt;` for\n:class:`~django.contrib.postgres.fields.JSONField` and :lookup:`key lookups\n&lt;hstorefield.key&gt;` for :class:`~django.contrib.postgres.fields.HStoreField`\nwere subject to SQL injection, using a suitably crafted dictionary, with\ndictionary expansion, as the ``**kwargs`` passed to ``QuerySet.filter()``.\n\nCVE-2019-14235: Potential memory exhaustion in ``django.utils.encoding.uri_to_iri()``\n=====================================================================================\n\nIf passed certain inputs, :func:`django.utils.encoding.uri_to_iri` could lead\nto significant memory usage due to excessive recursion when re-percent-encoding\ninvalid UTF-8 octet sequences.\n\n``uri_to_iri()`` now avoids recursion when re-percent-encoding invalid UTF-8\noctet sequences.\n\nBugfixes\n========\n\n* Fixed a regression in Django 2.2 when ordering a ``QuerySet.union()``,\n  ``intersection()``, or ``difference()`` by a field type present more than\n  once results in the wrong ordering being used (:ticket:`30628`).\n\n* Fixed a migration crash on PostgreSQL when adding a check constraint\n  with a ``contains`` lookup on\n  :class:`~django.contrib.postgres.fields.DateRangeField` or\n  :class:`~django.contrib.postgres.fields.DateTimeRangeField`, if the right\n  hand side of an expression is the same type (:ticket:`30621`).\n\n* Fixed a regression in Django 2.2 where auto-reloader crashes if a file path\n  contains nulls characters (``&#39;\\x00&#39;``) (:ticket:`30506`).\n\n* Fixed a regression in Django 2.2 where auto-reloader crashes if a translation\n  directory cannot be resolved (:ticket:`30647`).\n\n\n==========================\n   ```\n   \n  \n  \n   ### 2.2.3\n   ```\n   ==========================\n\n*July 1, 2019*\n\nDjango 2.2.3 fixes a security issue and several bugs in 2.2.2. Also, the latest\nstring translations from Transifex are incorporated.\n\nCVE-2019-12781: Incorrect HTTP detection with reverse-proxy connecting via HTTPS\n--------------------------------------------------------------------------------\n\nWhen deployed behind a reverse-proxy connecting to Django via HTTPS,\n:attr:`django.http.HttpRequest.scheme` would incorrectly detect client\nrequests made via HTTP as using HTTPS. This entails incorrect results for\n:meth:`~django.http.HttpRequest.is_secure`, and\n:meth:`~django.http.HttpRequest.build_absolute_uri`, and that HTTP\nrequests would not be redirected to HTTPS in accordance with\n:setting:`SECURE_SSL_REDIRECT`.\n\n``HttpRequest.scheme`` now respects :setting:`SECURE_PROXY_SSL_HEADER`, if it is\nconfigured, and the appropriate header is set on the request, for both HTTP and\nHTTPS requests.\n\nIf you deploy Django behind a reverse-proxy that forwards HTTP requests, and\nthat connects to Django via HTTPS, be sure to verify that your application\ncorrectly handles code paths relying on ``scheme``, ``is_secure()``,\n``build_absolute_uri()``, and ``SECURE_SSL_REDIRECT``.\n\nBugfixes\n========\n\n* Fixed a regression in Django 2.2 where :class:`~django.db.models.Avg`,\n  :class:`~django.db.models.StdDev`, and :class:`~django.db.models.Variance`\n  crash with ``filter`` argument (:ticket:`30542`).\n\n* Fixed a regression in Django 2.2.2 where auto-reloader crashes with\n  ``AttributeError``, e.g. when using ``ipdb`` (:ticket:`30588`).\n\n\n==========================\n   ```\n   \n  \n  \n   ### 2.2.2\n   ```\n   ==========================\n\n*June 3, 2019*\n\nDjango 2.2.2 fixes security issues and several bugs in 2.2.1.\n\nCVE-2019-12308: AdminURLFieldWidget XSS\n---------------------------------------\n\nThe clickable &quot;Current URL&quot; link generated by ``AdminURLFieldWidget`` displayed\nthe provided value without validating it as a safe URL. Thus, an unvalidated\nvalue stored in the database, or a value provided as a URL query parameter\npayload, could result in an clickable JavaScript link.\n\n``AdminURLFieldWidget`` now validates the provided value using\n:class:`~django.core.validators.URLValidator` before displaying the clickable\nlink. You may customize the validator by passing a ``validator_class`` kwarg to\n``AdminURLFieldWidget.__init__()``, e.g. when using\n:attr:`~django.contrib.admin.ModelAdmin.formfield_overrides`.\n\nPatched bundled jQuery for CVE-2019-11358: Prototype pollution\n--------------------------------------------------------------\n\njQuery before 3.4.0, mishandles ``jQuery.extend(true, {}, ...)`` because of\n``Object.prototype`` pollution. If an unsanitized source object contained an\nenumerable ``__proto__`` property, it could extend the native\n``Object.prototype``.\n\nThe bundled version of jQuery used by the Django admin has been patched to\nallow for the ``select2`` library&#39;s use of ``jQuery.extend()``.\n\nBugfixes\n========\n\n* Fixed a regression in Django 2.2 that stopped Show/Hide toggles working on\n  dynamically added admin inlines (:ticket:`30459`).\n\n* Fixed a regression in Django 2.2 where deprecation message crashes if\n  ``Meta.ordering`` contains an expression (:ticket:`30463`).\n\n* Fixed a regression in Django 2.2.1 where\n  :class:`~django.contrib.postgres.search.SearchVector` generates SQL with a\n  redundant ``Coalesce`` call (:ticket:`30488`).\n\n* Fixed a regression in Django 2.2 where auto-reloader doesn&#39;t detect changes\n  in ``manage.py`` file when using ``StatReloader`` (:ticket:`30479`).\n\n* Fixed crash of :class:`~django.contrib.postgres.aggregates.ArrayAgg` and\n  :class:`~django.contrib.postgres.aggregates.StringAgg` with ``ordering``\n  argument when used in a ``Subquery`` (:ticket:`30315`).\n\n* Fixed a regression in Django 2.2 that caused a crash of auto-reloader when\n  an exception with custom signature is raised (:ticket:`30516`).\n\n* Fixed a regression in Django 2.2.1 where auto-reloader unnecessarily reloads\n  translation files multiple times when using ``StatReloader``\n  (:ticket:`30523`).\n\n\n==========================\n   ```\n   \n  \n  \n   ### 2.2.1\n   ```\n   ==========================\n\n*May 1, 2019*\n\nDjango 2.2.1 fixes several bugs in 2.2.\n\nBugfixes\n========\n\n* Fixed a regression in Django 2.1 that caused the incorrect quoting of\n  database user password when using :djadmin:`dbshell` on Oracle\n  (:ticket:`30307`).\n\n* Added compatibility for ``psycopg2`` 2.8 (:ticket:`30331`).\n\n* Fixed a regression in Django 2.2 that caused a crash when loading the\n  template for the technical 500 debug page (:ticket:`30324`).\n\n* Fixed crash of ``ordering`` argument in\n  :class:`~django.contrib.postgres.aggregates.ArrayAgg` and\n  :class:`~django.contrib.postgres.aggregates.StringAgg` when it contains an\n  expression with params (:ticket:`30332`).\n\n* Fixed a regression in Django 2.2 that caused a single instance fast-delete\n  to not set the primary key to ``None`` (:ticket:`30330`).\n\n* Prevented :djadmin:`makemigrations` from generating infinite migrations for\n  check constraints and partial indexes when ``condition`` contains\n  a :class:`~python:range` object (:ticket:`30350`).\n\n* Reverted an optimization in Django 2.2 (:ticket:`29725`) that caused the\n  inconsistent behavior of ``count()`` and ``exists()`` on a reverse\n  many-to-many relationship with a custom manager (:ticket:`30325`).\n\n* Fixed a regression in Django 2.2 where\n  :class:`~django.core.paginator.Paginator` crashes if ``object_list`` is\n  a queryset ordered or aggregated over a nested ``JSONField`` key transform\n  (:ticket:`30335`).\n\n* Fixed a regression in Django 2.2 where ``IntegerField`` validation of\n  database limits crashes if ``limit_value`` attribute in a custom validator is\n  callable (:ticket:`30328`).\n\n* Fixed a regression in Django 2.2 where\n  :class:`~django.contrib.postgres.search.SearchVector` generates SQL that is\n  not indexable (:ticket:`30385`).\n\n* Fixed a regression in Django 2.2 that caused an exception to be raised when\n  a custom error handler could not be imported (:ticket:`30318`).\n\n* Relaxed the system check added in Django 2.2 for the admin app&#39;s dependencies\n  to reallow use of\n  :class:`~django.contrib.sessions.middleware.SessionMiddleware` subclasses,\n  rather than requiring :mod:`django.contrib.sessions` to be in\n  :setting:`INSTALLED_APPS` (:ticket:`30312`).\n\n* Increased the default timeout when using ``Watchman`` to 5 seconds to prevent\n  falling back to ``StatReloader`` on larger projects and made it customizable\n  via the ``DJANGO_WATCHMAN_TIMEOUT`` environment variable (:ticket:`30361`).\n\n* Fixed a regression in Django 2.2 that caused a crash when migrating\n  permissions for proxy models if the target permissions already existed. For\n  example, when a permission had been created manually or a model had been\n  migrated from concrete to proxy (:ticket:`30351`).\n\n* Fixed a regression in Django 2.2 that caused a crash of :djadmin:`runserver`\n  when URLConf modules raised exceptions (:ticket:`30323`).\n\n* Fixed a regression in Django 2.2 where changes were not reliably detected by\n  auto-reloader when using ``StatReloader`` (:ticket:`30323`).\n\n* Fixed a migration crash on Oracle and PostgreSQL when adding a check\n  constraint with a ``contains``, ``startswith``, or ``endswith`` lookup (or\n  their case-insensitive variant) (:ticket:`30408`).\n\n* Fixed a migration crash on Oracle and SQLite when adding a check constraint\n  with ``condition`` contains ``|`` (``OR``) operator (:ticket:`30412`).\n\n\n========================\n   ```\n   \n  \n  \n   ### 2.2\n   ```\n   ========================\n\n*April 1, 2019*\n\nWelcome to Django 2.2!\n\nThese release notes cover the :ref:`new features &lt;whats-new-2.2&gt;`, as well as\nsome :ref:`backwards incompatible changes &lt;backwards-incompatible-2.2&gt;` you&#39;ll\nwant to be aware of when upgrading from Django 2.1 or earlier. We&#39;ve\n:ref:`begun the deprecation process for some features\n&lt;deprecated-features-2.2&gt;`.\n\nSee the :doc:`/howto/upgrade-version` guide if you&#39;re updating an existing\nproject.\n\nDjango 2.2 is designated as a :term:`long-term support release`. It will\nreceive security updates for at least three years after its release. Support\nfor the previous LTS, Django 1.11, will end in April 2020.\n\nPython compatibility\n====================\n\nDjango 2.2 supports Python 3.5, 3.6, and 3.7. We **highly recommend** and only\nofficially support the latest release of each series.\n\n.. _whats-new-2.2:\n\nWhat&#39;s new in Django 2.2\n========================\n\nConstraints\n-----------\n\nThe new :class:`~django.db.models.CheckConstraint` and\n:class:`~django.db.models.UniqueConstraint` classes enable adding custom\ndatabase constraints. Constraints are added to models using the\n:attr:`Meta.constraints &lt;django.db.models.Options.constraints&gt;` option.\n\nMinor features\n--------------\n\n:mod:`django.contrib.admin`\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* Added a CSS class to the column headers of\n  :class:`~django.contrib.admin.TabularInline`.\n\n:mod:`django.contrib.auth`\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* The ``HttpRequest`` is now passed as the first positional argument to\n  :meth:`.RemoteUserBackend.configure_user`, if it accepts it.\n\n:mod:`django.contrib.gis`\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* Added Oracle support for the\n  :class:`~django.contrib.gis.db.models.functions.Envelope` function.\n\n* Added SpatiaLite support for the :lookup:`coveredby` and :lookup:`covers`\n  lookups.\n\n:mod:`django.contrib.postgres`\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* The new ``ordering`` argument for\n  :class:`~django.contrib.postgres.aggregates.ArrayAgg` and\n  :class:`~django.contrib.postgres.aggregates.StringAgg` determines the\n  ordering of the aggregated elements.\n\n* The new :class:`~django.contrib.postgres.indexes.BTreeIndex`,\n  :class:`~django.contrib.postgres.indexes.HashIndex` and\n  :class:`~django.contrib.postgres.indexes.SpGistIndex` classes allow\n  creating ``B-Tree``, ``hash``, and ``SP-GiST`` indexes in the database.\n\n* :class:`~django.contrib.postgres.indexes.BrinIndex` now has the\n  ``autosummarize`` parameter.\n\n* The new ``search_type`` parameter of\n  :class:`~django.contrib.postgres.search.SearchQuery` allows searching for\n  a phrase or raw expression.\n\n:mod:`django.contrib.staticfiles`\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* Added path matching to the :option:`collectstatic --ignore` option so that\n  patterns like ``/vendor/*.js`` can be used.\n\nDatabase backends\n~~~~~~~~~~~~~~~~~\n\n* Added result streaming for :meth:`.QuerySet.iterator` on SQLite.\n\nGeneric Views\n~~~~~~~~~~~~~\n\n* The new :meth:`View.setup &lt;django.views.generic.base.View.setup&gt;` hook\n  initializes view attributes before calling\n  :meth:`~django.views.generic.base.View.dispatch`. It allows mixins to setup\n  instance attributes for reuse in child classes.\n\nInternationalization\n~~~~~~~~~~~~~~~~~~~~\n\n* Added support and translations for the Armenian language.\n\nManagement Commands\n~~~~~~~~~~~~~~~~~~~\n\n* The new :option:`--force-color` option forces colorization of the command\n  output.\n\n* :djadmin:`inspectdb` now creates models for foreign tables on PostgreSQL.\n\n* :option:`inspectdb --include-views` now creates models for materialized views\n  on Oracle and PostgreSQL.\n\n* The new :option:`inspectdb --include-partitions` option allows creating\n  models for partition tables on PostgreSQL. In older versions, models are\n  created child tables instead the parent.\n\n* :djadmin:`inspectdb` now introspects :class:`~django.db.models.DurationField`\n  for Oracle and PostgreSQL, and :class:`~django.db.models.AutoField` for\n  SQLite.\n\n* On Oracle, :djadmin:`dbshell` is wrapped with ``rlwrap``, if available.\n  ``rlwrap`` provides a command history and editing of keyboard input.\n\n* The new :option:`makemigrations --no-header` option avoids writing header\n  comments in generated migration file(s). This option is also available for\n  :djadmin:`squashmigrations`.\n\n* :djadmin:`runserver` can now use `Watchman\n  &lt;https://facebook.github.io/watchman/&gt;`_ to improve the performance of\n  watching a large number of files for changes.\n\nMigrations\n~~~~~~~~~~\n\n* The new :option:`migrate --plan` option prints the list of migration\n  operations that will be performed.\n\n* ``NoneType`` can now be serialized in migrations.\n\n* You can now :ref:`register custom serializers &lt;custom-migration-serializers&gt;`\n  for migrations.\n\nModels\n~~~~~~\n\n* Added support for PostgreSQL operator classes (:attr:`.Index.opclasses`).\n\n* Added support for partial indexes (:attr:`.Index.condition`).\n\n* Added the :class:`~django.db.models.functions.NullIf` and\n  :class:`~django.db.models.functions.Reverse` database functions, as well as\n  many :ref:`math database functions &lt;math-functions&gt;`.\n\n* Setting the new ``ignore_conflicts`` parameter of\n  :meth:`.QuerySet.bulk_create` to ``True`` tells the database to ignore\n  failure to insert rows that fail uniqueness constraints or other checks.\n\n* The new :class:`~django.db.models.functions.ExtractIsoYear` function extracts\n  ISO-8601 week-numbering years from :class:`~django.db.models.DateField` and\n  :class:`~django.db.models.DateTimeField`, and the new :lookup:`iso_year`\n  lookup allows querying by an ISO-8601 week-numbering year.\n\n* The new :meth:`.QuerySet.bulk_update` method allows efficiently updating\n  specific fields on multiple model instances.\n\n* Django no longer always starts a transaction when a single query is being\n  performed, such as ``Model.save()``, ``QuerySet.update()``, and\n  ``Model.delete()``. This improves the performance of autocommit by reducing\n  the number of database round trips.\n\n* Added SQLite support for the :class:`~django.db.models.StdDev` and\n  :class:`~django.db.models.Variance` functions.\n\n* The handling of ``DISTINCT`` aggregation is added to the\n  :class:`~django.db.models.Aggregate` class. Adding :attr:`allow_distinct =\n  True &lt;django.db.models.Aggregate.allow_distinct&gt;` as a class attribute on\n  ``Aggregate`` subclasses allows a ``distinct`` keyword argument to be\n  specified on initialization to ensure that the aggregate function is only\n  called for each distinct value of ``expressions``.\n\n* The :meth:`.RelatedManager.add`, :meth:`~.RelatedManager.create`,\n  :meth:`~.RelatedManager.remove`,  :meth:`~.RelatedManager.set`,\n  ``get_or_create()``, and ``update_or_create()`` methods are now allowed on\n  many-to-many relationships with intermediate models. The new\n  ``through_defaults`` argument is used to specify values for new intermediate\n  model instance(s).\n\nRequests and Responses\n~~~~~~~~~~~~~~~~~~~~~~\n\n* Added :attr:`.HttpRequest.headers` to allow simple access to a request&#39;s\n  headers.\n\nSerialization\n~~~~~~~~~~~~~\n\n* You can now deserialize data using natural keys containing :ref:`forward\n  references &lt;natural-keys-and-forward-references&gt;` by passing\n  ``handle_forward_references=True`` to ``serializers.deserialize()``.\n  Additionally, :djadmin:`loaddata` handles forward references automatically.\n\nTests\n~~~~~\n\n* The new :meth:`.SimpleTestCase.assertURLEqual` assertion checks for a given\n  URL, ignoring the ordering of the query string.\n  :meth:`~.SimpleTestCase.assertRedirects` uses the new assertion.\n\n* The test :class:`~.django.test.Client` now supports automatic JSON\n  serialization of list and tuple ``data`` when\n  ``content_type=&#39;application/json&#39;``.\n\n* The new :setting:`ORACLE_MANAGED_FILES &lt;TEST_ORACLE_MANAGED_FILES&gt;` test\n  database setting allows using Oracle Managed Files (OMF) tablespaces.\n\n* Deferrable database constraints are now checked at the end of each\n  :class:`~django.test.TestCase` test on SQLite 3.20+, just like on other\n  backends that support deferrable constraints. These checks aren&#39;t implemented\n  for older versions of SQLite because they would require expensive table\n  introspection there.\n\n* :class:`~django.test.runner.DiscoverRunner` now skips the setup of databases\n  not :ref:`referenced by tests&lt;testing-multi-db&gt;`.\n\nURLs\n~~~~\n\n* The new :attr:`.ResolverMatch.route` attribute stores the route of the\n  matching URL pattern.\n\nValidators\n~~~~~~~~~~\n\n* :class:`.MaxValueValidator`, :class:`.MinValueValidator`,\n  :class:`.MinLengthValidator`, and :class:`.MaxLengthValidator` now accept\n  a callable ``limit_value``.\n\n.. _backwards-incompatible-2.2:\n\nBackwards incompatible changes in 2.2\n=====================================\n\nDatabase backend API\n--------------------\n\nThis section describes changes that may be needed in third-party database\nbackends.\n\n* Third-party database backends must implement support for table check\n  constraints or set ``DatabaseFeatures.supports_table_check_constraints`` to\n  ``False``.\n\n* Third party database backends must implement support for ignoring\n  constraints or uniqueness errors while inserting or set\n  ``DatabaseFeatures.supports_ignore_conflicts`` to ``False``.\n\n* Third party database backends must implement introspection for\n  ``DurationField`` or set ``DatabaseFeatures.can_introspect_duration_field``\n  to ``False``.\n\n* ``DatabaseFeatures.uses_savepoints`` now defaults to ``True``.\n\n* Third party database backends must implement support for partial indexes or\n  set ``DatabaseFeatures.supports_partial_indexes`` to ``False``.\n\n* ``DatabaseIntrospection.table_name_converter()`` and\n  ``column_name_converter()`` are removed. Third party database backends may\n  need to instead implement ``DatabaseIntrospection.identifier_converter()``.\n  In that case, the constraint names that\n  ``DatabaseIntrospection.get_constraints()`` returns must be normalized by\n  ``identifier_converter()``.\n\n* SQL generation for indexes is moved from :class:`~django.db.models.Index` to\n  ``SchemaEditor`` and these ``SchemaEditor`` methods are added:\n\n  * ``_create_primary_key_sql()`` and ``_delete_primary_key_sql()``\n  * ``_delete_index_sql()`` (to pair with ``_create_index_sql()``)\n  * ``_delete_unique_sql`` (to pair with ``_create_unique_sql()``)\n  * ``_delete_fk_sql()`` (to pair with ``_create_fk_sql()``)\n  * ``_create_check_sql()`` and ``_delete_check_sql()``\n\n* The third argument of ``DatabaseWrapper.__init__()``,\n  ``allow_thread_sharing``, is removed.\n\nAdmin actions are no longer collected from base ``ModelAdmin`` classes\n----------------------------------------------------------------------\n\nFor example, in older versions of Django::\n\n    from django.contrib import admin\n\n    class BaseAdmin(admin.ModelAdmin):\n        actions = [&#39;a&#39;]\n\n    class SubAdmin(BaseAdmin):\n        actions = [&#39;b&#39;]\n\n``SubAdmin`` would have actions ``&#39;a&#39;`` and ``&#39;b&#39;``.\n\nNow ``actions`` follows standard Python inheritance. To get the same result as\nbefore::\n\n    class SubAdmin(BaseAdmin):\n        actions = BaseAdmin.actions + [&#39;b&#39;]\n\n:mod:`django.contrib.gis`\n-------------------------\n\n* Support for GDAL 1.9 and 1.10 is dropped.\n\n``TransactionTestCase`` serialized data loading\n-----------------------------------------------\n\nInitial data migrations are now loaded in\n:class:`~django.test.TransactionTestCase` at the end of the test, after the\ndatabase flush. In older versions, this data was loaded at the beginning of the\ntest, but this prevents the :option:`test --keepdb` option from working\nproperly (the database was empty at the end of the whole test suite). This\nchange shouldn&#39;t have an impact on your tests unless you&#39;ve customized\n:class:`~django.test.TransactionTestCase`&#39;s internals.\n\n``sqlparse`` is required dependency\n-----------------------------------\n\nTo simplify a few parts of Django&#39;s database handling, `sqlparse\n&lt;https://pypi.org/project/sqlparse/&gt;`_ is now a required dependency. It&#39;s\nautomatically installed along with Django.\n\n``cached_property`` aliases\n---------------------------\n\nIn usage like::\n\n    from django.utils.functional import cached_property\n\n    class A:\n\n        cached_property\n        def base(self):\n            return ...\n\n        alias = base\n\n``alias`` is not cached. Where the problem can be detected (Python 3.6 and\nlater), such usage now raises ``TypeError: Cannot assign the same\ncached_property to two different names (&#39;base&#39; and &#39;alias&#39;).``\n\nUse this instead::\n\n    import operator\n\n    class A:\n\n        ...\n\n        alias = property(operator.attrgetter(&#39;base&#39;))\n\nPermissions for proxy models\n----------------------------\n\n:ref:`Permissions for proxy models &lt;proxy-models-permissions-topic&gt;` are now\ncreated using the content type of the proxy model rather than the content type\nof the concrete model. A migration will update existing permissions when you\nrun :djadmin:`migrate`.\n\nIn the admin, the change is transparent for proxy models having the same\n``app_label`` as their concrete model. However, in older versions, users with\npermissions for a proxy model with a *different* ``app_label`` than its\nconcrete model couldn&#39;t access the model in the admin. That&#39;s now fixed, but\nyou might want to audit the permissions assignments for such proxy models\n(``[add|view|change|delete]_myproxy``) prior to upgrading to ensure the new\naccess is appropriate.\n\nFinally, proxy model permission strings must be updated to use their own\n``app_label``. For example, for ``app.MyProxyModel`` inheriting from\n``other_app.ConcreteModel``, update\n``user.has_perm(&#39;other_app.add_myproxymodel&#39;)`` to\n``user.has_perm(&#39;app.add_myproxymodel&#39;)``.\n\nMerging of form ``Media`` assets\n--------------------------------\n\nForm ``Media`` assets are now merged using a topological sort algorithm, as the\nold pairwise merging algorithm is insufficient for some cases. CSS and\nJavaScript files which don&#39;t include their dependencies may now be sorted\nincorrectly (where the old algorithm produced results correctly by\ncoincidence).\n\nAudit all ``Media`` classes for any missing dependencies. For example,\nwidgets depending on ``django.jQuery`` must specify\n``js=[&#39;admin/js/jquery.init.js&#39;, ...]`` when :ref:`declaring form media assets\n&lt;assets-as-a-static-definition&gt;`.\n\nMiscellaneous\n-------------\n\n* To improve readability, the ``UUIDField`` form field now displays values with\n  dashes, e.g. ``550e8400-e29b-41d4-a716-446655440000`` instead of\n  ``550e8400e29b41d4a716446655440000``.\n\n* On SQLite, ``PositiveIntegerField`` and ``PositiveSmallIntegerField`` now\n  include a check constraint to prevent negative values in the database. If you\n  have existing invalid data and run a migration that recreates a table, you&#39;ll\n  see ``CHECK constraint failed``.\n\n* For consistency with WSGI servers, the test client now sets the\n  ``Content-Length`` header to a string rather than an integer.\n\n* The return value of :func:`django.utils.text.slugify` is no longer marked as\n  HTML safe.\n\n* The default truncation character used by the :tfilter:`urlizetrunc`,\n  :tfilter:`truncatechars`, :tfilter:`truncatechars_html`,\n  :tfilter:`truncatewords`, and :tfilter:`truncatewords_html` template filters\n  is now the real ellipsis character (``…``) instead of 3 dots. You may have to\n  adapt some test output comparisons.\n\n* Support for bytestring paths in the template filesystem loader is removed.\n\n* :func:`django.utils.http.urlsafe_base64_encode` now returns a string instead\n  of a bytestring, and :func:`django.utils.http.urlsafe_base64_decode` may no\n  longer be passed a bytestring.\n\n* Support for ``cx_Oracle`` &lt; 6.0 is removed.\n\n* The minimum supported version of ``mysqlclient`` is increased from 1.3.7 to\n  1.3.13.\n\n* The minimum supported version of SQLite is increased from 3.7.15 to 3.8.3.\n\n* In an attempt to provide more semantic query data, ``NullBooleanSelect`` now\n  renders ``&lt;option&gt;`` values of ``unknown``, ``true``, and ``false`` instead\n  of ``1``, ``2``, and ``3``. For backwards compatibility, the old values are\n  still accepted as data.\n\n* :attr:`Group.name &lt;django.contrib.auth.models.Group.name&gt;` ``max_length``\n  is increased from 80 to 150 characters.\n\n* Tests that violate deferrable database constraints now error when run on\n  SQLite 3.20+, just like on other backends that support such constraints.\n\n* To catch usage mistakes, the test :class:`~django.test.Client` and\n  :func:`django.utils.http.urlencode` now raise ``TypeError`` if ``None`` is\n  passed as a value to encode because ``None`` can&#39;t be encoded in GET and POST\n  data. Either pass an empty string or omit the value.\n\n* The :djadmin:`ping_google` management command now defaults to ``https``\n  instead of ``http`` for the sitemap&#39;s URL. If your site uses http, use the\n  new :option:`ping_google --sitemap-uses-http` option. If you use the\n  :func:`~django.contrib.sitemaps.ping_google` function, set the new\n  ``sitemap_uses_https`` argument to ``False``.\n\n* :djadmin:`runserver` no longer supports `pyinotify` (replaced by Watchman).\n\n* The :class:`~django.db.models.Avg`, :class:`~django.db.models.StdDev`, and\n  :class:`~django.db.models.Variance` aggregate functions now return a\n  ``Decimal`` instead of a ``float`` when the input is ``Decimal``.\n\n* Tests will fail on SQLite if apps without migrations have relations to apps\n  with migrations. This has been a documented restriction since migrations were\n  added in Django 1.7, but it fails more reliably now. You&#39;ll see tests failing\n  with errors like ``no such table: &lt;app_label&gt;_&lt;model&gt;``. This was observed\n  with several third-party apps that had models in tests without migrations.\n  You must add migrations for such models.\n\n.. _deprecated-features-2.2:\n\nFeatures deprecated in 2.2\n==========================\n\nModel ``Meta.ordering`` will no longer affect ``GROUP BY`` queries\n------------------------------------------------------------------\n\nA model&#39;s ``Meta.ordering`` affecting ``GROUP BY`` queries (such as\n``.annotate().values()``) is a common source of confusion. Such queries now\nissue a deprecation warning with the advice to add an ``order_by()`` to retain\nthe current query. ``Meta.ordering`` will be ignored in such queries starting\nin Django 3.1.\n\nMiscellaneous\n-------------\n\n* ``django.utils.timezone.FixedOffset`` is deprecated in favor of\n  :class:`datetime.timezone`.\n\n* The undocumented ``QuerySetPaginator`` alias of\n  ``django.core.paginator.Paginator`` is deprecated.\n\n* The ``FloatRangeField`` model and form fields in ``django.contrib.postgres``\n  are deprecated in favor of a new name, ``DecimalRangeField``, to match the\n  underlying ``numrange`` data type used in the database.\n\n* The ``FILE_CHARSET`` setting is deprecated. Starting with Django 3.1, files\n  read from disk must be UTF-8 encoded.\n\n* ``django.contrib.staticfiles.storage.CachedStaticFilesStorage`` is\n  deprecated due to the intractable problems that it has. Use\n  :class:`.ManifestStaticFilesStorage` or a third-party cloud storage instead.\n\n* :meth:`.RemoteUserBackend.configure_user` is now passed ``request`` as the\n  first positional argument, if it accepts it. Support for overrides that don&#39;t\n  accept it will be removed in Django 3.1.\n\n* The :attr:`.SimpleTestCase.allow_database_queries`,\n  :attr:`.TransactionTestCase.multi_db`, and :attr:`.TestCase.multi_db`\n  attributes are deprecated in favor of :attr:`.SimpleTestCase.databases`,\n  :attr:`.TransactionTestCase.databases`, and :attr:`.TestCase.databases`.\n  These new attributes allow databases dependencies to be declared in order to\n  prevent unexpected queries against non-default databases to leak state\n  between tests. The previous behavior of ``allow_database_queries=True`` and\n  ``multi_db=True`` can be achieved by setting ``databases=&#39;__all__&#39;``.\n\n\n===========================\n   ```\n   \n  \n  \n   ### 2.1.11\n   ```\n   ===========================\n\n*August 1, 2019*\n\nDjango 2.1.11 fixes security issues in 2.1.10.\n\nCVE-2019-14232: Denial-of-service possibility in ``django.utils.text.Truncator``\n================================================================================\n\nIf ``django.utils.text.Truncator``&#39;s ``chars()`` and ``words()`` methods\nwere passed the ``html=True`` argument, they were extremely slow to evaluate\ncertain inputs due to a catastrophic backtracking vulnerability in a regular\nexpression. The ``chars()`` and ``words()`` methods are used to implement the\n:tfilter:`truncatechars_html` and :tfilter:`truncatewords_html` template\nfilters, which were thus vulnerable.\n\nThe regular expressions used by ``Truncator`` have been simplified in order to\navoid potential backtracking issues. As a consequence, trailing punctuation may\nnow at times be included in the truncated output.\n\nCVE-2019-14233: Denial-of-service possibility in ``strip_tags()``\n=================================================================\n\nDue to the behavior of the underlying ``HTMLParser``,\n:func:`django.utils.html.strip_tags` would be extremely slow to evaluate\ncertain inputs containing large sequences of nested incomplete HTML entities.\nThe ``strip_tags()`` method is used to implement the corresponding\n:tfilter:`striptags` template filter, which was thus also vulnerable.\n\n``strip_tags()`` now avoids recursive calls to ``HTMLParser`` when progress\nremoving tags, but necessarily incomplete HTML entities, stops being made.\n\nRemember that absolutely NO guarantee is provided about the results of\n``strip_tags()`` being HTML safe. So NEVER mark safe the result of a\n``strip_tags()`` call without escaping it first, for example with\n:func:`django.utils.html.escape`.\n\nCVE-2019-14234: SQL injection possibility in key and index lookups for ``JSONField``/``HStoreField``\n====================================================================================================\n\n:lookup:`Key and index lookups &lt;jsonfield.key&gt;` for\n:class:`~django.contrib.postgres.fields.JSONField` and :lookup:`key lookups\n&lt;hstorefield.key&gt;` for :class:`~django.contrib.postgres.fields.HStoreField`\nwere subject to SQL injection, using a suitably crafted dictionary, with\ndictionary expansion, as the ``**kwargs`` passed to ``QuerySet.filter()``.\n\nCVE-2019-14235: Potential memory exhaustion in ``django.utils.encoding.uri_to_iri()``\n=====================================================================================\n\nIf passed certain inputs, :func:`django.utils.encoding.uri_to_iri` could lead\nto significant memory usage due to excessive recursion when re-percent-encoding\ninvalid UTF-8 octet sequences.\n\n``uri_to_iri()`` now avoids recursion when re-percent-encoding invalid UTF-8\noctet sequences.\n\n\n===========================\n   ```\n   \n  \n  \n   ### 2.1.10\n   ```\n   ===========================\n\n*July 1, 2019*\n\nDjango 2.1.10 fixes a security issue in 2.1.9.\n\nCVE-2019-12781: Incorrect HTTP detection with reverse-proxy connecting via HTTPS\n--------------------------------------------------------------------------------\n\nWhen deployed behind a reverse-proxy connecting to Django via HTTPS,\n:attr:`django.http.HttpRequest.scheme` would incorrectly detect client\nrequests made via HTTP as using HTTPS. This entails incorrect res","created_at":"2019-08-12T19:31:33Z","updated_at":"2019-08-19T19:32:36Z","closed_at":"2019-08-19T19:32:36Z","merged_at":null,"merge_commit_sha":"47eb5edf8edb29ec9a092af1a2d48eef56188628","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/sjansen/mecha-django-demo/pulls/22/commits","review_comments_url":"https://api.github.com/repos/sjansen/mecha-django-demo/pulls/22/comments","review_comment_url":"https://api.github.com/repos/sjansen/mecha-django-demo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/sjansen/mecha-django-demo/issues/22/comments","statuses_url":"https://api.github.com/repos/sjansen/mecha-django-demo/statuses/5aa8fe1383f3d4ca66ea109b0820f7909559afa8","head":{"label":"sjansen:pyup-scheduled-update-2019-08-12","ref":"pyup-scheduled-update-2019-08-12","sha":"5aa8fe1383f3d4ca66ea109b0820f7909559afa8","user":{"login":"sjansen","id":59928,"node_id":"MDQ6VXNlcjU5OTI4","avatar_url":"https://avatars3.githubusercontent.com/u/59928?v=4","gravatar_id":"","url":"https://api.github.com/users/sjansen","html_url":"https://github.com/sjansen","followers_url":"https://api.github.com/users/sjansen/followers","following_url":"https://api.github.com/users/sjansen/following{/other_user}","gists_url":"https://api.github.com/users/sjansen/gists{/gist_id}","starred_url":"https://api.github.com/users/sjansen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sjansen/subscriptions","organizations_url":"https://api.github.com/users/sjansen/orgs","repos_url":"https://api.github.com/users/sjansen/repos","events_url":"https://api.github.com/users/sjansen/events{/privacy}","received_events_url":"https://api.github.com/users/sjansen/received_events","type":"User","site_admin":false},"repo":{"id":149838666,"node_id":"MDEwOlJlcG9zaXRvcnkxNDk4Mzg2NjY=","name":"mecha-django-demo","full_name":"sjansen/mecha-django-demo","private":false,"owner":{"login":"sjansen","id":59928,"node_id":"MDQ6VXNlcjU5OTI4","avatar_url":"https://avatars3.githubusercontent.com/u/59928?v=4","gravatar_id":"","url":"https://api.github.com/users/sjansen","html_url":"https://github.com/sjansen","followers_url":"https://api.github.com/users/sjansen/followers","following_url":"https://api.github.com/users/sjansen/following{/other_user}","gists_url":"https://api.github.com/users/sjansen/gists{/gist_id}","starred_url":"https://api.github.com/users/sjansen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sjansen/subscriptions","organizations_url":"https://api.github.com/users/sjansen/orgs","repos_url":"https://api.github.com/users/sjansen/repos","events_url":"https://api.github.com/users/sjansen/events{/privacy}","received_events_url":"https://api.github.com/users/sjansen/received_events","type":"User","site_admin":false},"html_url":"https://github.com/sjansen/mecha-django-demo","description":null,"fork":false,"url":"https://api.github.com/repos/sjansen/mecha-django-demo","forks_url":"https://api.github.com/repos/sjansen/mecha-django-demo/forks","keys_url":"https://api.github.com/repos/sjansen/mecha-django-demo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sjansen/mecha-django-demo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sjansen/mecha-django-demo/teams","hooks_url":"https://api.github.com/repos/sjansen/mecha-django-demo/hooks","issue_events_url":"https://api.github.com/repos/sjansen/mecha-django-demo/issues/events{/number}","events_url":"https://api.github.com/repos/sjansen/mecha-django-demo/events","assignees_url":"https://api.github.com/repos/sjansen/mecha-django-demo/assignees{/user}","branches_url":"https://api.github.com/repos/sjansen/mecha-django-demo/branches{/branch}","tags_url":"https://api.github.com/repos/sjansen/mecha-django-demo/tags","blobs_url":"https://api.github.com/repos/sjansen/mecha-django-demo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sjansen/mecha-django-demo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sjansen/mecha-django-demo/git/refs{/sha}","trees_url":"https://api.github.com/repos/sjansen/mecha-django-demo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sjansen/mecha-django-demo/statuses/{sha}","languages_url":"https://api.github.com/repos/sjansen/mecha-django-demo/languages","stargazers_url":"https://api.github.com/repos/sjansen/mecha-django-demo/stargazers","contributors_url":"https://api.github.com/repos/sjansen/mecha-django-demo/contributors","subscribers_url":"https://api.github.com/repos/sjansen/mecha-django-demo/subscribers","subscription_url":"https://api.github.com/repos/sjansen/mecha-django-demo/subscription","commits_url":"https://api.github.com/repos/sjansen/mecha-django-demo/commits{/sha}","git_commits_url":"https://api.github.com/repos/sjansen/mecha-django-demo/git/commits{/sha}","comments_url":"https://api.github.com/repos/sjansen/mecha-django-demo/comments{/number}","issue_comment_url":"https://api.github.com/repos/sjansen/mecha-django-demo/issues/comments{/number}","contents_url":"https://api.github.com/repos/sjansen/mecha-django-demo/contents/{+path}","compare_url":"https://api.github.com/repos/sjansen/mecha-django-demo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sjansen/mecha-django-demo/merges","archive_url":"https://api.github.com/repos/sjansen/mecha-django-demo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sjansen/mecha-django-demo/downloads","issues_url":"https://api.github.com/repos/sjansen/mecha-django-demo/issues{/number}","pulls_url":"https://api.github.com/repos/sjansen/mecha-django-demo/pulls{/number}","milestones_url":"https://api.github.com/repos/sjansen/mecha-django-demo/milestones{/number}","notifications_url":"https://api.github.com/repos/sjansen/mecha-django-demo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sjansen/mecha-django-demo/labels{/name}","releases_url":"https://api.github.com/repos/sjansen/mecha-django-demo/releases{/id}","deployments_url":"https://api.github.com/repos/sjansen/mecha-django-demo/deployments","created_at":"2018-09-22T02:33:21Z","updated_at":"2019-02-27T03:49:00Z","pushed_at":"2019-08-19T19:32:32Z","git_url":"git://github.com/sjansen/mecha-django-demo.git","ssh_url":"git@github.com:sjansen/mecha-django-demo.git","clone_url":"https://github.com/sjansen/mecha-django-demo.git","svn_url":"https://github.com/sjansen/mecha-django-demo","homepage":null,"size":20,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":1,"license":null,"forks":1,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"sjansen:master","ref":"master","sha":"f2893cb836c621f2568bab16d8b8a9be30ea795e","user":{"login":"sjansen","id":59928,"node_id":"MDQ6VXNlcjU5OTI4","avatar_url":"https://avatars3.githubusercontent.com/u/59928?v=4","gravatar_id":"","url":"https://api.github.com/users/sjansen","html_url":"https://github.com/sjansen","followers_url":"https://api.github.com/users/sjansen/followers","following_url":"https://api.github.com/users/sjansen/following{/other_user}","gists_url":"https://api.github.com/users/sjansen/gists{/gist_id}","starred_url":"https://api.github.com/users/sjansen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sjansen/subscriptions","organizations_url":"https://api.github.com/users/sjansen/orgs","repos_url":"https://api.github.com/users/sjansen/repos","events_url":"https://api.github.com/users/sjansen/events{/privacy}","received_events_url":"https://api.github.com/users/sjansen/received_events","type":"User","site_admin":false},"repo":{"id":149838666,"node_id":"MDEwOlJlcG9zaXRvcnkxNDk4Mzg2NjY=","name":"mecha-django-demo","full_name":"sjansen/mecha-django-demo","private":false,"owner":{"login":"sjansen","id":59928,"node_id":"MDQ6VXNlcjU5OTI4","avatar_url":"https://avatars3.githubusercontent.com/u/59928?v=4","gravatar_id":"","url":"https://api.github.com/users/sjansen","html_url":"https://github.com/sjansen","followers_url":"https://api.github.com/users/sjansen/followers","following_url":"https://api.github.com/users/sjansen/following{/other_user}","gists_url":"https://api.github.com/users/sjansen/gists{/gist_id}","starred_url":"https://api.github.com/users/sjansen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sjansen/subscriptions","organizations_url":"https://api.github.com/users/sjansen/orgs","repos_url":"https://api.github.com/users/sjansen/repos","events_url":"https://api.github.com/users/sjansen/events{/privacy}","received_events_url":"https://api.github.com/users/sjansen/received_events","type":"User","site_admin":false},"html_url":"https://github.com/sjansen/mecha-django-demo","description":null,"fork":false,"url":"https://api.github.com/repos/sjansen/mecha-django-demo","forks_url":"https://api.github.com/repos/sjansen/mecha-django-demo/forks","keys_url":"https://api.github.com/repos/sjansen/mecha-django-demo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sjansen/mecha-django-demo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sjansen/mecha-django-demo/teams","hooks_url":"https://api.github.com/repos/sjansen/mecha-django-demo/hooks","issue_events_url":"https://api.github.com/repos/sjansen/mecha-django-demo/issues/events{/number}","events_url":"https://api.github.com/repos/sjansen/mecha-django-demo/events","assignees_url":"https://api.github.com/repos/sjansen/mecha-django-demo/assignees{/user}","branches_url":"https://api.github.com/repos/sjansen/mecha-django-demo/branches{/branch}","tags_url":"https://api.github.com/repos/sjansen/mecha-django-demo/tags","blobs_url":"https://api.github.com/repos/sjansen/mecha-django-demo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sjansen/mecha-django-demo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sjansen/mecha-django-demo/git/refs{/sha}","trees_url":"https://api.github.com/repos/sjansen/mecha-django-demo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sjansen/mecha-django-demo/statuses/{sha}","languages_url":"https://api.github.com/repos/sjansen/mecha-django-demo/languages","stargazers_url":"https://api.github.com/repos/sjansen/mecha-django-demo/stargazers","contributors_url":"https://api.github.com/repos/sjansen/mecha-django-demo/contributors","subscribers_url":"https://api.github.com/repos/sjansen/mecha-django-demo/subscribers","subscription_url":"https://api.github.com/repos/sjansen/mecha-django-demo/subscription","commits_url":"https://api.github.com/repos/sjansen/mecha-django-demo/commits{/sha}","git_commits_url":"https://api.github.com/repos/sjansen/mecha-django-demo/git/commits{/sha}","comments_url":"https://api.github.com/repos/sjansen/mecha-django-demo/comments{/number}","issue_comment_url":"https://api.github.com/repos/sjansen/mecha-django-demo/issues/comments{/number}","contents_url":"https://api.github.com/repos/sjansen/mecha-django-demo/contents/{+path}","compare_url":"https://api.github.com/repos/sjansen/mecha-django-demo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sjansen/mecha-django-demo/merges","archive_url":"https://api.github.com/repos/sjansen/mecha-django-demo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sjansen/mecha-django-demo/downloads","issues_url":"https://api.github.com/repos/sjansen/mecha-django-demo/issues{/number}","pulls_url":"https://api.github.com/repos/sjansen/mecha-django-demo/pulls{/number}","milestones_url":"https://api.github.com/repos/sjansen/mecha-django-demo/milestones{/number}","notifications_url":"https://api.github.com/repos/sjansen/mecha-django-demo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sjansen/mecha-django-demo/labels{/name}","releases_url":"https://api.github.com/repos/sjansen/mecha-django-demo/releases{/id}","deployments_url":"https://api.github.com/repos/sjansen/mecha-django-demo/deployments","created_at":"2018-09-22T02:33:21Z","updated_at":"2019-02-27T03:49:00Z","pushed_at":"2019-08-19T19:32:32Z","git_url":"git://github.com/sjansen/mecha-django-demo.git","ssh_url":"git@github.com:sjansen/mecha-django-demo.git","clone_url":"https://github.com/sjansen/mecha-django-demo.git","svn_url":"https://github.com/sjansen/mecha-django-demo","homepage":null,"size":20,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":1,"license":null,"forks":1,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/sjansen/mecha-django-demo/pulls/22"},"html":{"href":"https://github.com/sjansen/mecha-django-demo/pull/22"},"issue":{"href":"https://api.github.com/repos/sjansen/mecha-django-demo/issues/22"},"comments":{"href":"https://api.github.com/repos/sjansen/mecha-django-demo/issues/22/comments"},"review_comments":{"href":"https://api.github.com/repos/sjansen/mecha-django-demo/pulls/22/comments"},"review_comment":{"href":"https://api.github.com/repos/sjansen/mecha-django-demo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/sjansen/mecha-django-demo/pulls/22/commits"},"statuses":{"href":"https://api.github.com/repos/sjansen/mecha-django-demo/statuses/5aa8fe1383f3d4ca66ea109b0820f7909559afa8"}},"author_association":"NONE","merged":false,"mergeable":true,"rebaseable":true,"mergeable_state":"clean","merged_by":null,"comments":1,"review_comments":0,"maintainer_can_modify":false,"commits":22,"additions":22,"deletions":22,"changed_files":2}}
{"actor":{"display_login":"pyup-bot"}}