commit: 5270ca757656869bc05f5de9ef7e772b0d0ab68a Author: Magnus Granberg <zorry <AT> gentoo <DOT> org> AuthorDate: Sun Jan 15 19:44:38 2017 +0000 Commit: Magnus Granberg <zorry <AT> gentoo <DOT> org> CommitDate: Sun Jan 15 19:44:38 2017 +0000 URL: https://gitweb.gentoo.org/proj/tinderbox-cluster-www.git/commit/?id=5270ca75
update logs and add password change python/tbc_www/forms.py | 16 ++- python/tbc_www/models.py | 37 +++++-- python/tbc_www/urls.py | 5 +- python/tbc_www/utils/bugzillasubmit.py | 3 - python/tbc_www/views.py | 60 ++++++++--- python/templates/pages/cluster/index.html | 26 +++++ python/templates/pages/logs/build/index.html | 40 ++++++- python/templates/pages/logs/index.html | 117 ++++++++++++++++----- .../registration/password_change_form.html | 13 +++ 9 files changed, 252 insertions(+), 65 deletions(-) diff --git a/python/tbc_www/forms.py b/python/tbc_www/forms.py index 0a91b3b..40d1669 100644 --- a/python/tbc_www/forms.py +++ b/python/tbc_www/forms.py @@ -30,4 +30,18 @@ class BugForm(forms.Form): class BugzillaUser(forms.Form): BugzillaName = forms.CharField(label='Bugzilla Name', max_length=100) - BugzillaPassword = forms.CharField(label='Bugzilla Password', max_length=100) + BugzillaPassword = forms.CharField(label='Bugzilla Password', max_length=100, widget=forms.PasswordInput) + +class LogsViews(forms.Form): + ChoicesComponent = ( + ('All', 'All'), + ('Fail', 'Fail'), + ('Repoman', 'Repoman'), + ('Qa', 'Qa'), + ('Others', 'Others'), + ('Test', 'Test'), + ('Build', 'Build'), + ) + LogView = forms.ChoiceField(widget=forms.Select, choices=ChoicesComponent, label='View') + def __str__(self): + return '%s' % (self.LogView) diff --git a/python/tbc_www/models.py b/python/tbc_www/models.py index b54c772..73b0413 100644 --- a/python/tbc_www/models.py +++ b/python/tbc_www/models.py @@ -144,13 +144,21 @@ class BuildLogsErrors(models.Model): return '%s %s %s' % (self.Id, self.BuildLogId, self.ErrorId) class EmergeInfo(models.Model): - EInfoId = models.IntegerField(primary_key=True, db_column='einfo_id') + EInfoId = models.AutoField(primary_key=True, db_column='einfo_id') EmergeInfoText = models.TextField(db_column='emerge_info_text') class Meta: db_table = 'emerge_info' def __str__(self): return '%s %s %s' % (self.EInfoId, self.Checksum, self.EmergeInfoText) +class Keywords(models.Model): + KeywordId = models.AutoField(primary_key=True, db_column='keyword_id') + Keyword = models.CharField(max_length=40, db_column='keyword') + class Meta: + db_table = 'keywords' + def __str__(self): + return '%s %s' % (self.KeywordId, self.keyword) + class Setups(models.Model): SetupId = models.AutoField(primary_key=True, db_column='setup_id') Setup = models.CharField(max_length=100, db_column='setup') @@ -170,6 +178,25 @@ class Configs(models.Model): def __str__(self): return '%s %s %s %s' % (self.ConfigId, self.HostName, self.SetupId, self.DefaultConfig) +class ConfigsMetaData(models.Model): + Id = models.AutoField(primary_key=True, db_column='id') + ConfigId = models.ForeignKey(Configs, db_column='config_id') + KeywordId = models.ForeignKey(Keywords, db_column='keyword_id') + MakeConfText = models.TextField(db_column='make_conf_text') + Checksum = models.CharField(max_length=100, db_column='checksum') + ConfigSync = models.BooleanField(db_column='configsync') + Active = models.BooleanField(db_column='active') + ConfigErrorText = models.TextField(db_column='config_error_text') + Updateing = models.CharField(max_length=100, db_column='updateing') + Status = models.CharField(max_length=100, db_column='status') + Auto = models.BooleanField(db_column='auto') + RepoPath = models.CharField(max_length=200, db_column='repo_path') + TimeStamp = models.DateTimeField(db_column='time_stamp') + class Meta: + db_table = 'configs_metadata' + def __str__(self): + return '%s %s %s %s %s %s %s %s %s %s %s %s' % (self.ConfigId, self.KeywordId, self.MakeConfText, self.Checksum, self.ConfigSync, self.Active, self.ConfigErrorText, self.Updateing, self.Status, self.Auto, self.RepoPath, self.TimeStamp) + class BuildLogsConfig(models.Model): LogId = models.IntegerField(primary_key=True, db_column='log_id') BuildLogId = models.ForeignKey(BuildLogs, db_column='build_log_id') @@ -242,14 +269,6 @@ class BuildJobsUse(models.Model): def __str__(self): return '%s %s %s %s' % (self.Id, self.BuildJobId, self.UseId, self.Status) -class Keywords(models.Model): - KeywordId = models.IntegerField(primary_key=True, db_column='keyword_id') - Keyword = models.CharField(max_length=45, db_column='keyword') - class Meta: - db_table = 'keywords' - def __str__(self): - return '%s %s' % (self.KeywordId, self.Keyword) - class Restrictions(models.Model): RestrictionId = models.IntegerField(primary_key=True, db_column='restriction_id') Restriction = models.CharField(max_length=150, db_column='restriction') diff --git a/python/tbc_www/urls.py b/python/tbc_www/urls.py index dfea3a7..2f97143 100644 --- a/python/tbc_www/urls.py +++ b/python/tbc_www/urls.py @@ -9,7 +9,7 @@ urlpatterns = [ url(r'^categories/packages/versions/(?P<package_id>\d+)/$', views.versions), url(r'^build_req/$', views.new_build_req), url(r'^logs/build/(?P<buildlog_id>\d+)/$', views.new_logs_build, name='new_logs_build'), - url(r'^logs/build/submitlog/(?P<buildlog_id>\d+)/$', views.buildinfo_bugzilla), + url(r'^logs/build/submitlog/(?P<buildlog_id>\d+)/$', views.buildinfo_bugzilla, name='buildinfo_bugzilla'), url(r'^logs/$', views.new_logs), url(r'^logs/all/build/$', views.new_build_logs_all), url(r'^logs/all/repoman/$', views.new_repoman), @@ -18,5 +18,6 @@ urlpatterns = [ url(r'^user/password_change/$', auth_views.password_change, name='password_change'), url(r'^user/password_change/done/$', auth_views.password_change_done, name='password_change_done'), url(r'^user/password_reset/$', auth_views.password_reset, name='password_reset'), - url(r'^user/bugzillalogin/$', views.set_bugzilla_user), + url(r'^user/bugzillalogin/$', views.set_bugzilla_user, name='set_bugzilla_user'), + url(r'^cluster/$', views.cluster_configs) ] diff --git a/python/tbc_www/utils/bugzillasubmit.py b/python/tbc_www/utils/bugzillasubmit.py index d8160dc..935660d 100644 --- a/python/tbc_www/utils/bugzillasubmit.py +++ b/python/tbc_www/utils/bugzillasubmit.py @@ -5,8 +5,6 @@ import bugzilla URL = "https://bugs.gentoo.org/xmlrpc.cgi" def addnewbug(args): bzapi = bugzilla.Bugzilla(URL) - print(args['username']) - print(args['password']) bzapi.login(user=args['username'], password=args['password']) createinfo = bzapi.build_createbug( product=args['product'], @@ -16,7 +14,6 @@ def addnewbug(args): description=args['description'], assigned_to=args['assigned_to']) newbug = bzapi.createbug(createinfo) - print("Created new bug id=%s url=%s" % (newbug.id, newbug.weburl)) update = bzapi.build_update(comment=args['comment']) bzapi.update_bugs(newbug.id, update) kwards = { diff --git a/python/tbc_www/views.py b/python/tbc_www/views.py index c272c50..df3a84a 100644 --- a/python/tbc_www/views.py +++ b/python/tbc_www/views.py @@ -11,7 +11,7 @@ from gentoo_www.models import SiteSettings, Layout, Pages, SubPages, Sponsors, P 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 + BuildLogsConfig, BuildLogsUse, BuildLogsRepoman, PackagesEmails, Jobs, ConfigsMetaData import re import gzip import os @@ -258,23 +258,33 @@ def new_repoman(request): def new_logs(request): pagerequest = 'logs' + object_on_page = 100 TmpDict = default_TmpDict(pagerequest) + BL_tmp = BuildLogs.objects.order_by('-TimeStamp') 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 + 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: - adict2['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) + 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/index.html', TmpDict) def new_build_logs_all(request): @@ -311,7 +321,6 @@ def new_build_logs_all(request): 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) @@ -389,6 +398,8 @@ def submit_to_bugzilla(request, form, buildlog_id): 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 + # python-bugzilla need a fix in attachment() + # f = open(attachment) -> f = open(attachment, 'rb') with open(LogDir + LogFile, 'rb') as orig_file: with gzip.open('/tmp' + BC.LogName + '.gz', 'wb') as zipped_file: zipped_file.writelines(orig_file) @@ -403,6 +414,11 @@ def submit_to_bugzilla(request, form, buildlog_id): def buildinfo_bugzilla(request, buildlog_id): pagerequest = 'logs' + if not 'bugzillapassword' in request.session: + request.session['bugzillabuildid'] = buildlog_id + return redirect('set_bugzilla_user') + if 'bugzillabuildid' in request.session: + del request.session['bugzillabuildid'] TmpDict = default_TmpDict(pagerequest) B = get_object_or_404(BuildLogs, BuildLogId = buildlog_id) C = B.EbuildId.PackageId.CategoryId.Category @@ -439,10 +455,10 @@ def buildinfo_bugzilla(request, buildlog_id): def set_bugzilla_user(request): pagerequest = 'home' TmpDict = default_TmpDict(pagerequest) + b = Bugzilla.objects.get(Username=request.user.username) 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() @@ -451,9 +467,19 @@ def set_bugzilla_user(request): b.Bugzillaname = form.cleaned_data['BugzillaName'] b.save() request.session['bugzillapassword'] = form.cleaned_data['BugzillaPassword'] + if 'bugzillabuildid' in request.session: + return redirect('buildinfo_bugzilla', buildlog_id=request.session['bugzillabuildid']) return HttpResponseRedirect('/home/') else: form = BugzillaUser() + if b != []: + form.fields['BugzillaName'].initial = b.Bugzillaname TmpDict['form'] = form return render(request, 'registration/bugzillauser.html', TmpDict) + +def cluster_configs(request): + pagerequest = 'cluster' + TmpDict = default_TmpDict(pagerequest) + TmpDict['CM_tmp'] = ConfigsMetaData.objects.all + return render(request, 'pages/cluster/index.html', TmpDict) diff --git a/python/templates/pages/cluster/index.html b/python/templates/pages/cluster/index.html new file mode 100644 index 0000000..307cae1 --- /dev/null +++ b/python/templates/pages/cluster/index.html @@ -0,0 +1,26 @@ +{% extends "layout/base.html" %} +{% block content %} +<div class="panel panel-default"> + <div class="panel-heading"> + <h3 class="panel-title"> + <span class="fa fa-fw fa-history"></span> + <a href="/packages/added">Guests on the cluster</a> + </h3> + </div> + <div class="table-responsive"> + <table class="table table-striped"> + {% for CM in CM_tmp %} +<tr> + <td> + <p>{{ CM.ConfigId.HostName }}</p> + </td> + <td> + <p>{{ CM.ConfigId.SetupId.Profile }}</p> + <span class="label label-info">{{ CM.Status }}</span> + </td> +</tr> +{% endfor %} + </table> + </div> +</div> +{% endblock %} diff --git a/python/templates/pages/logs/build/index.html b/python/templates/pages/logs/build/index.html index 0bbc96b..a6c13e4 100644 --- a/python/templates/pages/logs/build/index.html +++ b/python/templates/pages/logs/build/index.html @@ -64,6 +64,40 @@ </div> {% endif %} </div> + <div class="col-md-3"> + <div class="panel panel-default"> + <div class="panel-heading"> + <h3 class="panel-title">Resources</h3> + </div> + <div class="list-group"> + <a href="https://bugs.gentoo.org/buglist.cgi?quicksearch={{ BLI.C }}/{{ BLI.P }}" class="list-group-item" target="_blank"> + <span class="fa fa-fw fa-bug"></span> + Related bugs + </a> + <a href="https://wiki.gentoo.org/index.php?title=Special%3ASearch&fulltext=Search&search={{ BLI.P }}" class="list-group-item" target="_blank"> + <span class="fa fa-fw fa-book"></span> + Documentation + </a> + <a href="https://forums.gentoo.org/search.php?search_terms=all&show_results=topics&search_keywords={{ BLI.P }}&mode=results" class="list-group-item" target="_blank"> + <span class="fa fa-fw fa-comments-o"></span> + Forums posts + </a> + <a href="https://gitweb.gentoo.org/repo/gentoo.git/tree/{{ BLI.C }}/{{ BLI.P }}" class="list-group-item" target="_blank"> + <span class="fa fa-fw fa-code-fork"></span> + Git repository browser + </a> + <a href="https://gitweb.gentoo.org/repo/gentoo.git/log/{{ BLI.C }}/{{ BLI.P }}?showmsg=1" class="list-group-item" target="_blank"> + <span class="fa fa-fw fa-history"></span> + Git log + </a> + <a href="https://gitweb.gentoo.org/repo/gentoo.git/atom/{{ BLI.C }}/{{ BLI.P }}?h=master" class="list-group-item" target="_blank"> + <span class="fa fa-fw fa-rss"></span> + Changes feed + </a> + </div> +</div> + + </div> <div class="row-fluid"> <div class=span12> {% if BLI.Summery_text %} @@ -99,13 +133,9 @@ {% if BLI.logname %} <br /> Log file name:{{ BLI.logname }}<br /> - <a href="{{ STATIC_URL }}/logs/{{BLI.hostname}}/{{BLI.config}}/{{ BLI.logname }}">Raw log<a/><br /> + <a href="/static/logs/{{BLI.hostname}}/{{BLI.config}}/{{ BLI.logname }}">Raw log<a/><br /> {% if user.is_authenticated %} - {% if bugzillalogin %} <a href="/logs/build/submitlog/{{BLI.BuildLogId}}/"> - {% else %} - <a href="/user/bugzillalogin/"> - {% endif %} Summit log to Gentoo's bugzilla</a> {% endif %} {% endif %} diff --git a/python/templates/pages/logs/index.html b/python/templates/pages/logs/index.html index ff5f354..f770f95 100644 --- a/python/templates/pages/logs/index.html +++ b/python/templates/pages/logs/index.html @@ -4,39 +4,100 @@ <div class="panel-heading"> <h3 class="panel-title"> <span class="fa fa-fw fa-history"></span> - <a href="/packages/added">New Build Logs On Packages</a> + Logs On Packages </h3> + {% if BL_tmp.has_other_pages %} + <ul class="pagination"> + {% if BL_tmp.has_previous %} + <li><a href="?page={{ BL_tmp.previous_page_number }}">«</a></li> + {% else %} + <li class="disabled"><span>«</span></li> + {% endif %} + {% for i in BL_tmp.paginator.page_range %} + {% if BL_tmp.number == i %} + <li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li> + {% else %} + <li><a href="?page={{ i }}">{{ i }}</a></li> + {% endif %} + {% endfor %} + {% if BL_tmp.has_next %} + <li><a href="?page={{ BL_tmp.next_page_number }}">»</a></li> + {% else %} + <li class="disabled"><span>»</span></li> + {% endif %} + </ul> +{% endif %} </div> <div class="table-responsive"> <table class="table table-striped"> - {% include "includes/frontpage/new_logs" %} - </table> - </div> -</div> -<div class="panel panel-default"> - <div class="panel-heading"> - <h3 class="panel-title"> - <span class="fa fa-fw fa-history"></span> - <a href="/packages/added">New Repoman Logs On Packages</a> - </h3> - </div> - <div class="table-responsive"> - <table class="table table-striped"> - {% include "includes/frontpage/new_repoman" %} - </table> - </div> -</div> -<div class="panel panel-default"> - <div class="panel-heading"> - <h3 class="panel-title"> - <span class="fa fa-fw fa-history"></span> - <a href="/packages/added">New Qa Logs On Packages</a> - </h3> - </div> - <div class="table-responsive"> - <table class="table table-striped"> - {% include "includes/frontpage/new_qa" %} + {% for BL in BL_tmp %} +<tr> + <td> + <a href="/logs/build/{{ BL.BuildLogId }}/"> + <span class="text-muted">{{ BL.C }}/</span>/<strong>{{ BL.P }}-{{ BL.V }}::{{ BL.R }}</strong> + </a> + </td> + <td> + <p title="{{ BL.SummeryText }}">{{ BL.SummeryText|truncatewords:5 }}</p> + {% if BL.Fail %} + {% if BL.FI.others %} + <span class="label label-info">Others</span> + {% else %} + {% if BL.FI.qa %} + <span class="label label-warning"> + {% else %} + <span class="label label-success"> + {% endif %} + Qa</span> + {% if BL.FI.repoman %} + <span class="label label-warning"> + {% else %} + <span class="label label-success"> + {% endif %} + Repoman</span> + {% if BL.FI.TestRun %} + {% if BL.FI.test %} + <span class="label label-danger"> + {% else %} + <span class="label label-success"> + {% endif %} + Test</span> + {% endif %} + {% if BL.FI.build %} + <span class="label label-danger">{{ BL.FI.builderror }} + {% else %} + <span class="label label-success">Build + {% endif %} + </span> + {% endif %} + {% else %} + <span class="label label-success">Ok</span> + {% endif %} + </td> +</tr> +{% endfor %} </table> </div> </div> +{% if BL_tmp.has_other_pages %} + <ul class="pagination"> + {% if BL_tmp.has_previous %} + <li><a href="?page={{ BL_tmp.previous_page_number }}">«</a></li> + {% else %} + <li class="disabled"><span>«</span></li> + {% endif %} + {% for i in BL_tmp.paginator.page_range %} + {% if BL_tmp.number == i %} + <li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li> + {% else %} + <li><a href="?page={{ i }}">{{ i }}</a></li> + {% endif %} + {% endfor %} + {% if BL_tmp.has_next %} + <li><a href="?page={{ BL_tmp.next_page_number }}">»</a></li> + {% else %} + <li class="disabled"><span>»</span></li> + {% endif %} + </ul> +{% endif %} {% endblock %} diff --git a/python/templates/registration/password_change_form.html b/python/templates/registration/password_change_form.html new file mode 100644 index 0000000..7761fe4 --- /dev/null +++ b/python/templates/registration/password_change_form.html @@ -0,0 +1,13 @@ +{% extends 'layout/base.html' %} + +{% block title %}Change you password{% endblock %} + +{% block content %} + <h1>Change you password</h1> + <p>Use the form below to change your password.</p> + <form action="." method="post"> + {{ form.as_p }} + <p><input type="submit" value="Change"></p> + {% csrf_token %} + </form> +{% endblock %}