def repo_update(request): """ Get the updates for the repo page. """ if 'last_request' not in request.GET or 'limit' not in request.GET or 'repo_id' not in request.GET: return HttpResponseBadRequest('Missing parameters') this_request = TimeUtils.get_local_timestamp() repo_id = int(request.GET['repo_id']) limit = int(request.GET['limit']) last_request = int(float(request.GET['last_request'])) # in case it has decimals dt = timezone.localtime(timezone.make_aware(datetime.datetime.utcfromtimestamp(last_request))) repo = get_object_or_404(models.Repository, pk=repo_id) repos_status = RepositoryStatus.filter_repos_status([repo.pk], last_modified=dt) event_q = EventsStatus.get_default_events_query() event_q = event_q.filter(base__branch__repository=repo)[:limit] events_info = EventsStatus.multiline_events_info(event_q, last_modified=dt) # we also need to check if a PR closed recently closed = [] for pr in models.PullRequest.objects.filter(repository=repo, closed=True, last_modified__gte=dt).values('id').all(): closed.append({'id': pr['id']}) return JsonResponse({'repo_status': repos_status, 'closed': closed, 'last_request': this_request, 'events': events_info, 'limit': limit, })
def test_get_default_events_query(self): self.create_events() q = EventsStatus.get_default_events_query() with self.assertNumQueries(1): self.assertEqual(q.count(), 3) event_q = models.Event.objects.filter(head__sha="1234") 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.get_default_events_query(event_q=event_q) with self.assertNumQueries(1): self.assertEqual(q.count(), 0)
def do_branch_page(request, branch): """ Render the branch page given a branch object Input: request[django.http.HttpRequest] branch[models.Branch] """ if request.method != "GET": return HttpResponseNotAllowed(['GET']) causes = [] if request.GET.get("do_filter", "0") == "0": causes = [models.Event.PUSH, models.Event.MANUAL, models.Event.RELEASE] form = forms.BranchEventsForm(initial={"filter_events": causes}) else: form = forms.BranchEventsForm(request.GET) if form.is_valid(): causes = [int(c) for c in form.cleaned_data["filter_events"]] event_list = EventsStatus.get_default_events_query().filter( base__branch=branch, cause__in=causes) events = get_paginated(request, event_list) evs_info = EventsStatus.multiline_events_info(events) return render(request, 'ci/branch.html', { "form": form, 'branch': branch, 'events': evs_info, 'pages': events })
def recipe_crons(request, recipe_id): recipe = get_object_or_404(models.Recipe, pk=recipe_id) event_list = (EventsStatus.get_default_events_query().filter( jobs__recipe__filename=recipe.filename, jobs__recipe__cause=recipe.cause, jobs__recipe__scheduler__isnull=False).exclude( jobs__recipe__scheduler='')) total = 0 count = 0 qs = models.Job.objects.filter(recipe__filename=recipe.filename) for job in qs.all(): total += job.seconds.total_seconds( ) if job.status == models.JobStatus.SUCCESS else 0 count += 1 if job.status == models.JobStatus.SUCCESS else 0 if count: total /= count events = get_paginated(request, event_list) evs_info = EventsStatus.multiline_events_info(events) avg = timedelta(seconds=total) data = { 'recipe': recipe, 'events': evs_info, 'average_time': avg, 'pages': events, } return render(request, 'ci/recipe_events.html', data)
def cronjobs(request): # TODO: make this check for permission to view cron stuff instead allowed = Permissions.is_allowed_to_see_clients(request.session) if not allowed: return render(request, 'ci/cronjobs.html', { 'recipes': None, 'allowed': False }) recipe_list = models.Recipe.objects.filter( active=True, current=True, scheduler__isnull=False, branch__isnull=False).exclude(scheduler="") local_tz = pytz.timezone('US/Mountain') for r in recipe_list: event_list = (EventsStatus.get_default_events_query().filter( jobs__recipe__filename=r.filename, jobs__recipe__cause=r.cause)) events = get_paginated(request, event_list) evs_info = EventsStatus.multiline_events_info(events) r.most_recent_event = evs_info[0]['id'] if len(evs_info) > 0 else None c = croniter(r.scheduler, start_time=r.last_scheduled.astimezone(local_tz)) r.next_run_time = c.get_next(datetime) # TODO: augment recipes objects with fields that html template will need. data = { 'recipes': recipe_list, 'allowed': True, 'update_interval': settings.HOME_PAGE_UPDATE_INTERVAL, } return render(request, 'ci/cronjobs.html', data)
def sha_events(request, owner, repo, sha): repo = get_object_or_404(models.Repository.objects, name=repo, user__name=owner) event_q = models.Event.objects.filter(head__branch__repository=repo, head__sha__startswith=sha) event_list = EventsStatus.get_default_events_query(event_q) events = get_paginated(request, event_list) evs_info = EventsStatus.multiline_events_info(events) return render(request, 'ci/events.html', {'events': evs_info, 'pages': events, 'sha': sha, 'repo': repo})
def scheduled_events(request): """ List schedule events """ event_list = EventsStatus.get_default_events_query().filter(cause=models.Event.MANUAL) events = get_paginated(request, event_list) evs_info = EventsStatus.multiline_events_info(events) return render(request, 'ci/scheduled.html', {'events': evs_info, 'pages': events})
def event_list(request): event_list = EventsStatus.get_default_events_query() events = get_paginated(request, event_list) evs_info = EventsStatus.multiline_events_info(events) return render(request, 'ci/events.html', { 'events': evs_info, 'pages': events })
def test_multi_line(self): self.create_events() e = utils.create_event(user=self.owner, commit1='456', branch1=self.branch, branch2=self.branch, cause=models.Event.PUSH) e.description = "some description" e.save() event_q = EventsStatus.get_default_events_query()[:30] info = EventsStatus.multiline_events_info(event_q, max_jobs_per_line=100) self.assertEqual(len(info), 3) self.assertEqual(len(info[0]["jobs"]), 6) info = EventsStatus.multiline_events_info(event_q, max_jobs_per_line=1) self.assertEqual(len(info), 18)