def test_events_with_head(self): self.create_events() q = EventsStatus.events_with_head() with self.assertNumQueries(1): self.assertEqual(q.count(), 3) event_q = models.Event.objects.filter(head__sha="1234") q = EventsStatus.events_with_head(event_q=event_q) q = EventsStatus.get_default_events_query(event_q=event_q) with self.assertNumQueries(1): self.assertEqual(q.count(), 1) event_q = models.Event.objects.filter(head__sha="invalid") q = EventsStatus.events_with_head(event_q=event_q) with self.assertNumQueries(1): self.assertEqual(q.count(), 0)
def view_event(request, event_id): """ Show the details of an Event """ ev = get_object_or_404(EventsStatus.events_with_head(), pk=event_id) evs_info = EventsStatus.multiline_events_info([ev]) allowed = Permissions.is_collaborator(request.session, ev.build_user, ev.base.repo()) has_unactivated = ev.jobs.filter(active=False).count() != 0 context = {'event': ev, 'events': evs_info, 'allowed_to_cancel': allowed, "update_interval": settings.EVENT_PAGE_UPDATE_INTERVAL, "has_unactivated": has_unactivated, } return render(request, 'ci/event.html', context)
def view_pr(request, pr_id): """ Show the details of a PR Input: request: django.http.HttpRequest pr_id: pk of models.PullRequest Return: django.http.HttpResponse based object """ pr = get_object_or_404(models.PullRequest.objects.select_related('repository__user'), pk=pr_id) ev = pr.events.select_related('build_user', 'base__branch__repository__user__server').latest() allowed = Permissions.is_collaborator(request.session, ev.build_user, ev.base.repo()) current_alt = [] alt_choices = [] default_choices = [] if allowed: alt_recipes = (models.Recipe.objects .filter(repository=pr.repository, build_user=ev.build_user, current=True, active=True, cause=models.Recipe.CAUSE_PULL_REQUEST_ALT,) .order_by("display_name")) default_recipes = (models.Recipe.objects .filter(repository=pr.repository, build_user=ev.build_user, current=True, active=True, cause=models.Recipe.CAUSE_PULL_REQUEST,) .order_by("display_name")) push_recipes = (models.Recipe.objects .filter(repository=pr.repository, build_user=ev.build_user, current=True, active=True, cause=models.Recipe.CAUSE_PUSH,) .order_by("display_name")) default_recipes = [r for r in default_recipes.all()] current_alt = [ r.pk for r in pr.alternate_recipes.all() ] current_default = [j.recipe.filename for j in pr.events.latest("created").jobs.all() ] push_map = {r.filename: r.branch for r in push_recipes.all()} alt_choices = [] for r in alt_recipes: alt_choices.append({"recipe": r, "selected": r.pk in current_alt, "push_branch": push_map.get(r.filename), }) default_choices = [] for r in default_recipes: default_choices.append({"recipe": r, "pk": r.pk, "disabled": r.filename in current_default, "push_branch": push_map.get(r.filename), }) if alt_choices and request.method == "POST": form_choices = [ (r.pk, r.display_name) for r in alt_recipes ] form = forms.AlternateRecipesForm(request.POST) form.fields["recipes"].choices = form_choices form_default_choices = [] for r in default_choices: if not r["disabled"]: form_default_choices.append((r["pk"], r["recipe"].display_name)) form.fields["default_recipes"].choices = form_default_choices if form.is_valid(): pr.alternate_recipes.clear() for pk in form.cleaned_data["recipes"]: alt = models.Recipe.objects.get(pk=pk) pr.alternate_recipes.add(alt) # do some saves to update the timestamp so that the javascript updater gets activated pr.save() pr.events.latest('created').save() messages.info(request, "Success") pr_event = PullRequestEvent.PullRequestEvent() selected_default_recipes = [] if form.cleaned_data["default_recipes"]: q = models.Recipe.objects.filter(pk__in=form.cleaned_data["default_recipes"]) selected_default_recipes = [r for r in q] pr_event.create_pr_alternates(pr, default_recipes=selected_default_recipes) # update the choices so the new form is correct current_alt = [ r.pk for r in pr.alternate_recipes.all() ] alt_choices = [ {"recipe": r, "selected": r.pk in current_alt} for r in alt_recipes ] else: messages.warning(request, "Invalid form") logger.warning("Invalid form") for field, errors in form.errors.items(): logger.warning("Form error in field: %s: %s" % (field, errors)) events = EventsStatus.events_with_head(pr.events) evs_info = EventsStatus.multiline_events_info(events, events_url=True) context = { "pr": pr, "events": evs_info, "allowed": allowed, "update_interval": settings.EVENT_PAGE_UPDATE_INTERVAL, "alt_choices": alt_choices, "default_choices": default_choices, } return render(request, 'ci/pr.html', context)