# Copyright 1998-2017 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 from django.shortcuts import render, get_object_or_404, HttpResponseRedirect, redirect from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.conf import settings from django.urls import reverse from tbc_www.forms import BugForm, BugzillaUser from tbc_www.utils.bugzillasubmit import addnewbug from gentoo_www.models import SiteSettings, Layout, Pages, SubPages, Sponsors, Posts, Bugzilla from tbc_www.models import EbuildsMetadata, BuildLogs, BuildJobs, BuildLogsQa, \ BuildJobsUse, Categories, CategoriesMetadata, Packages, PackagesMetadata, Ebuilds, \ Repos, EbuildsKeywords, BuildLogsErrors, EbuildsRestrictions, EbuildsIuse, PackagesRepoman, \ BuildLogsConfig, BuildLogsUse, BuildLogsRepoman, PackagesEmails, Jobs import re import gzip import os def default_TmpDict(pagerequest): site = get_object_or_404(SiteSettings) page = get_object_or_404(Pages, nav1 = pagerequest) jobs = get_object_or_404(Jobs, JobType = 'esync') pages = Pages.objects.all() if page.SubMenu: subpages = SubPages.objects.filter(PageId = page.PageId) else: subpages = False TmpDict = {'site' : site} TmpDict['page'] = page TmpDict['pages'] = pages TmpDict['subpages'] = subpages TmpDict['smappages'] = SubPages.objects.all() TmpDict['jobs'] = jobs return TmpDict def fail_status(buildlog_id): BU_tmp = BuildLogsUse.objects.filter(BuildLogId = buildlog_id) Test = False if BU_tmp != []: for BU in BU_tmp: if BU.Status: if BU.UseId.Flag == 'test': Test = True adict = {} adict['repoman'] = False adict['qa'] = False adict['others'] = False adict['build'] = False adict['TestRun'] = Test BE_tmp = BuildLogsErrors.objects.filter(BuildLogId__BuildLogId = buildlog_id) for BE in BE_tmp: if BE.ErrorId.ErrorId == 1: adict['repoman'] = True if BE.ErrorId.ErrorId == 2: adict['qa'] = True if BE.ErrorId.ErrorId == 3: adict['others'] = True if BE.ErrorId.ErrorId == 4: adict['test'] = True if BE.ErrorId.ErrorId >= 5: adict['build'] = True adict['builderror'] = BE.ErrorId.ErrorName if BE.ErrorId.ErrorName != 'install': adict['TestRun'] = False return adict def home(request): pagerequest = 'home' Lines = 10 TmpDict = default_TmpDict(pagerequest) TmpDict['PM'] = PackagesMetadata.objects.filter(New = True) alist = [] for EM in EbuildsMetadata.objects.filter(Updated = True): adict = {} adict['EbuildId'] = EM.EbuildId.EbuildId adict['C'] = EM.EbuildId.PackageId.CategoryId.Category adict['P'] = EM.EbuildId.PackageId.Package adict['CId'] = EM.EbuildId.PackageId.CategoryId.CategoryId adict['PId'] = EM.EbuildId.PackageId.PackageId adict['V'] = EM.EbuildId.Version adict['R'] = EM.EbuildId.PackageId.RepoId.Repo adict['TimeStamp'] = EM.EbuildId.TimeStamp adict['CommitId'] = EM.Commit adict['CommitMsg'] = EM.CommitMsg adict['Descriptions'] = EM.Descriptions adict['EK_tmp'] = EbuildsKeywords.objects.filter(EbuildId__EbuildId = EM.EbuildId.EbuildId) alist.append(adict) TmpDict['EM_list'] = alist alist = [] for BL in BuildLogs.objects.filter(New = True): adict2 = {} adict2['BuildLogId'] = BL.BuildLogId adict2['C'] = BL.EbuildId.PackageId.CategoryId.Category adict2['P'] = BL.EbuildId.PackageId.Package adict2['V'] = BL.EbuildId.Version adict2['R'] = BL.EbuildId.PackageId.RepoId.Repo adict2['SummeryText'] = BL.SummeryText adict2['Fail'] = BL.Fail if BL.Fail: adict2['BE_tmp'] = BuildLogsErrors.objects.filter(BuildLogId = BL.BuildLogId) alist.append(adict2) TmpDict['BL_tmp'] = alist adict = {} BJ_Tmp = BuildJobs.objects.filter(New = True) for BJ in BJ_Tmp: adict2 = {} adict2['EbuildId'] = BJ.EbuildId.EbuildId adict2['C'] = BJ.EbuildId.PackageId.CategoryId.Category adict2['P'] = BJ.EbuildId.PackageId.Package adict2['V'] = BJ.EbuildId.Version adict2['R'] = BJ.EbuildId.PackageId.RepoId.Repo adict2['Status'] = BJ.Status adict2['title'] = "Setup: " + BJ.SetupId.Setup + "\n" + "Profile: " + BJ.SetupId.Profile + "\n" BJU = BuildJobsUse.objects.filter(BuildJobId = BJ.BuildJobId) if not BJU == []: use_enable = [] use_disable = [] for BU in BJU: if BU.Status: use_enable.append(BU.UseId.Flag) else: use_disable.append(BU.UseId.Flag) if not use_enable == []: adict2['title'] = adict2['title'] + "Enable: " for use in use_enable: adict2['title'] = adict2['title'] + use + " " adict2['title'] = adict2['title'] + "\n" if not use_disable == []: adict2['title'] = adict2['title'] + "Disable: " for use in use_disable: adict2['title'] = adict2['title'] + use + " " adict2['title'] = adict2['title'] + "\n" adict[BJ.BuildJobId] = adict2 TmpDict['BJ'] = adict TmpDict['PR_tmp'] = PackagesRepoman.objects.order_by('-Id')[:Lines] return render(request, 'pages/' + pagerequest + '/index.html', TmpDict) def categories(request): pagerequest = 'packages' TmpDict = default_TmpDict(pagerequest) alphabet_list = map(chr, range(97, 123)) CM_tmp = CategoriesMetadata.objects.filter(CategoryId__Active = True).order_by('CategoryId__Category') list2 = [] for a in alphabet_list: alist = [] for CM in CM_tmp: if a == CM.CategoryId.Category[:1]: adict = {} adict['CategoryId'] = CM.CategoryId.CategoryId adict['Category'] = CM.CategoryId.Category adict['Descriptions'] = CM.Descriptions alist.append(adict) adict2 = {} adict2['letter'] = a adict2['CM_list'] = alist if alist != []: list2.append(adict2) TmpDict['CM_tmp'] = list2 return render(request, 'pages/categories/index.html', TmpDict) def packages(request, category_id): pagerequest = 'packages' TmpDict = default_TmpDict(pagerequest) alist = [] TmpDict['PM_tmp'] = PackagesMetadata.objects.filter(PackageId__CategoryId_id = category_id).filter(PackageId__Active = True) TmpDict['C'] = get_object_or_404(CategoriesMetadata, CategoryId__CategoryId = category_id) return render(request, 'pages/categories/packages/index.html', TmpDict) def versions(request, package_id): pagerequest = 'packages' TmpDict = default_TmpDict(pagerequest) P = get_object_or_404(PackagesMetadata, PackageId__PackageId = package_id) TmpDict['P'] = P alist =[] EM_tmp = EbuildsMetadata.objects.filter(EbuildId__Active = True).filter(EbuildId__PackageId__PackageId = P.PackageId.PackageId) for EM in EM_tmp: adict = {} ebuild_id = EM.EbuildId.EbuildId adict['EbuildId'] = ebuild_id adict['Slot'] = EM.Slot adict['Version'] = EM.EbuildId.Version adict['TimeStamp'] = EM.EbuildId.TimeStamp adict['EK_tmp'] = EbuildsKeywords.objects.filter(EbuildId__EbuildId = ebuild_id) adict['EU_tmp'] = EbuildsIuse.objects.filter(EbuildId__EbuildId = ebuild_id) adict['ER_tmp'] = EbuildsRestrictions.objects.filter(EbuildId__EbuildId = ebuild_id) BL_tmp = BuildLogs.objects.filter(EbuildId__EbuildId = ebuild_id) adict['BL_tmp'] = BL_tmp alist2 = [] for BL in BL_tmp: adict2 = {} adict2['BuildLogId'] = BL.BuildLogId adict2['repoman'] = False adict2['qa'] = False adict2['Blo'] = False adict2['Blb'] = False if BL.Fail: adict2['fail'] = True BE_tmp = BuildLogsErrors.objects.filter(BuildLogId__BuildLogId = BL.BuildLogId) for BE in BE_tmp: if BE.ErrorId.ErrorId == 1: adict2['repoman'] = True if BE.ErrorId.ErrorId == 2: adict2['qa'] = True if BE.ErrorId.ErrorId == 3: adict2['Blo'] = True if BE.ErrorId.ErrorId >= 4: adict2['Blb'] = True adict2['Ble'] = BE.ErrorId.ErrorName alist2.append(adict2) adict['fi_tmp'] = alist2 alist.append(adict) TmpDict['EM_info'] = alist return render(request, 'pages/categories/packages/versions/index.html', TmpDict) def new_build_req(request): pagerequest = 'build_req' TmpDict = default_TmpDict(pagerequest) adict = {} BJ_Tmp = BuildJobs.objects.order_by('-TimeStamp') for BJ in BJ_Tmp: adict2 = {} adict2['EbuildId'] = BJ.EbuildId.EbuildId adict2['C'] = BJ.EbuildId.PackageId.CategoryId.Category adict2['P'] = BJ.EbuildId.PackageId.Package adict2['V'] = BJ.EbuildId.Version adict2['R'] = BJ.EbuildId.PackageId.RepoId.Repo adict2['Status'] = BJ.Status adict2['title'] = "Setup: " + BJ.SetupId.Setup + "\n" + "Profile: " + BJ.SetupId.Profile + "\n" BJU = BuildJobsUse.objects.filter(BuildJobId = BJ.BuildJobId) if not BJU == []: use_enable = [] use_disable = [] for BU in BJU: if BU.Status: use_enable.append(BU.UseId.Flag) else: use_disable.append(BU.UseId.Flag) if not use_enable == []: adict2['title'] = adict2['title'] + "Enable: " for use in use_enable: adict2['title'] = adict2['title'] + use + " " adict2['title'] = adict2['title'] + "\n" if not use_disable == []: adict2['title'] = adict2['title'] + "Disable: " for use in use_disable: adict2['title'] = adict2['title'] + use + " " adict2['title'] = adict2['title'] + "\n" adict[BJ.BuildJobId] = adict2 TmpDict['BJ'] = adict return render(request, 'pages/build_req/index.html', TmpDict) def new_repoman(request): pagerequest = 'new' Lines = 30 TmpDict = default_TmpDict(pagerequest) TmpDict['PR_tmp'] = PackagesRepoman.objects.order_by('-Id')[:Lines] return render(request, 'pages/' + pagerequest + '/repoman/index.html', TmpDict) def new_logs(request): pagerequest = 'logs' TmpDict = default_TmpDict(pagerequest) alist = [] for BL in BuildLogs.objects.order_by('-TimeStamp').filter(New = True): adict2 = {} adict2['BuildLogId'] = BL.BuildLogId adict2['C'] = BL.EbuildId.PackageId.CategoryId.Category adict2['P'] = BL.EbuildId.PackageId.Package adict2['V'] = BL.EbuildId.Version adict2['R'] = BL.EbuildId.PackageId.RepoId.Repo adict2['Fail'] = BL.Fail adict2['SummeryText'] = BL.SummeryText if BL.Fail: adict['FI'] = fail_status(BL.BuildLogId) alist.append(adict2) TmpDict['BL_tmp'] = alist TmpDict['QA_tmp'] = BuildLogsQa.objects.filter(BuildLogId__New = True) TmpDict['RM_tmp'] = BuildLogsRepoman.objects.filter(BuildLogId__New = True) return render(request, 'pages/logs/index.html', TmpDict) def new_build_logs_all(request): pagerequest = 'logs' object_on_page = 50 TmpDict = default_TmpDict(pagerequest) BL_tmp = BuildLogs.objects.order_by('-TimeStamp').filter(Fail = True) alist = [] for BL in BL_tmp: adict = {} adict['BuildLogId'] = BL.BuildLogId adict['C'] = BL.EbuildId.PackageId.CategoryId.Category adict['P'] = BL.EbuildId.PackageId.Package adict['V'] = BL.EbuildId.Version adict['R'] = BL.EbuildId.PackageId.RepoId.Repo adict['Fail'] = BL.Fail adict['SummeryText'] = BL.SummeryText if BL.Fail: adict['FI'] = fail_status(BL.BuildLogId) alist.append(adict) paginator = Paginator(alist, object_on_page) page = request.GET.get('page') try: BL_tmp = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. BL_tmp = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. BL_tmp = paginator.page(paginator.num_pages) TmpDict['BL_tmp'] = BL_tmp return render(request, 'pages/logs/all/build/index.html', TmpDict) def new_logs_build(request, buildlog_id): pagerequest = 'logs' TmpDict = default_TmpDict(pagerequest) TmpDict['Bugzillalogin'] = False B = BuildLogs.objects.get(BuildLogId = buildlog_id) EM = EbuildsMetadata.objects.get(EbuildId = B.EbuildId.EbuildId) PM = PackagesMetadata.objects.get(PackageId__PackageId = B.EbuildId.PackageId.PackageId) BLI = {} BLI['BuildLogId'] = buildlog_id BLI['EbuildId'] = B.EbuildId.EbuildId BLI['C'] = B.EbuildId.PackageId.CategoryId.Category BLI['P'] = B.EbuildId.PackageId.Package BLI['V'] = B.EbuildId.Version BLI['R'] = B.EbuildId.PackageId.RepoId.Repo BLI['EC'] = EM.Commit BLI['PD'] = EM.Descriptions BLI['PC'] = PM.Gitlog BLI['Fail'] = B.Fail BLI['Summery_text'] = B.SummeryText if B.BugId == "0": BLI['BugId'] = False else: BLI['BugId'] = B.BugId BC = BuildLogsConfig.objects.get(BuildLogId = buildlog_id) #CEO_tmp = ConfigsEmergeOptions.objects.filter(ConfigId = BC.ConfigId.ConfigId) BU_tmp = BuildLogsUse.objects.filter(BuildLogId = buildlog_id) config_eoption = [] BLI['configid'] = BC.ConfigId.ConfigId BLI['hostname'] = BC.ConfigId.HostName BLI['config'] = BC.ConfigId.SetupId.Setup BLI['profile'] = BC.ConfigId.SetupId.Profile BLI['logid'] = BC.LogId BLI['logname'] = BC.LogName[1:] BLI['emerge_info_text'] = BC.EInfoId.EmergeInfoText #for CEO in CEO_tmp: # config_eoption.append(CEO.EmergeOptionId.EOption) #BLI['emerge_option'] = config_eoption if not BU_tmp == []: use_enable = [] use_disable = [] for BU in BU_tmp: if BU.Status: use_enable.append(BU.UseId.Flag) else: use_disable.append(BU.UseId.Flag) if not use_enable == []: BLI['use_enable'] = use_enable if not use_disable == []: BLI['use_disable'] = use_disable TmpDict['FI'] = fail_status(buildlog_id) try: BRQ = BuildLogsQa.objects.get(BuildLogId = B.BuildLogId) BLI['QA'] = BRQ.SummeryText except BuildLogsQa.DoesNotExist as e: BLI['QA'] = False try: BRR = BuildLogsRepoman.objects.get(BuildLogId = B.BuildLogId) BLI['Repoman'] = BRR.SummeryText except BuildLogsRepoman.DoesNotExist as e: BLI['Repoman'] = False TmpDict['BLI'] = BLI return render(request, 'pages/logs/build/index.html', TmpDict) def submit_to_bugzilla(request, form, buildlog_id): BC = BuildLogsConfig.objects.get(BuildLogId = buildlog_id) b = Bugzilla.objects.get(Username=request.user.username) args = {} args['product'] = form.cleaned_data['Product'] args['component'] = form.cleaned_data['Component'] args['version'] = form.cleaned_data['Version'] args['summary'] = form.cleaned_data['Summary'] args['description'] = form.cleaned_data['Description'] args['comment'] = form.cleaned_data['EmergeInfo'] args['assigned_to'] = form.cleaned_data['AssigendTo'] args['password'] = request.session['bugzillapassword'] args['username'] = b.Bugzillaname LogFile = BC.ConfigId.HostName + '/' + BC.ConfigId.SetupId.Setup + BC.LogName LogDir = settings.STATIC_ROOT + '/logs/' Filesize = os.path.getsize(LogDir + LogFile)/1024 if Filesize > 900: #FIXME UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte with open(LogDir + LogFile, 'rb') as orig_file: with gzip.open('/tmp' + BC.LogName + '.gz', 'wb') as zipped_file: zipped_file.writelines(orig_file) args['filename'] = '/tmp' + BC.LogName + '.gz' args['content_type'] = 'application/gzip' else: args['filename'] = LogDir + LogFile args['content_type'] = 'text/plain' args['comment_attach'] = 'Build log' newbug = addnewbug(args) return newbug def buildinfo_bugzilla(request, buildlog_id): pagerequest = 'logs' TmpDict = default_TmpDict(pagerequest) B = get_object_or_404(BuildLogs, BuildLogId = buildlog_id) C = B.EbuildId.PackageId.CategoryId.Category P = B.EbuildId.PackageId.Package V = B.EbuildId.Version R = B.EbuildId.PackageId.RepoId.Repo if request.method == 'POST': form = BugForm(request.POST) if form.is_valid(): newbug = submit_to_bugzilla(request, form, buildlog_id) B.BugId = newbug.id B.save() return redirect('new_logs_build', buildlog_id=buildlog_id) else: if B.Fail == 'True': F = get_object_or_404(BuildLogsErrors, BuildLogId = buildlog_id) FailText = " : " + F.ErrorId.ErrorName else: FailText = "" E = get_object_or_404(BuildLogsConfig, BuildLogId = buildlog_id) PE = get_object_or_404(PackagesEmails, PackageId__PackageId = B.EbuildId.PackageId.PackageId) form = BugForm() form.fields['Product'].initial = 'Gentoo Linux' form.fields['Version'].initial = 'unspecified' form.fields['Summary'].initial = '[TEST][Tinderbox-cluster]=' + C + '/' + P + '-' + V + '::' + R + FailText form.fields['Description'].initial = B.SummeryText form.fields['EmergeInfo'].initial = E.EInfoId.EmergeInfoText form.fields['AssigendTo'].initial = PE.EmailId.Email TmpDict['form'] = form TmpDict['B'] = B return render(request, 'pages/logs/build/submitbug/index.html', TmpDict) def set_bugzilla_user(request): pagerequest = 'home' TmpDict = default_TmpDict(pagerequest) if request.method == 'POST': form = BugzillaUser(request.POST) if form.is_valid(): b = Bugzilla.objects.get(Username=request.user.username) if b == []: b = Bugzilla(Bugzillaname = form.cleaned_data['BugzillaName'], Username = request.user.username) b.save() else: if b.Bugzillaname != form.cleaned_data['BugzillaName']: b.Bugzillaname = form.cleaned_data['BugzillaName'] b.save() request.session['bugzillapassword'] = form.cleaned_data['BugzillaPassword'] return HttpResponseRedirect('/home/') else: form = BugzillaUser() TmpDict['form'] = form return render(request, 'registration/bugzillauser.html', TmpDict)