diff options
author | Farrell Wymore <farrell.wymore@windriver.com> | 2014-05-22 14:58:14 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2014-06-20 14:58:08 +0100 |
commit | 5b8c5ea151b1189d50ffa4f8004fa869d790bbf2 (patch) | |
tree | bc103d33321c130c48fcd43267166236899c8de1 /bitbake | |
parent | 7a42bfecc25ecb27194b0d2dc78a3265977c45a2 (diff) | |
download | poky-5b8c5ea151b1189d50ffa4f8004fa869d790bbf2.tar.gz |
bitbake: toaster: refactor the target page
the target (packages) page had to refactored to
allow the displays to differ depending on the caller
namely the license manifest link. Amended to make the
link from the tag rather than the pathname itself.
[YOCTO #6291]
[YOCTO #6079]
(Bitbake rev: 5ea0644c82560bcfc3aeb5149e4af9ee1909c299)
Signed-off-by: Farrell Wymore <farrell.wymore@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r-- | bitbake/lib/toaster/toastergui/templates/builddashboard.html | 2 | ||||
-rw-r--r-- | bitbake/lib/toaster/toastergui/urls.py | 1 | ||||
-rwxr-xr-x | bitbake/lib/toaster/toastergui/views.py | 270 |
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 | ||
543 | def target(request, build_id, target_id): | 543 | def 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 | { | 605 | sing | (pipe) means there is a choice between licenses. Separate license names using & (ampersand) m\ |
598 | 'name':'License', | 606 | eans 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', | 628 | his 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) | 706 | def target( request, build_id, target_id ): |
707 | return( target_common( request, build_id, target_id, "target" )) | ||
708 | |||
709 | def targetpkg( request, build_id, target_id ): | ||
710 | return( target_common( request, build_id, target_id, "targetpkg" )) | ||
669 | 711 | ||
670 | from django.core.serializers.json import DjangoJSONEncoder | 712 | from django.core.serializers.json import DjangoJSONEncoder |
671 | from django.http import HttpResponse | 713 | from django.http import HttpResponse |