import logging
import os
import time
from django.core.management import call_command
from django.http import HttpResponse
from products.models.models import AppVersion
LOG = logging.getLogger(__name__)
# Used for testing locally when the GAE_VERSION environment is not set
FAKE_VERSION_TESTING = 8
class MigrateMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
start_time = time.time()
try:
LOG.info("Running migrate middleware")
# Figure out what version of our app is now deployed
app_version, created = AppVersion.objects.get_or_create(version=os.getenv('GAE_VERSION', FAKE_VERSION_TESTING))
if not app_version.migrations_succeeded or created:
# Previous attempt at this deployed version failed, or this was a new deployment.
try:
call_command('migrate')
except:
return HttpResponse("Running a Django migration failed! Investigate.", status=500)
app_version.migrations_succeeded = True
app_version.save()
finally:
LOG.info("Took: %ss", time.time() - start_time)
return self.get_response(request)