summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/toaster/toastergui/templates/builddashboard.html2
-rw-r--r--bitbake/lib/toaster/toastergui/urls.py1
-rwxr-xr-xbitbake/lib/toaster/toastergui/views.py270
3 files changed, 158 insertions, 115 deletions
diff --git a/bitbake/lib/toaster/toastergui/templates/builddashboard.html b/bitbake/lib/toaster/toastergui/templates/builddashboard.html
index a01ef3d93b..9bd094ecc4 100644
--- a/bitbake/lib/toaster/toastergui/templates/builddashboard.html
+++ b/bitbake/lib/toaster/toastergui/templates/builddashboard.html
@@ -85,7 +85,7 @@
85 <dd>{{target.pkgsz|filtered_filesizeformat}}</dd> 85 <dd>{{target.pkgsz|filtered_filesizeformat}}</dd>
86 <dt> 86 <dt>
87 <i class="icon-question-sign get-help" title="The location in disk of the license manifest, a document listing all packages installed in your image and their licenses"></i> 87 <i class="icon-question-sign get-help" title="The location in disk of the license manifest, a document listing all packages installed in your image and their licenses"></i>
88 <a href="{% url 'target' build.pk target.target.pk %}">License manifest</a> 88 <a href="{% url 'targetpkg' build.pk target.target.pk %}">License manifest</a>
89 </dt> 89 </dt>
90 <dd><code>{{target.target.license_manifest_path}}</code></dd> 90 <dd><code>{{target.target.license_manifest_path}}</code></dd>
91 <dt> 91 <dt>
diff --git a/bitbake/lib/toaster/toastergui/urls.py b/bitbake/lib/toaster/toastergui/urls.py
index d7e9457c66..9b583f217b 100644
--- a/bitbake/lib/toaster/toastergui/urls.py
+++ b/bitbake/lib/toaster/toastergui/urls.py
@@ -46,6 +46,7 @@ urlpatterns = patterns('toastergui.views',
46 46
47 # images are known as targets in the internal model 47 # images are known as targets in the internal model
48 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)$', 'target', name='target'), 48 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)$', 'target', name='target'),
49 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/targetpkg$', 'targetpkg', name='targetpkg'),
49 url(r'^dentries/build/(?P<build_id>\d+)/target/(?P<target_id>\d+)$', 'dirinfo_ajax', name='dirinfo_ajax'), 50 url(r'^dentries/build/(?P<build_id>\d+)/target/(?P<target_id>\d+)$', 'dirinfo_ajax', name='dirinfo_ajax'),
50 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/dirinfo$', 'dirinfo', name='dirinfo'), 51 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/dirinfo$', 'dirinfo', name='dirinfo'),
51 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/dirinfo_filepath/(?P<file_path>(?:/[^/\n]+)*)$', 'dirinfo', name='dirinfo_filepath'), 52 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/dirinfo_filepath/(?P<file_path>(?:/[^/\n]+)*)$', 'dirinfo', name='dirinfo_filepath'),
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py
index b38d260d6f..6de448596a 100755
--- a/bitbake/lib/toaster/toastergui/views.py
+++ b/bitbake/lib/toaster/toastergui/views.py
@@ -540,132 +540,174 @@ def recipe(request, build_id, recipe_id):
540 } 540 }
541 return render(request, template, context) 541 return render(request, template, context)
542 542
543def target(request, build_id, target_id): 543def target_common( request, build_id, target_id, variant ):
544 template = "target.html" 544 template = "target.html"
545 default_orderby = 'name:+';
545 mandatory_parameters = { 'count': 25, 'page' : 1, 'orderby':'name:+'}; 546 mandatory_parameters = { 'count': 25, 'page' : 1, 'orderby':'name:+'};
546 retval = _verify_parameters( request.GET, mandatory_parameters ) 547 retval = _verify_parameters( request.GET, mandatory_parameters )
547 if retval: 548 if retval:
548 return _redirect_parameters( 'target', request.GET, mandatory_parameters, build_id = build_id, target_id = target_id) 549 return _redirect_parameters(
549 (filter_string, search_term, ordering_string) = _search_tuple(request, Package) 550 variant, request.GET, mandatory_parameters,
551 build_id = build_id, target_id = target_id )
552 ( filter_string, search_term, ordering_string ) = _search_tuple( request, Package )
550 553
551 # FUTURE: get rid of nested sub-queries replacing with ManyToMany field 554 # FUTURE: get rid of nested sub-queries replacing with ManyToMany field
552 queryset = Package.objects.filter(size__gte=0, id__in=Target_Installed_Package.objects.filter(target_id=target_id).values('package_id')) 555 queryset = Package.objects.filter(
553 packages_sum = queryset.aggregate(Sum('installed_size')) 556 size__gte = 0,
554 queryset = _get_queryset(Package, queryset, filter_string, search_term, ordering_string, 'name') 557 id__in = Target_Installed_Package.objects.filter(
555 packages = _build_page_range(Paginator(queryset, request.GET.get('count', 25)),request.GET.get('page', 1)) 558 target_id=target_id ).values( 'package_id' ))
559 packages_sum = queryset.aggregate( Sum( 'installed_size' ))
560 queryset = _get_queryset(
561 Package, queryset, filter_string, search_term, ordering_string, 'name' )
562 packages = _build_page_range( Paginator(
563 queryset, request.GET.get( 'count', 25 )),request.GET.get( 'page', 1 ))
556 564
557 # bring in package dependencies 565 # bring in package dependencies
558 for p in packages.object_list: 566 for p in packages.object_list:
559 p.runtime_dependencies = p.package_dependencies_source.filter(target_id = target_id, dep_type=Package_Dependency.TYPE_TRDEPENDS) 567 p.runtime_dependencies = p.package_dependencies_source.filter(
560 p.reverse_runtime_dependencies = p.package_dependencies_target.filter(target_id = target_id, dep_type=Package_Dependency.TYPE_TRDEPENDS) 568 target_id = target_id, dep_type=Package_Dependency.TYPE_TRDEPENDS )
561 569 p.reverse_runtime_dependencies = p.package_dependencies_target.filter(
562 context = { 'build': Build.objects.filter(pk=build_id)[0], 570 target_id = target_id, dep_type=Package_Dependency.TYPE_TRDEPENDS )
563 'target': Target.objects.filter(pk=target_id)[0], 571 tc_package = {
564 'objects': packages, 572 'name' : 'Package',
565 'packages_sum' : packages_sum['installed_size__sum'], 573 'qhelp' : 'Packaged output resulting from building a recipe included in this image',
566 'object_search_display': "packages included", 574 'orderfield' : _get_toggle_order( request, "name" ),
567 'default_orderby' : 'name:+', 575 'ordericon' : _get_toggle_order_icon( request, "name" ),
568 'tablecols':[ 576 }
569 { 577 tc_packageVersion = {
570 'name':'Package', 578 'name' : 'Package version',
571 'qhelp':'Packaged output resulting from building a recipe and included in this image', 579 'qhelp' : 'The package version and revision',
572 'orderfield': _get_toggle_order(request, "name"), 580 }
573 'ordericon':_get_toggle_order_icon(request, "name"), 581 tc_size = {
574 }, 582 'name' : 'Size',
575 { 583 'qhelp' : 'The size of the package',
576 'name':'Package version', 584 'orderfield' : _get_toggle_order( request, "size", True ),
577 'qhelp':'The package version and revision', 585 'ordericon' : _get_toggle_order_icon( request, "size" ),
578 }, 586 'orderkey' : 'size',
579 { 587 'clclass' : 'size',
580 'name':'Size', 588 'dclass' : 'span2',
581 'qhelp':'The size of the package', 589 }
582 'orderfield': _get_toggle_order(request, "size", True), 590 if ( variant == 'target' ):
583 'ordericon':_get_toggle_order_icon(request, "size"), 591 tc_size[ "hidden" ] = 0
584 'orderkey' : 'size', 592 else:
585 'clclass': 'size', 593 tc_size[ "hidden" ] = 1
586 'dclass' : 'span2', 594 tc_sizePercentage = {
587 'hidden' : 0, 595 'name' : 'Size over total (%)',
588 }, 596 'qhelp' : 'Proportion of the overall size represented by this package',
589 { 597 'orderfield' : _get_toggle_order( request, "size" ),
590 'name':'Size over total (%)', 598 'ordericon' : _get_toggle_order_icon( request, "size" ),
591 'qhelp':'Proportion of the overall included package size represented by this package', 599 'clclass' : 'size_over_total',
592 'orderkey' : 'size', 600 'hidden' : 1,
593 'clclass': 'size_over_total', 601 }
594 'dclass' : 'span2', 602 tc_license = {
595 'hidden' : 1, 603 'name' : 'License',
596 }, 604 'qhelp' : 'The license under which the package is distributed. Separate license names u\
597 { 605sing | (pipe) means there is a choice between licenses. Separate license names using & (ampersand) m\
598 'name':'License', 606eans multiple licenses exist that cover different parts of the source',
599 'qhelp':'The license under which the package is distributed. Multiple license names separated by the pipe character indicates a choice between licenses. Multiple license names separated by the ampersand character indicates multiple licenses exist that cover different parts of the source', 607 'orderfield' : _get_toggle_order( request, "license" ),
600 'orderfield': _get_toggle_order(request, "license"), 608 'ordericon' : _get_toggle_order_icon( request, "license" ),
601 'ordericon':_get_toggle_order_icon(request, "license"), 609 'orderkey' : 'license',
602 'orderkey' : 'license', 610 'clclass' : 'license',
603 'clclass': 'license', 611 }
604 'hidden' : 1, 612 if ( variant == 'target' ):
605 }, 613 tc_license[ "hidden" ] = 1
606 { 614 else:
607 'name':'Dependencies', 615 tc_license[ "hidden" ] = 0
608 'qhelp':"Package runtime dependencies (i.e. other packages)", 616 tc_dependencies = {
609 'clclass': 'depends', 617 'name' : 'Dependencies',
610 'hidden' : 0, 618 'qhelp' : "Package runtime dependencies (other packages)",
611 }, 619 'clclass' : 'depends',
612 { 620 }
613 'name':'Reverse dependencies', 621 if ( variant == 'target' ):
614 'qhelp':'Package run-time reverse dependencies (i.e. other packages that depend on this package)', 622 tc_dependencies[ "hidden" ] = 0
615 'clclass': 'brought_in_by', 623 else:
616 'hidden' : 0, 624 tc_dependencies[ "hidden" ] = 1
617 }, 625 tc_rdependencies = {
618 { 626 'name' : 'Reverse dependencies',
619 'name':'Recipe', 627 'qhelp' : 'Package run-time reverse dependencies (i.e. which other packages depend on t\
620 'qhelp':'The name of the recipe building the package', 628his package',
621 'orderfield': _get_toggle_order(request, "recipe__name"), 629 'clclass' : 'brought_in_by',
622 'ordericon':_get_toggle_order_icon(request, "recipe__name"), 630 }
623 'orderkey' : 'recipe__name', 631 if ( variant == 'target' ):
624 'clclass': 'recipe_name', 632 tc_rdependencies[ "hidden" ] = 0
625 'hidden' : 0, 633 else:
626 }, 634 tc_rdependencies[ "hidden" ] = 1
627 { 635 tc_recipe = {
628 'name':'Recipe version', 636 'name' : 'Recipe',
629 'qhelp':'Version and revision of the recipe building the package', 637 'qhelp' : 'The name of the recipe building the package',
630 'clclass': 'recipe_version', 638 'orderfield' : _get_toggle_order( request, "recipe__name" ),
631 'hidden' : 1, 639 'ordericon' : _get_toggle_order_icon( request, "recipe__name" ),
632 }, 640 'clclass' : 'recipe_name',
633 { 641 'hidden' : 0,
634 'name':'Layer', 642 }
635 'qhelp':'The name of the layer providing the recipe that builds the package', 643 tc_recipeVersion = {
636 'orderfield': _get_toggle_order(request, "recipe__layer_version__layer__name"), 644 'name' : 'Recipe version',
637 'ordericon':_get_toggle_order_icon(request, "recipe__layer_version__layer__name"), 645 'qhelp' : 'Version and revision of the recipe building the package',
638 'orderkey' : 'recipe__layer_version__layer__name', 646 'clclass' : 'recipe_version',
639 'clclass': 'layer_name', 647 'hidden' : 1,
640 'hidden' : 1, 648 }
641 }, 649 tc_layer = {
642 { 650 'name' : 'Layer',
643 'name':'Layer branch', 651 'qhelp' : 'The name of the layer providing the recipe that builds the package',
644 'qhelp':'The Git branch of the layer providing the recipe that builds the package', 652 'orderfield' : _get_toggle_order( request, "recipe__layer_version__layer__name" ),
645 'orderfield': _get_toggle_order(request, "recipe__layer_version__branch"), 653 'ordericon' : _get_toggle_order_icon( request, "recipe__layer_version__layer__name" ),
646 'ordericon':_get_toggle_order_icon(request, "recipe__layer_version__branch"), 654 'clclass' : 'layer_name',
647 'orderkey' : 'recipe__layer_version__branch', 655 'hidden' : 1,
648 'clclass': 'layer_branch', 656 }
649 'hidden' : 1, 657 tc_layerBranch = {
650 }, 658 'name' : 'Layer branch',
651 { 659 'qhelp' : 'The Git branch of the layer providing the recipe that builds the package',
652 'name':'Layer commit', 660 'orderfield' : _get_toggle_order( request, "recipe__layer_version__branch" ),
653 'qhelp':'The Git commit of the layer providing the recipe that builds the package', 661 'ordericon' : _get_toggle_order_icon( request, "recipe__layer_version__branch" ),
654 'clclass': 'layer_commit', 662 'clclass' : 'layer_branch',
655 'hidden' : 1, 663 'hidden' : 1,
656 }, 664 }
657 { 665 tc_layerCommit = {
658 'name':'Layer directory', 666 'name' : 'Layer commit',
659 'qhelp':'Path to the layer providing the recipe that builds the package', 667 'qhelp' : 'The Git commit of the layer providing the recipe that builds the package',
660 'orderfield': _get_toggle_order(request, "recipe__layer_version__layer__local_path"), 668 'clclass' : 'layer_commit',
661 'ordericon':_get_toggle_order_icon(request, "recipe__layer_version__layer__local_path"), 669 'hidden' : 1,
662 'clclass': 'layer_directory', 670 }
663 'hidden' : 1, 671 tc_layerDir = {
664 }, 672 'name':'Layer directory',
673 'qhelp':'Location in disk of the layer providing the recipe that builds the package',
674 'orderfield' : _get_toggle_order( request, "recipe__layer_version__layer__local_path" ),
675 'ordericon' : _get_toggle_order_icon( request, "recipe__layer_version__layer__local_path" )\
676,
677 'clclass' : 'layer_directory',
678 'hidden' : 1,
679 }
680 context = {
681 'objectname': variant,
682 'build' : Build.objects.filter( pk = build_id )[ 0 ],
683 'target' : Target.objects.filter( pk = target_id )[ 0 ],
684 'objects' : packages,
685 'packages_sum' : packages_sum[ 'installed_size__sum' ],
686 'object_search_display': "packages included",
687 'default_orderby' : default_orderby,
688 'tablecols' : [
689 tc_package,
690 tc_packageVersion,
691 tc_license,
692 tc_size,
693 tc_sizePercentage,
694 tc_dependencies,
695 tc_rdependencies,
696 tc_recipe,
697 tc_recipeVersion,
698 tc_layer,
699 tc_layerBranch,
700 tc_layerCommit,
701 tc_layerDir,
665 ] 702 ]
666 } 703 }
704 return( render( request, template, context ))
667 705
668 return render(request, template, context) 706def target( request, build_id, target_id ):
707 return( target_common( request, build_id, target_id, "target" ))
708
709def targetpkg( request, build_id, target_id ):
710 return( target_common( request, build_id, target_id, "targetpkg" ))
669 711
670from django.core.serializers.json import DjangoJSONEncoder 712from django.core.serializers.json import DjangoJSONEncoder
671from django.http import HttpResponse 713from django.http import HttpResponse