Пример #1
0
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,
        })
Пример #2
0
    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)
Пример #3
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
    })
Пример #4
0
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)
Пример #5
0
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)
Пример #6
0
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})
Пример #7
0
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})
Пример #8
0
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
    })
Пример #9
0
    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)