applications: move scandeps to be a method (#70501)

This commit is contained in:
Frédéric Péters 2022-10-30 11:17:05 +01:00
parent 0165713e53
commit 1475e2b72e
2 changed files with 32 additions and 33 deletions

View File

@ -68,6 +68,35 @@ class Application(models.Model):
self.slug = slug
super().save(*args, **kwargs)
def scandeps(self):
self.relation_set.filter(auto_dependency=True).delete()
relations = self.relation_set.select_related('element')
elements = {(x.element.type, x.element.slug): (x.element, x) for x in relations}
finished = False
while not finished:
finished = True
for el in [x[0] for x in elements.values()]:
dependencies_url = el.cache['urls'].get('dependencies')
if not dependencies_url:
continue
response = requests.get(dependencies_url)
for dependency in response.json()['data']:
if (dependency['type'], dependency['id']) in elements:
continue
finished = False
element, created = Element.objects.get_or_create(
type=dependency['type'], slug=dependency['id'], defaults={'name': dependency['text']}
)
element.name = dependency['text']
element.cache = dependency
element.save()
relation, created = Relation.objects.get_or_create(application=self, element=element)
if created:
relation.auto_dependency = True
relation.save()
elements[(element.type, element.slug)] = (element, relation)
return elements
class Element(models.Model):
type = models.CharField(max_length=25, verbose_name=_('Type'))

View File

@ -186,39 +186,9 @@ class AppDeleteElementView(DeleteView):
delete_element = AppDeleteElementView.as_view()
def scan(app_slug):
app = Application.objects.get(slug=app_slug)
app.relation_set.filter(auto_dependency=True).delete()
relations = app.relation_set.select_related('element')
elements = {(x.element.type, x.element.slug): (x.element, x) for x in relations}
finished = False
while not finished:
finished = True
for el in [x[0] for x in elements.values()]:
dependencies_url = el.cache['urls'].get('dependencies')
if not dependencies_url:
continue
response = requests.get(dependencies_url)
for dependency in response.json()['data']:
if (dependency['type'], dependency['id']) in elements:
continue
finished = False
element, created = Element.objects.get_or_create(
type=dependency['type'], slug=dependency['id'], defaults={'name': dependency['text']}
)
element.name = dependency['text']
element.cache = dependency
element.save()
relation, created = Relation.objects.get_or_create(application=app, element=element)
if created:
relation.auto_dependency = True
relation.save()
elements[(element.type, element.slug)] = (element, relation)
return elements
def scandeps(request, app_slug):
scan(app_slug)
app = Application.objects.get(slug=app_slug)
app.scandeps()
return HttpResponseRedirect(reverse('application-manifest', kwargs={'app_slug': app_slug}))
@ -237,7 +207,7 @@ class GenerateView(FormView):
def form_valid(self, form):
app = self.app
elements = scan(app.slug)
elements = app.scandeps()
version = (
app.version_set.filter(number=form.cleaned_data['number'])