1# 2# BitBake Toaster Implementation 3# 4# Copyright (C) 2013-2017 Intel Corporation 5# 6# This program is free software; you can redistribute it and/or modify 7# it under the terms of the GNU General Public License version 2 as 8# published by the Free Software Foundation. 9# 10# This program is distributed in the hope that it will be useful, 11# but WITHOUT ANY WARRANTY; without even the implied warranty of 12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13# GNU General Public License for more details. 14# 15# You should have received a copy of the GNU General Public License along 16# with this program; if not, write to the Free Software Foundation, Inc., 17# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 19from django.conf.urls import include, url 20from django.views.generic import RedirectView, TemplateView 21 22from django.http import HttpResponseBadRequest 23from toastergui import tables 24from toastergui import buildtables 25from toastergui import typeaheads 26from toastergui import api 27from toastergui import widgets 28from toastergui import views 29 30urlpatterns = [ 31 # landing page 32 url(r'^landing/$', views.landing, name='landing'), 33 34 url(r'^builds/$', 35 tables.AllBuildsTable.as_view(template_name="builds-toastertable.html"), 36 name='all-builds'), 37 38 # build info navigation 39 url(r'^build/(?P<build_id>\d+)$', views.builddashboard, name="builddashboard"), 40 url(r'^build/(?P<build_id>\d+)/tasks/$', 41 buildtables.BuildTasksTable.as_view( 42 template_name="buildinfo-toastertable.html"), 43 name='tasks'), 44 45 url(r'^build/(?P<build_id>\d+)/task/(?P<task_id>\d+)$', views.task, name='task'), 46 47 url(r'^build/(?P<build_id>\d+)/recipes/$', 48 buildtables.BuiltRecipesTable.as_view( 49 template_name="buildinfo-toastertable.html"), 50 name='recipes'), 51 52 url(r'^build/(?P<build_id>\d+)/recipe/(?P<recipe_id>\d+)/active_tab/(?P<active_tab>\d{1})$', views.recipe, name='recipe'), 53 54 url(r'^build/(?P<build_id>\d+)/recipe/(?P<recipe_id>\d+)$', views.recipe, name='recipe'), 55 url(r'^build/(?P<build_id>\d+)/recipe_packages/(?P<recipe_id>\d+)$', views.recipe_packages, name='recipe_packages'), 56 57 url(r'^build/(?P<build_id>\d+)/packages/$', 58 buildtables.BuiltPackagesTable.as_view( 59 template_name="buildinfo-toastertable.html"), 60 name='packages'), 61 62 url(r'^build/(?P<build_id>\d+)/package/(?P<package_id>\d+)$', views.package_built_detail, 63 name='package_built_detail'), 64 url(r'^build/(?P<build_id>\d+)/package_built_dependencies/(?P<package_id>\d+)$', 65 views.package_built_dependencies, name='package_built_dependencies'), 66 url(r'^build/(?P<build_id>\d+)/package_included_detail/(?P<target_id>\d+)/(?P<package_id>\d+)$', 67 views.package_included_detail, name='package_included_detail'), 68 url(r'^build/(?P<build_id>\d+)/package_included_dependencies/(?P<target_id>\d+)/(?P<package_id>\d+)$', 69 views.package_included_dependencies, name='package_included_dependencies'), 70 url(r'^build/(?P<build_id>\d+)/package_included_reverse_dependencies/(?P<target_id>\d+)/(?P<package_id>\d+)$', 71 views.package_included_reverse_dependencies, name='package_included_reverse_dependencies'), 72 73 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)$', 74 buildtables.InstalledPackagesTable.as_view( 75 template_name="target.html"), 76 name='target'), 77 78 79 url(r'^dentries/build/(?P<build_id>\d+)/target/(?P<target_id>\d+)$', views.xhr_dirinfo, name='dirinfo_ajax'), 80 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/dirinfo$', views.dirinfo, name='dirinfo'), 81 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/dirinfo_filepath/_(?P<file_path>(?:/[^/\n]+)*)$', views.dirinfo, name='dirinfo_filepath'), 82 url(r'^build/(?P<build_id>\d+)/configuration$', views.configuration, name='configuration'), 83 url(r'^build/(?P<build_id>\d+)/configvars$', views.configvars, name='configvars'), 84 url(r'^build/(?P<build_id>\d+)/buildtime$', 85 buildtables.BuildTimeTable.as_view( 86 template_name="buildinfo-toastertable.html"), 87 name='buildtime'), 88 89 url(r'^build/(?P<build_id>\d+)/cputime$', 90 buildtables.BuildCPUTimeTable.as_view( 91 template_name="buildinfo-toastertable.html"), 92 name='cputime'), 93 94 url(r'^build/(?P<build_id>\d+)/diskio$', 95 buildtables.BuildIOTable.as_view( 96 template_name="buildinfo-toastertable.html"), 97 name='diskio'), 98 99 # image information dir 100 url(r'^build/(?P<build_id>\d+)/target/(?P<target_id>\d+)/packagefile/(?P<packagefile_id>\d+)$', 101 views.image_information_dir, name='image_information_dir'), 102 103 # build download artifact 104 url(r'^build/(?P<build_id>\d+)/artifact/(?P<artifact_type>\w+)/id/(?P<artifact_id>\w+)', views.build_artifact, name="build_artifact"), 105 106 # project URLs 107 url(r'^newproject/$', views.newproject, name='newproject'), 108 109 url(r'^projects/$', 110 tables.ProjectsTable.as_view(template_name="projects-toastertable.html"), 111 name='all-projects'), 112 113 url(r'^project/(?P<pid>\d+)/$', views.project, name='project'), 114 url(r'^project/(?P<pid>\d+)/configuration$', views.projectconf, name='projectconf'), 115 url(r'^project/(?P<pid>\d+)/builds/$', 116 tables.ProjectBuildsTable.as_view(template_name="projectbuilds-toastertable.html"), 117 name='projectbuilds'), 118 119 # the import layer is a project-specific functionality; 120 url(r'^project/(?P<pid>\d+)/importlayer$', views.importlayer, name='importlayer'), 121 122 # the table pages that have been converted to ToasterTable widget 123 url(r'^project/(?P<pid>\d+)/machines/$', 124 tables.MachinesTable.as_view(template_name="generic-toastertable-page.html"), 125 name="projectmachines"), 126 127 url(r'^project/(?P<pid>\d+)/softwarerecipes/$', 128 tables.SoftwareRecipesTable.as_view(template_name="generic-toastertable-page.html"), 129 name="projectsoftwarerecipes"), 130 131 url(r'^project/(?P<pid>\d+)/images/$', 132 tables.ImageRecipesTable.as_view(template_name="generic-toastertable-page.html"), name="projectimagerecipes"), 133 134 url(r'^project/(?P<pid>\d+)/customimages/$', 135 tables.CustomImagesTable.as_view(template_name="generic-toastertable-page.html"), name="projectcustomimages"), 136 137 url(r'^project/(?P<pid>\d+)/newcustomimage/$', 138 tables.NewCustomImagesTable.as_view(template_name="newcustomimage.html"), 139 name="newcustomimage"), 140 141 url(r'^project/(?P<pid>\d+)/layers/$', 142 tables.LayersTable.as_view(template_name="generic-toastertable-page.html"), 143 name="projectlayers"), 144 145 url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)$', 146 views.layerdetails, name='layerdetails'), 147 148 url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)/recipes/$', 149 tables.LayerRecipesTable.as_view(template_name="generic-toastertable-page.html"), 150 { 'table_name': tables.LayerRecipesTable.__name__.lower(), 151 'title' : 'All recipes in layer' }, 152 name=tables.LayerRecipesTable.__name__.lower()), 153 154 url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)/machines/$', 155 tables.LayerMachinesTable.as_view(template_name="generic-toastertable-page.html"), 156 { 'table_name': tables.LayerMachinesTable.__name__.lower(), 157 'title' : 'All machines in layer' }, 158 name=tables.LayerMachinesTable.__name__.lower()), 159 160 161 url(r'^project/(?P<pid>\d+)/distros/$', 162 tables.DistrosTable.as_view(template_name="generic-toastertable-page.html"), 163 name="projectdistros"), 164 165 166 url(r'^project/(?P<pid>\d+)/customrecipe/(?P<custrecipeid>\d+)/selectpackages/$', 167 tables.SelectPackagesTable.as_view(), name="recipeselectpackages"), 168 169 170 url(r'^project/(?P<pid>\d+)/customrecipe/(?P<custrecipeid>\d+)$', 171 tables.SelectPackagesTable.as_view(template_name="customrecipe.html"), 172 name="customrecipe"), 173 174 url(r'^project/(?P<pid>\d+)/customrecipe/(?P<recipe_id>\d+)/download$', 175 views.customrecipe_download, 176 name="customrecipedownload"), 177 178 url(r'^project/(?P<pid>\d+)/recipe/(?P<recipe_id>\d+)$', 179 tables.PackagesTable.as_view(template_name="recipedetails.html"), 180 name="recipedetails"), 181 182 # typeahead api end points 183 url(r'^xhr_typeahead/(?P<pid>\d+)/layers$', 184 typeaheads.LayersTypeAhead.as_view(), name='xhr_layerstypeahead'), 185 url(r'^xhr_typeahead/(?P<pid>\d+)/machines$', 186 typeaheads.MachinesTypeAhead.as_view(), name='xhr_machinestypeahead'), 187 url(r'^xhr_typeahead/(?P<pid>\d+)/recipes$', 188 typeaheads.RecipesTypeAhead.as_view(), name='xhr_recipestypeahead'), 189 url(r'^xhr_typeahead/projects$', 190 typeaheads.ProjectsTypeAhead.as_view(), name='xhr_projectstypeahead'), 191 url(r'^xhr_typeahead/gitrev$', 192 typeaheads.GitRevisionTypeAhead.as_view(), 193 name='xhr_gitrevtypeahead'), 194 195 url(r'^xhr_typeahead/(?P<pid>\d+)/distros$', 196 typeaheads.DistrosTypeAhead.as_view(), name='xhr_distrostypeahead'), 197 198 url(r'^xhr_testreleasechange/(?P<pid>\d+)$', views.xhr_testreleasechange, 199 name='xhr_testreleasechange'), 200 url(r'^xhr_configvaredit/(?P<pid>\d+)$', views.xhr_configvaredit, 201 name='xhr_configvaredit'), 202 203 url(r'^xhr_layer/(?P<pid>\d+)/(?P<layerversion_id>\d+)$', 204 api.XhrLayer.as_view(), 205 name='xhr_layer'), 206 207 url(r'^xhr_layer/(?P<pid>\d+)$', 208 api.XhrLayer.as_view(), 209 name='xhr_layer'), 210 211 # JS Unit tests 212 url(r'^js-unit-tests/$', views.jsunittests, name='js-unit-tests'), 213 214 # image customisation functionality 215 url(r'^xhr_customrecipe/(?P<recipe_id>\d+)' 216 '/packages/(?P<package_id>\d+|)$', 217 api.XhrCustomRecipePackages.as_view(), 218 name='xhr_customrecipe_packages'), 219 220 url(r'^xhr_customrecipe/(?P<recipe_id>\d+)/packages/$', 221 api.XhrCustomRecipePackages.as_view(), 222 name='xhr_customrecipe_packages'), 223 224 url(r'^xhr_customrecipe/(?P<recipe_id>\d+)$', 225 api.XhrCustomRecipeId.as_view(), 226 name='xhr_customrecipe_id'), 227 228 url(r'^xhr_customrecipe/', 229 api.XhrCustomRecipe.as_view(), 230 name='xhr_customrecipe'), 231 232 url(r'^xhr_buildrequest/project/(?P<pid>\d+)$', 233 api.XhrBuildRequest.as_view(), 234 name='xhr_buildrequest'), 235 236 url(r'xhr_project/(?P<project_id>\d+)$', 237 api.XhrProject.as_view(), 238 name='xhr_project'), 239 240 url(r'xhr_build/(?P<build_id>\d+)$', 241 api.XhrBuild.as_view(), 242 name='xhr_build'), 243 244 url(r'^mostrecentbuilds$', widgets.MostRecentBuildsView.as_view(), 245 name='most_recent_builds'), 246 247 # JSON data for aggregators 248 url(r'^api/builds$', views.json_builds, name='json_builds'), 249 url(r'^api/building$', views.json_building, name='json_building'), 250 url(r'^api/build/(?P<build_id>\d+)$', views.json_build, name='json_build'), 251 252 # default redirection 253 url(r'^$', RedirectView.as_view(url='landing', permanent=True)), 254] 255