diff options
4 files changed, 94 insertions, 43 deletions
diff --git a/bitbake/lib/toaster/toastergui/static/js/base.js b/bitbake/lib/toaster/toastergui/static/js/base.js index 895e61b2aa..6042a96ee4 100644 --- a/bitbake/lib/toaster/toastergui/static/js/base.js +++ b/bitbake/lib/toaster/toastergui/static/js/base.js | |||
| @@ -6,6 +6,7 @@ function basePageInit(ctx) { | |||
| 6 | var newBuildTargetInput; | 6 | var newBuildTargetInput; |
| 7 | var newBuildTargetBuildBtn; | 7 | var newBuildTargetBuildBtn; |
| 8 | var projectNameForm = $("#project-name-change-form"); | 8 | var projectNameForm = $("#project-name-change-form"); |
| 9 | var projectNameContainer = $("#project-name-container"); | ||
| 9 | var projectName = $("#project-name"); | 10 | var projectName = $("#project-name"); |
| 10 | var projectNameFormToggle = $("#project-change-form-toggle"); | 11 | var projectNameFormToggle = $("#project-change-form-toggle"); |
| 11 | var projectNameChangeCancel = $("#project-name-change-cancel"); | 12 | var projectNameChangeCancel = $("#project-name-change-cancel"); |
| @@ -23,24 +24,21 @@ function basePageInit(ctx) { | |||
| 23 | /* Project name change functionality */ | 24 | /* Project name change functionality */ |
| 24 | projectNameFormToggle.click(function(e){ | 25 | projectNameFormToggle.click(function(e){ |
| 25 | e.preventDefault(); | 26 | e.preventDefault(); |
| 26 | 27 | projectNameContainer.hide(); | |
| 27 | $(this).add(projectName).hide(); | ||
| 28 | projectNameForm.fadeIn(); | 28 | projectNameForm.fadeIn(); |
| 29 | }); | 29 | }); |
| 30 | 30 | ||
| 31 | projectNameChangeCancel.click(function(e){ | 31 | projectNameChangeCancel.click(function(e){ |
| 32 | e.preventDefault(); | 32 | e.preventDefault(); |
| 33 | |||
| 34 | projectNameForm.hide(); | 33 | projectNameForm.hide(); |
| 35 | projectName.add(projectNameFormToggle).fadeIn(); | 34 | projectNameContainer.fadeIn(); |
| 36 | }); | 35 | }); |
| 37 | 36 | ||
| 38 | $("#project-name-change-btn").click(function(e){ | 37 | $("#project-name-change-btn").click(function(e){ |
| 39 | var newProjectName = $("#project-name-change-input").val(); | 38 | var newProjectName = $("#project-name-change-input").val(); |
| 40 | 39 | ||
| 41 | libtoaster.editCurrentProject({ projectName: newProjectName },function (){ | 40 | libtoaster.editCurrentProject({ projectName: newProjectName }, function (){ |
| 42 | 41 | projectName.html(newProjectName); | |
| 43 | projectName.text(newProjectName); | ||
| 44 | libtoaster.ctx.projectName = newProjectName; | 42 | libtoaster.ctx.projectName = newProjectName; |
| 45 | projectNameChangeCancel.click(); | 43 | projectNameChangeCancel.click(); |
| 46 | }); | 44 | }); |
diff --git a/bitbake/lib/toaster/toastergui/templates/mrb_section.html b/bitbake/lib/toaster/toastergui/templates/mrb_section.html index b29f650f5d..53f40d0f14 100644 --- a/bitbake/lib/toaster/toastergui/templates/mrb_section.html +++ b/bitbake/lib/toaster/toastergui/templates/mrb_section.html | |||
| @@ -8,6 +8,10 @@ | |||
| 8 | {%if mrb_type == 'project' %} | 8 | {%if mrb_type == 'project' %} |
| 9 | <h2> | 9 | <h2> |
| 10 | Latest project builds | 10 | Latest project builds |
| 11 | |||
| 12 | {% if project.is_default %} | ||
| 13 | <i class="icon-question-sign get-help heading-help" title="" data-original-title="Builds in this project cannot be started from Toaster: they are started from the command line"></i> | ||
| 14 | {% endif %} | ||
| 11 | </h2> | 15 | </h2> |
| 12 | {% else %} | 16 | {% else %} |
| 13 | <div class="page-header"> | 17 | <div class="page-header"> |
diff --git a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html index a3d1b88edf..ee86b5481d 100644 --- a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html +++ b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html | |||
| @@ -5,8 +5,14 @@ | |||
| 5 | 5 | ||
| 6 | <!-- project name --> | 6 | <!-- project name --> |
| 7 | <div class="page-header"> | 7 | <div class="page-header"> |
| 8 | <h1><span id="project-name">{{project.name}}</span> | 8 | <h1 id="project-name-container"> |
| 9 | <span id="project-name">{{project.name}}</span> | ||
| 10 | |||
| 9 | <i class="icon-pencil" data-original-title="" id="project-change-form-toggle" title=""></i> | 11 | <i class="icon-pencil" data-original-title="" id="project-change-form-toggle" title=""></i> |
| 12 | |||
| 13 | {% if project.is_default %} | ||
| 14 | <i class="icon-question-sign get-help heading-help" title="" data-original-title="This project shows information about the builds you start from the command line while Toaster is running"></i> | ||
| 15 | {% endif %} | ||
| 10 | </h1> | 16 | </h1> |
| 11 | <form id="project-name-change-form" style="margin-bottom: 0px; display: none;"> | 17 | <form id="project-name-change-form" style="margin-bottom: 0px; display: none;"> |
| 12 | <div class="input-append"> | 18 | <div class="input-append"> |
| @@ -17,38 +23,40 @@ | |||
| 17 | </form> | 23 | </form> |
| 18 | </div> | 24 | </div> |
| 19 | 25 | ||
| 20 | <div id="project-topbar"> | 26 | {% if not project.is_default %} |
| 21 | <ul class="nav nav-pills"> | 27 | <div id="project-topbar"> |
| 22 | <li> | 28 | <ul class="nav nav-pills"> |
| 23 | <a href="{% url 'projectbuilds' project.id %}"> | 29 | <li> |
| 24 | Builds (<span class="total-builds">0</span>) | 30 | <a href="{% url 'projectbuilds' project.id %}"> |
| 25 | </a> | 31 | Builds (<span class="total-builds">0</span>) |
| 26 | </li> | 32 | </a> |
| 27 | <li id="topbar-configuration-tab"> | 33 | </li> |
| 28 | <a href="{% url 'project' project.id %}"> | 34 | <li id="topbar-configuration-tab"> |
| 29 | Configuration | 35 | <a href="{% url 'project' project.id %}"> |
| 30 | </a> | 36 | Configuration |
| 31 | </li> | 37 | </a> |
| 32 | <li> | 38 | </li> |
| 33 | <a href="{% url 'importlayer' project.id %}"> | 39 | <li> |
| 34 | Import layer | 40 | <a href="{% url 'importlayer' project.id %}"> |
| 35 | </a> | 41 | Import layer |
| 36 | </li> | 42 | </a> |
| 37 | {% if CUSTOM_IMAGE %} | 43 | </li> |
| 38 | <li> | 44 | {% if CUSTOM_IMAGE %} |
| 39 | <a href="{% url 'newcustomimage' project.id %}"> | 45 | <li> |
| 40 | New custom image | 46 | <a href="{% url 'newcustomimage' project.id %}"> |
| 41 | </a> | 47 | New custom image |
| 42 | </li> | 48 | </a> |
| 43 | {% endif %} | 49 | </li> |
| 44 | <li class="pull-right"> | 50 | {% endif %} |
| 45 | <form class="form-inline" style="margin-bottom:0px;"> | 51 | <li class="pull-right"> |
| 46 | <i class="icon-question-sign get-help heading-help" data-placement="left" title="" data-original-title="Type the name of one or more recipes you want to build, separated by a space. You can also specify a task by appending a semicolon and a task name to the recipe name, like so: <code>busybox:clean</code>"></i> | 52 | <form class="form-inline" style="margin-bottom:0px;"> |
| 47 | <div class="input-append"> | 53 | <i class="icon-question-sign get-help heading-help" data-placement="left" title="" data-original-title="Type the name of one or more recipes you want to build, separated by a space. You can also specify a task by appending a semicolon and a task name to the recipe name, like so: <code>busybox:clean</code>"></i> |
| 48 | <input id="build-input" type="text" class="input-xlarge input-lg build-target-input" placeholder="Type the recipe you want to build" autocomplete="off" disabled> | 54 | <div class="input-append"> |
| 49 | <button id="build-button" class="btn btn-primary btn-large build-button" data-project-id="{{project.id}}" disabled>Build</button> | 55 | <input id="build-input" type="text" class="input-xlarge input-lg build-target-input" placeholder="Type the recipe you want to build" autocomplete="off" disabled> |
| 50 | </div> | 56 | <button id="build-button" class="btn btn-primary btn-large build-button" data-project-id="{{project.id}}" disabled>Build</button> |
| 51 | </form> | 57 | </div> |
| 52 | </li> | 58 | </form> |
| 53 | </ul> | 59 | </li> |
| 54 | </div> | 60 | </ul> |
| 61 | </div> | ||
| 62 | {% endif %} | ||
diff --git a/bitbake/lib/toaster/toastergui/tests.py b/bitbake/lib/toaster/toastergui/tests.py index 3753748b75..4b93415e1e 100644 --- a/bitbake/lib/toaster/toastergui/tests.py +++ b/bitbake/lib/toaster/toastergui/tests.py | |||
| @@ -596,8 +596,18 @@ class ProjectBuildsPageTests(TestCase): | |||
| 596 | bitbake_version=bbv) | 596 | bitbake_version=bbv) |
| 597 | self.project1 = Project.objects.create_project(name=PROJECT_NAME, | 597 | self.project1 = Project.objects.create_project(name=PROJECT_NAME, |
| 598 | release=release) | 598 | release=release) |
| 599 | self.project1.save() | ||
| 600 | |||
| 599 | self.project2 = Project.objects.create_project(name=PROJECT_NAME, | 601 | self.project2 = Project.objects.create_project(name=PROJECT_NAME, |
| 600 | release=release) | 602 | release=release) |
| 603 | self.project2.save() | ||
| 604 | |||
| 605 | self.default_project = Project.objects.create_project( | ||
| 606 | name=CLI_BUILDS_PROJECT_NAME, | ||
| 607 | release=release | ||
| 608 | ) | ||
| 609 | self.default_project.is_default = True | ||
| 610 | self.default_project.save() | ||
| 601 | 611 | ||
| 602 | # parameters for builds to associate with the projects | 612 | # parameters for builds to associate with the projects |
| 603 | now = timezone.now() | 613 | now = timezone.now() |
| @@ -630,6 +640,13 @@ class ProjectBuildsPageTests(TestCase): | |||
| 630 | "outcome": Build.IN_PROGRESS | 640 | "outcome": Build.IN_PROGRESS |
| 631 | } | 641 | } |
| 632 | 642 | ||
| 643 | self.default_project_build_success = { | ||
| 644 | "project": self.default_project, | ||
| 645 | "started_on": now, | ||
| 646 | "completed_on": now, | ||
| 647 | "outcome": Build.SUCCEEDED | ||
| 648 | } | ||
| 649 | |||
| 633 | def _get_rows_for_project(self, project_id): | 650 | def _get_rows_for_project(self, project_id): |
| 634 | """ Helper to retrieve HTML rows for a project """ | 651 | """ Helper to retrieve HTML rows for a project """ |
| 635 | url = reverse("projectbuilds", args=(project_id,)) | 652 | url = reverse("projectbuilds", args=(project_id,)) |
| @@ -681,6 +698,30 @@ class ProjectBuildsPageTests(TestCase): | |||
| 681 | result = re.findall('^ +bash:clean$', response.content, re.MULTILINE) | 698 | result = re.findall('^ +bash:clean$', response.content, re.MULTILINE) |
| 682 | self.assertEqual(len(result), 2) | 699 | self.assertEqual(len(result), 2) |
| 683 | 700 | ||
| 701 | def test_cli_builds_hides_tabs(self): | ||
| 702 | """ | ||
| 703 | Display for command line builds should hide tabs; | ||
| 704 | note that the latest builds section is already tested in | ||
| 705 | AllBuildsPageTests, as the template is the same | ||
| 706 | """ | ||
| 707 | url = reverse("projectbuilds", args=(self.default_project.id,)) | ||
| 708 | response = self.client.get(url, follow=True) | ||
| 709 | soup = BeautifulSoup(response.content) | ||
| 710 | tabs = soup.select('#project-topbar') | ||
| 711 | self.assertEqual(len(tabs), 0, | ||
| 712 | 'should be no top bar shown for command line builds') | ||
| 713 | |||
| 714 | def test_non_cli_builds_has_tabs(self): | ||
| 715 | """ | ||
| 716 | Non-command-line builds projects should show the tabs | ||
| 717 | """ | ||
| 718 | url = reverse("projectbuilds", args=(self.project1.id,)) | ||
| 719 | response = self.client.get(url, follow=True) | ||
| 720 | soup = BeautifulSoup(response.content) | ||
| 721 | tabs = soup.select('#project-topbar') | ||
| 722 | self.assertEqual(len(tabs), 1, | ||
| 723 | 'should be a top bar shown for non-command-line builds') | ||
| 724 | |||
| 684 | class AllBuildsPageTests(TestCase): | 725 | class AllBuildsPageTests(TestCase): |
| 685 | """ Tests for all builds page /builds/ """ | 726 | """ Tests for all builds page /builds/ """ |
| 686 | 727 | ||
