diff --git a/bitbake/lib/toaster/bldviewer/templates/base.html b/bitbake/lib/toaster/bldviewer/templates/simple_base.html
similarity index 100%
rename from bitbake/lib/toaster/bldviewer/templates/base.html
rename to bitbake/lib/toaster/bldviewer/templates/simple_base.html
diff --git a/bitbake/lib/toaster/bldviewer/templates/simple_basebuildpage.html b/bitbake/lib/toaster/bldviewer/templates/simple_basebuildpage.html
new file mode 100644
index 0000000000..8d64e2deb6
--- /dev/null
+++ b/bitbake/lib/toaster/bldviewer/templates/simple_basebuildpage.html
@@ -0,0 +1,17 @@
+{% extends "simple_basetable.html" %}
+
+{% block pagename %}
+
").append(x.parseHTML(e)).find(r):e)}).complete(n&&function(e,t){s.each(n,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ut,type:"GET",isLocal:Kt.test(Xt[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":sn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?cn(cn(e,x.ajaxSettings),t):cn(x.ajaxSettings,e)},ajaxPrefilter:un(rn),ajaxTransport:un(on),ajax:function(e,t){"object"==typeof e&&(t=e,e=undefined),t=t||{};var n,r,i,o,s,a,u,l,c=x.ajaxSetup({},t),p=c.context||c,f=c.context&&(p.nodeType||p.jquery)?x(p):x.event,h=x.Deferred(),d=x.Callbacks("once memory"),g=c.statusCode||{},m={},y={},v=0,b="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===v){if(!o){o={};while(t=Qt.exec(i))o[t[1].toLowerCase()]=t[2]}t=o[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===v?i:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return v||(e=y[n]=y[n]||e,m[e]=t),this},overrideMimeType:function(e){return v||(c.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>v)for(t in e)g[t]=[g[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||b;return n&&n.abort(t),k(0,t),this}};if(h.promise(T).complete=d.add,T.success=T.done,T.error=T.fail,c.url=((e||c.url||Ut)+"").replace(Gt,"").replace(en,Xt[1]+"//"),c.type=t.method||t.type||c.method||c.type,c.dataTypes=x.trim(c.dataType||"*").toLowerCase().match(w)||[""],null==c.crossDomain&&(a=tn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===Xt[1]&&a[2]===Xt[2]&&(a[3]||("http:"===a[1]?"80":"443"))===(Xt[3]||("http:"===Xt[1]?"80":"443")))),c.data&&c.processData&&"string"!=typeof c.data&&(c.data=x.param(c.data,c.traditional)),ln(rn,c,t,T),2===v)return T;u=c.global,u&&0===x.active++&&x.event.trigger("ajaxStart"),c.type=c.type.toUpperCase(),c.hasContent=!Zt.test(c.type),r=c.url,c.hasContent||(c.data&&(r=c.url+=(Vt.test(r)?"&":"?")+c.data,delete c.data),c.cache===!1&&(c.url=Jt.test(r)?r.replace(Jt,"$1_="+Yt++):r+(Vt.test(r)?"&":"?")+"_="+Yt++)),c.ifModified&&(x.lastModified[r]&&T.setRequestHeader("If-Modified-Since",x.lastModified[r]),x.etag[r]&&T.setRequestHeader("If-None-Match",x.etag[r])),(c.data&&c.hasContent&&c.contentType!==!1||t.contentType)&&T.setRequestHeader("Content-Type",c.contentType),T.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+("*"!==c.dataTypes[0]?", "+sn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)T.setRequestHeader(l,c.headers[l]);if(c.beforeSend&&(c.beforeSend.call(p,T,c)===!1||2===v))return T.abort();b="abort";for(l in{success:1,error:1,complete:1})T[l](c[l]);if(n=ln(on,c,t,T)){T.readyState=1,u&&f.trigger("ajaxSend",[T,c]),c.async&&c.timeout>0&&(s=setTimeout(function(){T.abort("timeout")},c.timeout));try{v=1,n.send(m,k)}catch(C){if(!(2>v))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,t,o,a){var l,m,y,b,w,C=t;2!==v&&(v=2,s&&clearTimeout(s),n=undefined,i=a||"",T.readyState=e>0?4:0,l=e>=200&&300>e||304===e,o&&(b=pn(c,T,o)),b=fn(c,b,T,l),l?(c.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(x.lastModified[r]=w),w=T.getResponseHeader("etag"),w&&(x.etag[r]=w)),204===e||"HEAD"===c.type?C="nocontent":304===e?C="notmodified":(C=b.state,m=b.data,y=b.error,l=!y)):(y=C,(e||!C)&&(C="error",0>e&&(e=0))),T.status=e,T.statusText=(t||C)+"",l?h.resolveWith(p,[m,C,T]):h.rejectWith(p,[T,C,y]),T.statusCode(g),g=undefined,u&&f.trigger(l?"ajaxSuccess":"ajaxError",[T,c,l?m:y]),d.fireWith(p,[T,C]),u&&(f.trigger("ajaxComplete",[T,c]),--x.active||x.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,t){return x.get(e,undefined,t,"script")}}),x.each(["get","post"],function(e,t){x[t]=function(e,n,r,i){return x.isFunction(n)&&(i=i||r,r=n,n=undefined),x.ajax({url:e,type:t,dataType:i,data:n,success:r})}});function pn(e,t,n){var r,i,o,s,a=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),r===undefined&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in a)if(a[i]&&a[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}s||(s=i)}o=o||s}return o?(o!==u[0]&&u.unshift(o),n[o]):undefined}function fn(e,t,n,r){var i,o,s,a,u,l={},c=e.dataTypes.slice();if(c[1])for(s in e.converters)l[s.toLowerCase()]=e.converters[s];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(s=l[u+" "+o]||l["* "+o],!s)for(i in l)if(a=i.split(" "),a[1]===o&&(s=l[u+" "+a[0]]||l["* "+a[0]])){s===!0?s=l[i]:l[i]!==!0&&(o=a[0],c.unshift(a[1]));break}if(s!==!0)if(s&&e["throws"])t=s(t);else try{t=s(t)}catch(p){return{state:"parsererror",error:s?p:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===undefined&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),x.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=x("
+
+
+
+
+
+
+
+
+
+{% block pagecontent %}
+{% endblock %}
+
+
About Toaster | Yocto Project
+
+
+
+
diff --git a/bitbake/lib/toaster/bldviewer/templates/basebuildpage.html b/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
similarity index 100%
rename from bitbake/lib/toaster/bldviewer/templates/basebuildpage.html
rename to bitbake/lib/toaster/toastergui/templates/basebuildpage.html
diff --git a/bitbake/lib/toaster/bldviewer/templates/basetable.html b/bitbake/lib/toaster/toastergui/templates/basetable.html
similarity index 100%
rename from bitbake/lib/toaster/bldviewer/templates/basetable.html
rename to bitbake/lib/toaster/toastergui/templates/basetable.html
diff --git a/bitbake/lib/toaster/bldviewer/templates/bfile.html b/bitbake/lib/toaster/toastergui/templates/bfile.html
similarity index 100%
rename from bitbake/lib/toaster/bldviewer/templates/bfile.html
rename to bitbake/lib/toaster/toastergui/templates/bfile.html
diff --git a/bitbake/lib/toaster/bldviewer/templates/bpackage.html b/bitbake/lib/toaster/toastergui/templates/bpackage.html
similarity index 100%
rename from bitbake/lib/toaster/bldviewer/templates/bpackage.html
rename to bitbake/lib/toaster/toastergui/templates/bpackage.html
diff --git a/bitbake/lib/toaster/bldviewer/templates/build.html b/bitbake/lib/toaster/toastergui/templates/build.html
similarity index 100%
rename from bitbake/lib/toaster/bldviewer/templates/build.html
rename to bitbake/lib/toaster/toastergui/templates/build.html
diff --git a/bitbake/lib/toaster/bldviewer/templates/configuration.html b/bitbake/lib/toaster/toastergui/templates/configuration.html
similarity index 100%
rename from bitbake/lib/toaster/bldviewer/templates/configuration.html
rename to bitbake/lib/toaster/toastergui/templates/configuration.html
diff --git a/bitbake/lib/toaster/toastergui/templates/index.html b/bitbake/lib/toaster/toastergui/templates/index.html
deleted file mode 100644
index 80b02d94a9..0000000000
--- a/bitbake/lib/toaster/toastergui/templates/index.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
GUI Page
-
-
-{% load staticfiles %}
-
-

-
-This is your basic index page!
-
-
-
\ No newline at end of file
diff --git a/bitbake/lib/toaster/bldviewer/templates/layer.html b/bitbake/lib/toaster/toastergui/templates/layer.html
similarity index 100%
rename from bitbake/lib/toaster/bldviewer/templates/layer.html
rename to bitbake/lib/toaster/toastergui/templates/layer.html
diff --git a/bitbake/lib/toaster/bldviewer/templates/package.html b/bitbake/lib/toaster/toastergui/templates/package.html
similarity index 100%
rename from bitbake/lib/toaster/bldviewer/templates/package.html
rename to bitbake/lib/toaster/toastergui/templates/package.html
diff --git a/bitbake/lib/toaster/bldviewer/templates/recipe.html b/bitbake/lib/toaster/toastergui/templates/recipe.html
similarity index 100%
rename from bitbake/lib/toaster/bldviewer/templates/recipe.html
rename to bitbake/lib/toaster/toastergui/templates/recipe.html
diff --git a/bitbake/lib/toaster/bldviewer/templates/task.html b/bitbake/lib/toaster/toastergui/templates/task.html
similarity index 100%
rename from bitbake/lib/toaster/bldviewer/templates/task.html
rename to bitbake/lib/toaster/toastergui/templates/task.html
diff --git a/bitbake/lib/toaster/toastergui/templatetags/__init__.py b/bitbake/lib/toaster/toastergui/templatetags/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/bitbake/lib/toaster/toastergui/templatetags/projecttags.py b/bitbake/lib/toaster/toastergui/templatetags/projecttags.py
new file mode 100644
index 0000000000..0c0d804c0c
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templatetags/projecttags.py
@@ -0,0 +1,26 @@
+#
+# BitBake Toaster Implementation
+#
+# Copyright (C) 2013 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+from datetime import datetime
+from django import template
+
+register = template.Library()
+
+@register.simple_tag
+def time_difference(start_time, end_time):
+ return end_time - start_time
diff --git a/bitbake/lib/toaster/toastergui/urls.py b/bitbake/lib/toaster/toastergui/urls.py
index 6dbf0c5a56..b84c95f08b 100644
--- a/bitbake/lib/toaster/toastergui/urls.py
+++ b/bitbake/lib/toaster/toastergui/urls.py
@@ -16,12 +16,17 @@
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-import os
-
-from django.conf import settings
from django.conf.urls import patterns, include, url
+from django.views.generic import RedirectView
-
-urlpatterns = patterns('toastergui.views',
- url(r'^$', 'guihome', name='guihome'),
+urlpatterns = patterns('bldviewer.views',
+ url(r'^builds/$', 'build', name='all-builds'),
+ url(r'^build/(?P
\d+)/task/$', 'task', name='task'),
+ url(r'^build/(?P\d+)/packages/$', 'bpackage', name='bpackage'),
+ url(r'^build/(?P\d+)/package/(?P\d+)/files/$', 'bfile', name='bfile'),
+ url(r'^build/(?P\d+)/target/(?P\d+)/packages/$', 'tpackage', name='tpackage'),
+ url(r'^build/(?P\d+)/configuration/$', 'configuration', name='configuration'),
+ url(r'^layers/$', 'layer', name='all-layers'),
+ url(r'^layerversions/(?P\d+)/recipes/.*$', 'layer_versions_recipes', name='layer_versions_recipes'),
+ url(r'^$', RedirectView.as_view( url= 'builds/')),
)
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py
index ecb2f7e82f..7cb9b42379 100644
--- a/bitbake/lib/toaster/toastergui/views.py
+++ b/bitbake/lib/toaster/toastergui/views.py
@@ -16,11 +16,265 @@
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+import operator
+
+from django.db.models import Q
from django.shortcuts import render
-from orm.models import Build, Task
+from orm.models import Build, Target, Task, Layer, Layer_Version, Recipe, LogMessage, Variable
+from orm.models import Task_Dependency, Recipe_Dependency, Package, Package_File, Package_Dependency
+from orm.models import Target_Installed_Package
+from django.views.decorators.cache import cache_control
+from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
-def guihome(request):
- template = 'index.html'
+def _build_page_range(paginator, index = 1):
+ try:
+ page = paginator.page(index)
+ except PageNotAnInteger:
+ page = paginator.page(1)
+ except EmptyPage:
+ page = paginator.page(paginator.num_pages)
- return render(request, template)
+ page.page_range = [page.number]
+ crt_range = 0
+ for i in range(1,5):
+ if (page.number + i) <= paginator.num_pages:
+ page.page_range = page.page_range + [ page.number + i]
+ crt_range +=1
+ if (page.number - i) > 0:
+ page.page_range = [page.number -i] + page.page_range
+ crt_range +=1
+ if crt_range == 4:
+ break
+ return page
+
+@cache_control(no_store=True)
+def build(request):
+ template = 'build.html'
+ logs = LogMessage.objects.all()
+
+ build_info = _build_page_range(Paginator(Build.objects.order_by("-id"), 10),request.GET.get('page', 1))
+
+ context = {'objects': build_info, 'logs': logs ,
+ 'hideshowcols' : [
+ {'name': 'Output', 'order':10},
+ {'name': 'Log', 'order':11},
+ ]}
+
+ return render(request, template, context)
+
+
+def _find_task_revdep(task):
+ tp = []
+ for p in Task_Dependency.objects.filter(depends_on=task):
+ tp.append(p.task);
+ return tp
+
+def _find_task_provider(task):
+ task_revdeps = _find_task_revdep(task)
+ for tr in task_revdeps:
+ if tr.outcome != Task.OUTCOME_COVERED:
+ return tr
+ for tr in task_revdeps:
+ trc = _find_task_provider(tr)
+ if trc is not None:
+ return trc
+ return None
+
+def task(request, build_id):
+ template = 'task.html'
+
+ tasks = _build_page_range(Paginator(Task.objects.filter(build=build_id), 100),request.GET.get('page', 1))
+
+ for t in tasks:
+ if t.outcome == Task.OUTCOME_COVERED:
+ t.provider = _find_task_provider(t)
+
+ context = {'build': Build.objects.filter(pk=build_id)[0], 'objects': tasks}
+
+ return render(request, template, context)
+
+def configuration(request, build_id):
+ template = 'configuration.html'
+ variables = _build_page_range(Paginator(Variable.objects.filter(build=build_id), 50), request.GET.get('page', 1))
+ context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : variables}
+ return render(request, template, context)
+
+def bpackage(request, build_id):
+ template = 'bpackage.html'
+ packages = Package.objects.filter(build = build_id)
+ context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : packages}
+ return render(request, template, context)
+
+def bfile(request, build_id, package_id):
+ template = 'bfile.html'
+ files = Package_File.objects.filter(package = package_id)
+ context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : files}
+ return render(request, template, context)
+
+def tpackage(request, build_id, target_id):
+ template = 'package.html'
+ packages = map(lambda x: x.package, list(Target_Installed_Package.objects.filter(target=target_id)))
+ context = {'build': Build.objects.filter(pk=build_id)[0], 'objects' : packages}
+ return render(request, template, context)
+
+def layer(request):
+ template = 'layer.html'
+ layer_info = Layer.objects.all()
+
+ for li in layer_info:
+ li.versions = Layer_Version.objects.filter(layer = li)
+ for liv in li.versions:
+ liv.count = Recipe.objects.filter(layer_version__id = liv.id).count()
+
+ context = {'objects': layer_info}
+
+ return render(request, template, context)
+
+
+def layer_versions_recipes(request, layerversion_id):
+ template = 'recipe.html'
+ recipes = Recipe.objects.filter(layer_version__id = layerversion_id)
+
+ context = {'objects': recipes,
+ 'layer_version' : Layer_Version.objects.filter( id = layerversion_id )[0]
+ }
+
+ return render(request, template, context)
+
+#### API
+
+import json
+from django.core import serializers
+from django.http import HttpResponse, HttpResponseBadRequest
+
+
+def model_explorer(request, model_name):
+
+ DESCENDING = 'desc'
+ response_data = {}
+ model_mapping = {
+ 'build': Build,
+ 'target': Target,
+ 'task': Task,
+ 'task_dependency': Task_Dependency,
+ 'package': Package,
+ 'layer': Layer,
+ 'layerversion': Layer_Version,
+ 'recipe': Recipe,
+ 'recipe_dependency': Recipe_Dependency,
+ 'package': Package,
+ 'package_dependency': Package_Dependency,
+ 'build_file': Package_File,
+ 'variable': Variable,
+ 'logmessage': LogMessage,
+ }
+
+ if model_name not in model_mapping.keys():
+ return HttpResponseBadRequest()
+
+ model = model_mapping[model_name]
+
+ try:
+ limit = int(request.GET.get('limit', 0))
+ except ValueError:
+ limit = 0
+
+ try:
+ offset = int(request.GET.get('offset', 0))
+ except ValueError:
+ offset = 0
+
+ ordering_string, invalid = _validate_input(request.GET.get('orderby', ''),
+ model)
+ if invalid:
+ return HttpResponseBadRequest()
+
+ filter_string, invalid = _validate_input(request.GET.get('filter', ''),
+ model)
+ if invalid:
+ return HttpResponseBadRequest()
+
+ search_term = request.GET.get('search', '')
+
+ if filter_string:
+ filter_terms = _get_filtering_terms(filter_string)
+ try:
+ queryset = model.objects.filter(**filter_terms)
+ except ValueError:
+ queryset = []
+ else:
+ queryset = model.objects.all()
+
+ if search_term:
+ queryset = _get_search_results(search_term, queryset, model)
+
+ if ordering_string and queryset:
+ column, order = ordering_string.split(':')
+ if order.lower() == DESCENDING:
+ queryset = queryset.order_by('-' + column)
+ else:
+ queryset = queryset.order_by(column)
+
+ if offset and limit:
+ queryset = queryset[offset:(offset+limit)]
+ elif offset:
+ queryset = queryset[offset:]
+ elif limit:
+ queryset = queryset[:limit]
+
+ if queryset:
+ response_data['count'] = queryset.count()
+ else:
+ response_data['count'] = 0
+
+ response_data['list'] = serializers.serialize('json', queryset)
+
+ return HttpResponse(json.dumps(response_data),
+ content_type='application/json')
+
+def _get_filtering_terms(filter_string):
+
+ search_terms = filter_string.split(":")
+ keys = search_terms[0].split(',')
+ values = search_terms[1].split(',')
+
+ return dict(zip(keys, values))
+
+def _validate_input(input, model):
+
+ invalid = 0
+
+ if input:
+ input_list = input.split(":")
+
+ # Check we have only one colon
+ if len(input_list) != 2:
+ invalid = 1
+ return None, invalid
+
+ # Check we have an equal number of terms both sides of the colon
+ if len(input_list[0].split(',')) != len(input_list[1].split(',')):
+ invalid = 1
+ return None, invalid
+
+ # Check we are looking for a valid field
+ valid_fields = model._meta.get_all_field_names()
+ for field in input_list[0].split(','):
+ if field not in valid_fields:
+ invalid = 1
+ return None, invalid
+
+ return input, invalid
+
+def _get_search_results(search_term, queryset, model):
+ search_objects = []
+ for st in search_term.split(" "):
+ q_map = map(lambda x: Q(**{x+'__icontains': st}),
+ model.search_allowed_fields)
+
+ search_objects.append(reduce(operator.or_, q_map))
+ search_object = reduce(operator.and_, search_objects)
+ queryset = queryset.filter(search_object)
+
+ return queryset
diff --git a/bitbake/lib/toaster/toastermain/settings.py b/bitbake/lib/toaster/toastermain/settings.py
index c6ede686ca..b76218b959 100644
--- a/bitbake/lib/toaster/toastermain/settings.py
+++ b/bitbake/lib/toaster/toastermain/settings.py
@@ -146,6 +146,7 @@ INSTALLED_APPS = (
# 'django.contrib.admindocs',
'orm',
'toastermain',
+ 'toastergui',
'bldviewer',
'toastergui',
'south',
diff --git a/bitbake/lib/toaster/toastermain/urls.py b/bitbake/lib/toaster/toastermain/urls.py
index a696a0b216..10e685af38 100644
--- a/bitbake/lib/toaster/toastermain/urls.py
+++ b/bitbake/lib/toaster/toastermain/urls.py
@@ -29,7 +29,7 @@ urlpatterns = patterns('',
url(r'^simple/', include('bldviewer.urls')),
url(r'^api/1.0/', include('bldviewer.api')),
url(r'^gui/', include('toastergui.urls')),
- url(r'^$', never_cache(RedirectView.as_view(url='/simple/'))),
+ url(r'^$', never_cache(RedirectView.as_view(url='/gui/'))),
# Examples:
# url(r'^toaster/', include('toaster.foo.urls')),