applications: mark relation as in error on scan failure (#71452)
mark relation, and not element
This commit is contained in:
parent
8ea3ded995
commit
c24f7ee58a
|
@ -0,0 +1,31 @@
|
|||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('applications', '0009_job_progression'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='element',
|
||||
name='error',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='element',
|
||||
name='error_status',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='relation',
|
||||
name='error',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='relation',
|
||||
name='error_status',
|
||||
field=models.CharField(
|
||||
choices=[('notfound', 'Not Found'), ('error', 'Error')], max_length=100, null=True
|
||||
),
|
||||
),
|
||||
]
|
|
@ -136,20 +136,20 @@ class Application(models.Model):
|
|||
finished = False
|
||||
while not finished:
|
||||
finished = True
|
||||
for el in [x[0] for x in elements.values()]:
|
||||
for el, rel in list(elements.values()):
|
||||
dependencies_url = el.cache['urls'].get('dependencies')
|
||||
if not dependencies_url:
|
||||
continue
|
||||
response = requests.get(dependencies_url)
|
||||
if not response.ok:
|
||||
el.set_error(response.status_code)
|
||||
rel.set_error(response.status_code)
|
||||
raise ScanError(
|
||||
_(
|
||||
'Failed to scan "%s" (type %s, slug %s) dependencies (%s)'
|
||||
% (el.name, el.type, el.slug, response.status_code)
|
||||
)
|
||||
)
|
||||
el.reset_error()
|
||||
rel.reset_error()
|
||||
for dependency in response.json()['data']:
|
||||
if (dependency['type'], dependency['id']) in elements:
|
||||
continue
|
||||
|
@ -173,15 +173,6 @@ class Element(models.Model):
|
|||
slug = models.SlugField(max_length=500, verbose_name=_('Slug'))
|
||||
name = models.CharField(max_length=500, verbose_name=_('Name'))
|
||||
cache = JSONField(blank=True, default=dict)
|
||||
error = models.BooleanField(default=False)
|
||||
error_status = models.CharField(
|
||||
max_length=100,
|
||||
choices=[
|
||||
('notfound', _('Not Found')),
|
||||
('error', _('Error')),
|
||||
],
|
||||
null=True,
|
||||
)
|
||||
|
||||
def __repr__(self):
|
||||
return '<Element %s/%s>' % (self.type, self.slug)
|
||||
|
@ -196,6 +187,24 @@ class Element(models.Model):
|
|||
if self.cache['urls'].get('export'):
|
||||
return '%sredirect/' % self.cache['urls']['export']
|
||||
|
||||
|
||||
class Relation(models.Model):
|
||||
application = models.ForeignKey(Application, on_delete=models.CASCADE)
|
||||
element = models.ForeignKey(Element, on_delete=models.CASCADE)
|
||||
auto_dependency = models.BooleanField(default=False)
|
||||
error = models.BooleanField(default=False)
|
||||
error_status = models.CharField(
|
||||
max_length=100,
|
||||
choices=[
|
||||
('notfound', _('Not Found')),
|
||||
('error', _('Error')),
|
||||
],
|
||||
null=True,
|
||||
)
|
||||
|
||||
def __repr__(self):
|
||||
return '<Relation %s - %s/%s>' % (self.application.slug, self.element.type, self.element.slug)
|
||||
|
||||
def set_error(self, http_status_code):
|
||||
self.error = True
|
||||
self.error_status = 'notfound' if http_status_code == 404 else 'error'
|
||||
|
@ -207,15 +216,6 @@ class Element(models.Model):
|
|||
self.save()
|
||||
|
||||
|
||||
class Relation(models.Model):
|
||||
application = models.ForeignKey(Application, on_delete=models.CASCADE)
|
||||
element = models.ForeignKey(Element, on_delete=models.CASCADE)
|
||||
auto_dependency = models.BooleanField(default=False)
|
||||
|
||||
def __repr__(self):
|
||||
return '<Relation %s - %s/%s>' % (self.application.slug, self.element.type, self.element.slug)
|
||||
|
||||
|
||||
class Version(models.Model):
|
||||
application = models.ForeignKey(Application, on_delete=models.CASCADE)
|
||||
number = models.CharField(max_length=100, verbose_name=_('Number'))
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
{% for relation in relations %}
|
||||
<li {% if relation.auto_dependency %}class="auto-dependency"{% endif %}>
|
||||
<a {% if relation.element.get_redirect_url %}href="{{ relation.element.get_redirect_url }}"{% endif %}>
|
||||
{% if relation.element.error %}<span class="tag tag-error">{{ relation.element.get_error_status_display }}</span>{% endif %}
|
||||
{% if relation.error %}<span class="tag tag-error">{{ relation.get_error_status_display }}</span>{% endif %}
|
||||
{{ relation.element.name }} <span class="extra-info">- {{ relation.element.type_label }}</span>
|
||||
</a>
|
||||
{% if app.editable and not relation.auto_dependency %}<a rel="popup" class="delete" href="{% url 'application-delete-element' app_slug=app.slug pk=relation.id %}">{% trans "remove" %}</a>{% endif %}
|
||||
|
|
|
@ -471,7 +471,7 @@ def test_scandeps_on_unknown_element(app, admin_user, settings):
|
|||
}
|
||||
},
|
||||
)
|
||||
Relation.objects.create(application=application, element=element)
|
||||
relation = Relation.objects.create(application=application, element=element)
|
||||
|
||||
def response_content(url, request):
|
||||
if url.path == '/api/export-import/forms/unknown/dependencies/':
|
||||
|
@ -487,9 +487,9 @@ def test_scandeps_on_unknown_element(app, admin_user, settings):
|
|||
job = AsyncJob.objects.latest('pk')
|
||||
assert job.status == 'failed'
|
||||
assert job.exception == 'Failed to scan "Unknown" (type forms, slug unknown) dependencies (404)'
|
||||
element.refresh_from_db()
|
||||
assert element.error is True
|
||||
assert element.error_status == 'notfound'
|
||||
relation.refresh_from_db()
|
||||
assert relation.error is True
|
||||
assert relation.error_status == 'notfound'
|
||||
|
||||
def response_content(url, request):
|
||||
if url.path == '/api/export-import/forms/unknown/dependencies/':
|
||||
|
@ -503,17 +503,17 @@ def test_scandeps_on_unknown_element(app, admin_user, settings):
|
|||
job = AsyncJob.objects.latest('pk')
|
||||
assert job.status == 'failed'
|
||||
assert job.exception == 'Failed to scan "Unknown" (type forms, slug unknown) dependencies (500)'
|
||||
element.refresh_from_db()
|
||||
assert element.error is True
|
||||
assert element.error_status == 'error'
|
||||
relation.refresh_from_db()
|
||||
assert relation.error is True
|
||||
assert relation.error_status == 'error'
|
||||
|
||||
with HTTMock(mocked_http):
|
||||
app.get('/applications/manifest/test/scandeps/').follow()
|
||||
job = AsyncJob.objects.latest('pk')
|
||||
assert job.status == 'completed'
|
||||
element.refresh_from_db()
|
||||
assert element.error is False
|
||||
assert element.error_status is None
|
||||
relation.refresh_from_db()
|
||||
assert relation.error is False
|
||||
assert relation.error_status is None
|
||||
|
||||
|
||||
def test_scandeps_on_renamed_element(app, admin_user, settings):
|
||||
|
|
Loading…
Reference in New Issue