diff --git a/readthedocs/builds/migrations/0038_add_new_jsonfields.py b/readthedocs/builds/migrations/0038_add_new_jsonfields.py index 6dc7923a9f4..14ba17c72dc 100644 --- a/readthedocs/builds/migrations/0038_add_new_jsonfields.py +++ b/readthedocs/builds/migrations/0038_add_new_jsonfields.py @@ -13,6 +13,6 @@ class Migration(migrations.Migration): migrations.AddField( model_name='build', name='_config_json', - field=models.JSONField(default=dict, verbose_name='Configuration used in the build'), + field=models.JSONField(null=True, blank=True, verbose_name='Configuration used in the build'), ), ] diff --git a/readthedocs/builds/migrations/0040_remove_old_jsonfields.py b/readthedocs/builds/migrations/0040_remove_old_jsonfields.py deleted file mode 100644 index 6d0cfd07d86..00000000000 --- a/readthedocs/builds/migrations/0040_remove_old_jsonfields.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 3.2.11 on 2022-01-31 12:12 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('builds', '0039_migrate_config_data'), - ] - - operations = [ - migrations.RemoveField( - model_name='build', - name='_config', - ), - migrations.RenameField( - model_name='build', - old_name='_config_json', - new_name='_config', - ), - ] diff --git a/readthedocs/builds/models.py b/readthedocs/builds/models.py index 5b2281ca734..34a7fee2c29 100644 --- a/readthedocs/builds/models.py +++ b/readthedocs/builds/models.py @@ -19,6 +19,7 @@ ModificationDateTimeField, ) from django_extensions.db.models import TimeStampedModel +from jsonfield import JSONField from polymorphic.models import PolymorphicModel import readthedocs.builds.automation_actions as actions @@ -661,7 +662,12 @@ class Build(models.Model): null=True, blank=True, ) - _config = models.JSONField(_('Configuration used in the build'), default=dict) + _config = JSONField(_('Configuration used in the build'), default=dict) + _config_json = models.JSONField( + _('Configuration used in the build'), + null=True, + blank=True, + ) length = models.IntegerField(_('Build Length'), null=True, blank=True) diff --git a/readthedocs/integrations/migrations/0008_add_new_jsonfields.py b/readthedocs/integrations/migrations/0008_add_new_jsonfields.py index 99fd29cc209..8dd52916ee2 100644 --- a/readthedocs/integrations/migrations/0008_add_new_jsonfields.py +++ b/readthedocs/integrations/migrations/0008_add_new_jsonfields.py @@ -13,16 +13,16 @@ class Migration(migrations.Migration): migrations.AddField( model_name='httpexchange', name='request_headers_json', - field=models.JSONField(default=None, null=True, verbose_name='Request headers'), + field=models.JSONField(null=True, blank=True, verbose_name='Request headers'), ), migrations.AddField( model_name='httpexchange', name='response_headers_json', - field=models.JSONField(default=None, null=True, verbose_name='Request headers'), + field=models.JSONField(null=True, blank=True, verbose_name='Request headers'), ), migrations.AddField( model_name='integration', name='provider_data_json', - field=models.JSONField(default=dict, verbose_name='Provider data'), + field=models.JSONField(null=True, blank=True, verbose_name='Provider data'), ), ] diff --git a/readthedocs/integrations/migrations/0010_remove_old_jsonfields.py b/readthedocs/integrations/migrations/0010_remove_old_jsonfields.py deleted file mode 100644 index c1f53454b88..00000000000 --- a/readthedocs/integrations/migrations/0010_remove_old_jsonfields.py +++ /dev/null @@ -1,40 +0,0 @@ -# Generated by Django 3.2.11 on 2022-01-31 12:12 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('integrations', '0009_migrate_headers_data'), - ] - - operations = [ - migrations.RemoveField( - model_name='httpexchange', - name='request_headers', - ), - migrations.RemoveField( - model_name='httpexchange', - name='response_headers', - ), - migrations.RemoveField( - model_name='integration', - name='provider_data', - ), - migrations.RenameField( - model_name='httpexchange', - old_name='request_headers_json', - new_name='request_headers', - ), - migrations.RenameField( - model_name='httpexchange', - old_name='response_headers_json', - new_name='response_headers', - ), - migrations.RenameField( - model_name='integration', - old_name='provider_data_json', - new_name='provider_data', - ), - ] diff --git a/readthedocs/integrations/models.py b/readthedocs/integrations/models.py index bd0e17ae5fc..54ed9568bc1 100644 --- a/readthedocs/integrations/models.py +++ b/readthedocs/integrations/models.py @@ -12,6 +12,7 @@ from django.db import models, transaction from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ +from jsonfield import JSONField from pygments import highlight from pygments.formatters import HtmlFormatter from pygments.lexers import JsonLexer @@ -101,15 +102,12 @@ def from_requests_exchange(self, response, related_object): :param related_object: Object to use for generic relationship. """ request = response.request - # NOTE: we need to cast ``request.headers`` and ``response.headers`` - # because it's a ``requests.structures.CaseInsensitiveDict`` which is - # not JSON serializable. obj = self.create( related_object=related_object, - request_headers=dict(request.headers) or {}, + request_headers=request.headers or {}, request_body=request.body or '', status_code=response.status_code, - response_headers=dict(response.headers), + response_headers=response.headers, response_body=response.text, ) self.delete_limit(related_object) @@ -146,19 +144,21 @@ class HttpExchange(models.Model): date = models.DateTimeField(_('Date'), auto_now_add=True) - request_headers = models.JSONField( + request_headers = JSONField(_('Request headers')) + request_headers_json = models.JSONField( _('Request headers'), # Delete after deploy null=True, - default=None, + blank=True, ) request_body = models.TextField(_('Request body')) - response_headers = models.JSONField( + response_headers = JSONField(_('Request headers')) + response_headers_json = models.JSONField( _('Request headers'), # Delete after deploy null=True, - default=None, + blank=True, ) response_body = models.TextField(_('Response body')) @@ -298,7 +298,12 @@ class Integration(models.Model): max_length=32, choices=INTEGRATIONS, ) - provider_data = models.JSONField(_('Provider data'), default=dict) + provider_data = JSONField(_('Provider data'), default=dict) + provider_data_json = models.JSONField( + _('Provider data'), + null=True, + blank=True, + ) exchanges = GenericRelation( 'HttpExchange', related_query_name='integrations', diff --git a/requirements/pip.txt b/requirements/pip.txt index b66562abf49..7be390f5bb6 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -21,10 +21,6 @@ drf-flex-fields==0.9.7 drf-extensions==0.7.1 django-vanilla-views==3.0.0 - -# This module is only used on migrations. We are now using Django's official -# JSONField. We should probably squash these migrations and remove this -# dependency as well. jsonfield==3.1.0 requests==2.27.1