diff options
author | Elliot Smith <elliot.smith@intel.com> | 2015-09-04 10:37:47 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2015-09-18 09:05:36 +0100 |
commit | 441f04ce97d12fd6b5f6cad9e23afe7080939092 (patch) | |
tree | 9800ec5a4d7976d833bc777e33e2f06cc673b0b1 | |
parent | 30f9f79fb96db0149a776f02f4774750653fd964 (diff) | |
download | poky-441f04ce97d12fd6b5f6cad9e23afe7080939092.tar.gz |
bitbake: toaster: Simplify redirects when build page parameters are missing
A RedirectException is used to redirect the client to the
correct page when their original request is missing the
required parameters (page, orderby etc.). However, the code
is difficult to follow.
Rather than catching RedirectExceptions and rethrowing them with
different view URLs, ensure that the RedirectException has the
correct URL in it when thrown by passing the original page
name to the _build_list_helper() method.
Modified from an original patch by
David Reyna <david.reyna@windriver.com>.
(Bitbake rev: 38f935647dd768a912b933adebfc9cb225a01a54)
Signed-off-by: Elliot Smith <elliot.smith@intel.com>
Signed-off-by: brian avery <avery.brian@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rwxr-xr-x | bitbake/lib/toaster/toastergui/views.py | 49 |
1 files changed, 32 insertions, 17 deletions
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py index 67c84b2934..d9802f01b8 100755 --- a/bitbake/lib/toaster/toastergui/views.py +++ b/bitbake/lib/toaster/toastergui/views.py | |||
@@ -1897,6 +1897,10 @@ if True: | |||
1897 | pass | 1897 | pass |
1898 | 1898 | ||
1899 | # shows the "all builds" page for managed mode; it displays build requests (at least started!) instead of actual builds | 1899 | # shows the "all builds" page for managed mode; it displays build requests (at least started!) instead of actual builds |
1900 | # WARNING _build_list_helper() may raise a RedirectException, which | ||
1901 | # will set the GET parameters and redirect back to the | ||
1902 | # all-builds or projectbuilds page as appropriate; | ||
1903 | # TODO don't use exceptions to control program flow | ||
1900 | @_template_renderer("builds.html") | 1904 | @_template_renderer("builds.html") |
1901 | def builds(request): | 1905 | def builds(request): |
1902 | # define here what parameters the view needs in the GET portion in order to | 1906 | # define here what parameters the view needs in the GET portion in order to |
@@ -1905,27 +1909,35 @@ if True: | |||
1905 | 1909 | ||
1906 | queryset = Build.objects.all() | 1910 | queryset = Build.objects.all() |
1907 | 1911 | ||
1908 | try: | 1912 | redirect_page = resolve(request.path_info).url_name |
1909 | context, pagesize, orderby = _build_list_helper(request, queryset) | 1913 | |
1910 | # all builds page as a Project column | 1914 | context, pagesize, orderby = _build_list_helper(request, |
1911 | context['tablecols'].append({'name': 'Project', 'clcalss': 'project_column', }) | 1915 | queryset, |
1912 | except RedirectException as re: | 1916 | redirect_page) |
1913 | # rewrite the RedirectException | 1917 | # all builds page as a Project column |
1914 | re.view = resolve(request.path_info).url_name | 1918 | context['tablecols'].append({ |
1915 | raise re | 1919 | 'name': 'Project', |
1920 | 'clclass': 'project_column' | ||
1921 | }) | ||
1916 | 1922 | ||
1917 | _set_parameters_values(pagesize, orderby, request) | 1923 | _set_parameters_values(pagesize, orderby, request) |
1918 | return context | 1924 | return context |
1919 | 1925 | ||
1920 | 1926 | ||
1921 | # helper function, to be used on "all builds" and "project builds" pages | 1927 | # helper function, to be used on "all builds" and "project builds" pages |
1922 | def _build_list_helper(request, queryset_all): | 1928 | def _build_list_helper(request, queryset_all, redirect_page, pid=None): |
1923 | default_orderby = 'completed_on:-' | 1929 | default_orderby = 'completed_on:-' |
1924 | (pagesize, orderby) = _get_parameters_values(request, 10, default_orderby) | 1930 | (pagesize, orderby) = _get_parameters_values(request, 10, default_orderby) |
1925 | mandatory_parameters = { 'count': pagesize, 'page' : 1, 'orderby' : orderby } | 1931 | mandatory_parameters = { 'count': pagesize, 'page' : 1, 'orderby' : orderby } |
1926 | retval = _verify_parameters( request.GET, mandatory_parameters ) | 1932 | retval = _verify_parameters( request.GET, mandatory_parameters ) |
1927 | if retval: | 1933 | if retval: |
1928 | raise RedirectException( None, request.GET, mandatory_parameters) | 1934 | params = {} |
1935 | if pid: | ||
1936 | params = {'pid': pid} | ||
1937 | raise RedirectException(redirect_page, | ||
1938 | request.GET, | ||
1939 | mandatory_parameters, | ||
1940 | **params) | ||
1929 | 1941 | ||
1930 | # boilerplate code that takes a request for an object type and returns a queryset | 1942 | # boilerplate code that takes a request for an object type and returns a queryset |
1931 | # for that object type. copypasta for all needed table searches | 1943 | # for that object type. copypasta for all needed table searches |
@@ -2669,6 +2681,10 @@ if True: | |||
2669 | 2681 | ||
2670 | return context | 2682 | return context |
2671 | 2683 | ||
2684 | # WARNING _build_list_helper() may raise a RedirectException, which | ||
2685 | # will set the GET parameters and redirect back to the | ||
2686 | # all-builds or projectbuilds page as appropriate; | ||
2687 | # TODO don't use exceptions to control program flow | ||
2672 | @_template_renderer('projectbuilds.html') | 2688 | @_template_renderer('projectbuilds.html') |
2673 | def projectbuilds(request, pid): | 2689 | def projectbuilds(request, pid): |
2674 | prj = Project.objects.get(id = pid) | 2690 | prj = Project.objects.get(id = pid) |
@@ -2708,13 +2724,12 @@ if True: | |||
2708 | 2724 | ||
2709 | queryset = Build.objects.filter(project_id = pid) | 2725 | queryset = Build.objects.filter(project_id = pid) |
2710 | 2726 | ||
2711 | try: | 2727 | redirect_page = resolve(request.path_info).url_name |
2712 | context, pagesize, orderby = _build_list_helper(request, queryset) | 2728 | |
2713 | except RedirectException as re: | 2729 | context, pagesize, orderby = _build_list_helper(request, |
2714 | # rewrite the RedirectException with our current url information | 2730 | queryset, |
2715 | re.view = resolve(request.path_info).url_name | 2731 | redirect_page, |
2716 | re.okwargs = {"pid" : pid} | 2732 | pid) |
2717 | raise re | ||
2718 | 2733 | ||
2719 | context['project'] = prj | 2734 | context['project'] = prj |
2720 | _set_parameters_values(pagesize, orderby, request) | 2735 | _set_parameters_values(pagesize, orderby, request) |