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 url(r'^newproject_specific/(?P<pid>\d+)/$', views.newproject_specific, name='newproject_specific'), 120 url(r'^project_specific/(?P<pid>\d+)/$', views.project_specific, name='project_specific'), 121 url(r'^landing_specific/(?P<pid>\d+)/$', views.landing_specific, name='landing_specific'), 122 url(r'^landing_specific_cancel/(?P<pid>\d+)/$', views.landing_specific_cancel, name='landing_specific_cancel'), 123 124 # the import layer is a project-specific functionality; 125 url(r'^project/(?P<pid>\d+)/importlayer$', views.importlayer, name='importlayer'), 126 127 # the table pages that have been converted to ToasterTable widget 128 url(r'^project/(?P<pid>\d+)/machines/$', 129 tables.MachinesTable.as_view(template_name="generic-toastertable-page.html"), 130 name="projectmachines"), 131 132 url(r'^project/(?P<pid>\d+)/softwarerecipes/$', 133 tables.SoftwareRecipesTable.as_view(template_name="generic-toastertable-page.html"), 134 name="projectsoftwarerecipes"), 135 136 url(r'^project/(?P<pid>\d+)/images/$', 137 tables.ImageRecipesTable.as_view(template_name="generic-toastertable-page.html"), name="projectimagerecipes"), 138 139 url(r'^project/(?P<pid>\d+)/customimages/$', 140 tables.CustomImagesTable.as_view(template_name="generic-toastertable-page.html"), name="projectcustomimages"), 141 142 url(r'^project/(?P<pid>\d+)/newcustomimage/$', 143 tables.NewCustomImagesTable.as_view(template_name="newcustomimage.html"), 144 name="newcustomimage"), 145 146 url(r'^project/(?P<pid>\d+)/layers/$', 147 tables.LayersTable.as_view(template_name="generic-toastertable-page.html"), 148 name="projectlayers"), 149 150 url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)$', 151 views.layerdetails, name='layerdetails'), 152 153 url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)/recipes/$', 154 tables.LayerRecipesTable.as_view(template_name="generic-toastertable-page.html"), 155 { 'table_name': tables.LayerRecipesTable.__name__.lower(), 156 'title' : 'All recipes in layer' }, 157 name=tables.LayerRecipesTable.__name__.lower()), 158 159 url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)/machines/$', 160 tables.LayerMachinesTable.as_view(template_name="generic-toastertable-page.html"), 161 { 'table_name': tables.LayerMachinesTable.__name__.lower(), 162 'title' : 'All machines in layer' }, 163 name=tables.LayerMachinesTable.__name__.lower()), 164 165 166 url(r'^project/(?P<pid>\d+)/distros/$', 167 tables.DistrosTable.as_view(template_name="generic-toastertable-page.html"), 168 name="projectdistros"), 169 170 171 url(r'^project/(?P<pid>\d+)/customrecipe/(?P<custrecipeid>\d+)/selectpackages/$', 172 tables.SelectPackagesTable.as_view(), name="recipeselectpackages"), 173 174 175 url(r'^project/(?P<pid>\d+)/customrecipe/(?P<custrecipeid>\d+)$', 176 tables.SelectPackagesTable.as_view(template_name="customrecipe.html"), 177 name="customrecipe"), 178 179 url(r'^project/(?P<pid>\d+)/customrecipe/(?P<recipe_id>\d+)/download$', 180 views.customrecipe_download, 181 name="customrecipedownload"), 182 183 url(r'^project/(?P<pid>\d+)/recipe/(?P<recipe_id>\d+)$', 184 tables.PackagesTable.as_view(template_name="recipedetails.html"), 185 name="recipedetails"), 186 187 # typeahead api end points 188 url(r'^xhr_typeahead/(?P<pid>\d+)/layers$', 189 typeaheads.LayersTypeAhead.as_view(), name='xhr_layerstypeahead'), 190 url(r'^xhr_typeahead/(?P<pid>\d+)/machines$', 191 typeaheads.MachinesTypeAhead.as_view(), name='xhr_machinestypeahead'), 192 url(r'^xhr_typeahead/(?P<pid>\d+)/recipes$', 193 typeaheads.RecipesTypeAhead.as_view(), name='xhr_recipestypeahead'), 194 url(r'^xhr_typeahead/projects$', 195 typeaheads.ProjectsTypeAhead.as_view(), name='xhr_projectstypeahead'), 196 url(r'^xhr_typeahead/gitrev$', 197 typeaheads.GitRevisionTypeAhead.as_view(), 198 name='xhr_gitrevtypeahead'), 199 200 url(r'^xhr_typeahead/(?P<pid>\d+)/distros$', 201 typeaheads.DistrosTypeAhead.as_view(), name='xhr_distrostypeahead'), 202 203 url(r'^xhr_testreleasechange/(?P<pid>\d+)$', views.xhr_testreleasechange, 204 name='xhr_testreleasechange'), 205 url(r'^xhr_configvaredit/(?P<pid>\d+)$', views.xhr_configvaredit, 206 name='xhr_configvaredit'), 207 208 url(r'^xhr_layer/(?P<pid>\d+)/(?P<layerversion_id>\d+)$', 209 api.XhrLayer.as_view(), 210 name='xhr_layer'), 211 212 url(r'^xhr_layer/(?P<pid>\d+)$', 213 api.XhrLayer.as_view(), 214 name='xhr_layer'), 215 216 # JS Unit tests 217 url(r'^js-unit-tests/$', views.jsunittests, name='js-unit-tests'), 218 219 # image customisation functionality 220 url(r'^xhr_customrecipe/(?P<recipe_id>\d+)' 221 '/packages/(?P<package_id>\d+|)$', 222 api.XhrCustomRecipePackages.as_view(), 223 name='xhr_customrecipe_packages'), 224 225 url(r'^xhr_customrecipe/(?P<recipe_id>\d+)/packages/$', 226 api.XhrCustomRecipePackages.as_view(), 227 name='xhr_customrecipe_packages'), 228 229 url(r'^xhr_customrecipe/(?P<recipe_id>\d+)$', 230 api.XhrCustomRecipeId.as_view(), 231 name='xhr_customrecipe_id'), 232 233 url(r'^xhr_customrecipe/', 234 api.XhrCustomRecipe.as_view(), 235 name='xhr_customrecipe'), 236 237 url(r'^xhr_buildrequest/project/(?P<pid>\d+)$', 238 api.XhrBuildRequest.as_view(), 239 name='xhr_buildrequest'), 240 241 url(r'^xhr_projectupdate/project/(?P<pid>\d+)$', 242 api.XhrProjectUpdate.as_view(), 243 name='xhr_projectupdate'), 244 245 url(r'^xhr_setdefaultimage/project/(?P<pid>\d+)$', 246 api.XhrSetDefaultImageUrl.as_view(), 247 name='xhr_setdefaultimage'), 248 249 url(r'xhr_project/(?P<project_id>\d+)$', 250 api.XhrProject.as_view(), 251 name='xhr_project'), 252 253 url(r'xhr_build/(?P<build_id>\d+)$', 254 api.XhrBuild.as_view(), 255 name='xhr_build'), 256 257 url(r'^mostrecentbuilds$', widgets.MostRecentBuildsView.as_view(), 258 name='most_recent_builds'), 259 260 # JSON data for aggregators 261 url(r'^api/builds$', views.json_builds, name='json_builds'), 262 url(r'^api/building$', views.json_building, name='json_building'), 263 url(r'^api/build/(?P<build_id>\d+)$', views.json_build, name='json_build'), 264 265 # default redirection 266 url(r'^$', RedirectView.as_view(url='landing', permanent=True)), 267] 268