applications: mark relation as in error on scan failure (#71452)
gitea-wip/hobo/pipeline/head There was a failure building this commit Details
gitea/hobo/pipeline/head Something is wrong with the build of this commit Details

mark relation, and not element
This commit is contained in:
Lauréline Guérin 2022-11-18 10:23:45 +01:00
parent 8ea3ded995
commit c24f7ee58a
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
4 changed files with 63 additions and 32 deletions

View File

@ -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
),
),
]

View File

@ -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'))

View File

@ -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 %}

View File

@ -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):