Navigation improvements

* Drop the front page - this just gets in the way. Redirect to the
  layers list instead. This has meant adding a touch more text to the
  about page and adding the FAQ link to the footer.
* Use a separate navbar to hold the branch selector and the main
  top-level  pages (Layers, Recipes, Machines) instead of tabs
* All pages depending on a branch selection are now under
  branch/<branchname>/ so we don't need to have the branch selection on
  every page.
* Use breadcrumbs on recipe detail and layer detail pages instead of
  tabs
* Add title to recipe detail page

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
This commit is contained in:
Paul Eggleton 2013-07-18 09:28:25 +01:00
parent 97361ae37e
commit 1643aef67d
19 changed files with 258 additions and 237 deletions

2
TODO
View File

@ -4,9 +4,7 @@ TODO:
* Document macros for URL fields
Later:
* Breadcrumbs / fix tab navigation?
* Ability for reviewers to comment before publishing a layer?
* Add link to the all layers and all recipes tables from the layer details page?
* Prevent SMTP failures from breaking submission process
* All-branch search/results so you can see version availability of recipes in all branches at once?
* Rawrecipes branch support

View File

@ -7,12 +7,8 @@
from layerindex.models import Branch, LayerItem
def layerindex_context(request):
current_branch = request.session.get('branch', None)
if not current_branch:
current_branch = 'master'
return {
'all_branches': Branch.objects.exclude(name='oe-classic').order_by('sort_priority'),
'current_branch': current_branch,
'unpublished_count': LayerItem.objects.filter(status='N').count(),
'oe_classic': Branch.objects.filter(name='oe-classic')
}

View File

@ -96,7 +96,7 @@ class LayerItem(models.Model):
return fetch_dir
def get_absolute_url(self):
return reverse('layer_item', args=(self.name,));
return reverse('layer_item', args=('master',self.name));
def __unicode__(self):
return self.name

View File

@ -6,33 +6,30 @@
from django.conf.urls.defaults import *
from django.views.generic import TemplateView, DetailView, ListView
from django.views.generic.simple import redirect_to
from django.views.defaults import page_not_found
from layerindex.views import LayerListView, LayerReviewListView, LayerReviewDetailView, RecipeSearchView, MachineSearchView, PlainTextListView, LayerDetailView, edit_layer_view, delete_layer_view, edit_layernote_view, delete_layernote_view, switch_branch_view, HistoryListView, EditProfileFormView, DuplicatesView, AdvancedRecipeSearchView, BulkChangeView, BulkChangeSearchView, bulk_change_edit_view, bulk_change_patch_view, BulkChangeDeleteView, RecipeDetailView, ClassicRecipeSearchView, ClassicRecipeDetailView, ClassicRecipeStatsView
from django.core.urlresolvers import reverse_lazy
from layerindex.views import LayerListView, LayerReviewListView, LayerReviewDetailView, RecipeSearchView, MachineSearchView, PlainTextListView, LayerDetailView, edit_layer_view, delete_layer_view, edit_layernote_view, delete_layernote_view, HistoryListView, EditProfileFormView, AdvancedRecipeSearchView, BulkChangeView, BulkChangeSearchView, bulk_change_edit_view, bulk_change_patch_view, BulkChangeDeleteView, RecipeDetailView, RedirectParamsView, ClassicRecipeSearchView, ClassicRecipeDetailView, ClassicRecipeStatsView
from layerindex.models import LayerItem, Recipe, RecipeChangeset
urlpatterns = patterns('',
url(r'^$',
TemplateView.as_view(
template_name='layerindex/frontpage.html'),
name='frontpage'),
url(r'^$', redirect_to, {'url' : reverse_lazy('layer_list', args=('master',))},
name='frontpage'),
url(r'^layers/$',
LayerListView.as_view(
template_name='layerindex/layers.html'),
name='layer_list'),
redirect_to, {'url' : reverse_lazy('layer_list', args=('master',))}),
url(r'^layer/(?P<slug>[-\w]+)/$',
RedirectParamsView.as_view(), {'redirect_name': 'layer_item', 'branch':'master'}),
url(r'^recipes/$',
redirect_to, {'url' : reverse_lazy('recipe_search', args=('master',))}),
url(r'^machines/$',
redirect_to, {'url' : reverse_lazy('machine_search', args=('master',))}),
url(r'^submit/$', edit_layer_view, {'template_name': 'layerindex/submitlayer.html'}, name="submit_layer"),
url(r'^edit/(?P<slug>[-\w]+)/$', edit_layer_view, {'template_name': 'layerindex/editlayer.html'}, name="edit_layer"),
url(r'^submit/thanks$',
TemplateView.as_view(
template_name='layerindex/submitthanks.html'),
name="submit_layer_thanks"),
url(r'^recipes/$',
RecipeSearchView.as_view(
template_name='layerindex/recipes.html'),
name='recipe_search'),
url(r'^machines/$',
MachineSearchView.as_view(
template_name='layerindex/machines.html'),
name='machine_search'),
url(r'^review/$',
LayerReviewListView.as_view(
template_name='layerindex/reviewlist.html'),
@ -41,10 +38,6 @@ urlpatterns = patterns('',
LayerReviewDetailView.as_view(
template_name='layerindex/reviewdetail.html'),
name='layer_review'),
url(r'^layer/(?P<slug>[-\w]+)/$',
LayerDetailView.as_view(
template_name='layerindex/detail.html'),
name='layer_item'),
url(r'^layer/(?P<slug>[-\w]+)/addnote/$',
edit_layernote_view, {'template_name': 'layerindex/editlayernote.html'}, name="add_layernote"),
url(r'^layer/(?P<slug>[-\w]+)/editnote/(?P<pk>[-\w]+)/$',
@ -80,8 +73,8 @@ urlpatterns = patterns('',
BulkChangeDeleteView.as_view(
template_name='layerindex/deleteconfirm.html'),
name="bulk_change_delete"),
url(r'^branch/(?P<slug>[-\w]+)/$',
switch_branch_view, name="switch_branch"),
url(r'^branch/(?P<branch>[-\w]+)/',
include('layerindex.urls_branch')),
url(r'^raw/recipes.txt$',
PlainTextListView.as_view(
queryset=Recipe.objects.order_by('pn', 'layerbranch__layer'),
@ -92,10 +85,6 @@ urlpatterns = patterns('',
HistoryListView.as_view(
template_name='layerindex/history.html'),
name='history_list'),
url(r'^duplicates/$',
DuplicatesView.as_view(
template_name='layerindex/duplicates.html'),
name='duplicates'),
url(r'^profile/$',
EditProfileFormView.as_view(
template_name='layerindex/profile.html'),

37
layerindex/urls_branch.py Normal file
View File

@ -0,0 +1,37 @@
# layerindex-web - Branch-based URL definitions
#
# Copyright (C) 2013 Intel Corporation
#
# Licensed under the MIT license, see COPYING.MIT for details
from django.conf.urls.defaults import *
from django.views.generic.simple import redirect_to
from django.views.defaults import page_not_found
from django.core.urlresolvers import reverse_lazy
from layerindex.views import LayerListView, RecipeSearchView, MachineSearchView, PlainTextListView, LayerDetailView, edit_layer_view, delete_layer_view, edit_layernote_view, delete_layernote_view, RedirectParamsView, DuplicatesView
urlpatterns = patterns('',
url(r'^$',
RedirectParamsView.as_view(), {'redirect_name': 'layer_list'}),
url(r'^layers/$',
LayerListView.as_view(
template_name='layerindex/layers.html'),
name='layer_list'),
url(r'^layer/(?P<slug>[-\w]+)/$',
LayerDetailView.as_view(
template_name='layerindex/detail.html'),
name='layer_item'),
url(r'^recipes/$',
RecipeSearchView.as_view(
template_name='layerindex/recipes.html'),
name='recipe_search'),
url(r'^machines/$',
MachineSearchView.as_view(
template_name='layerindex/machines.html'),
name='machine_search'),
url(r'^edit/(?P<slug>[-\w]+)/$', edit_layer_view, {'template_name': 'layerindex/editlayer.html'}, name="edit_layer"),
url(r'^duplicates/$',
DuplicatesView.as_view(
template_name='layerindex/duplicates.html'),
name='duplicates'),
)

View File

@ -6,13 +6,14 @@
from django.shortcuts import get_object_or_404, render
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, Http404
from django.core.urlresolvers import reverse, reverse_lazy
from django.core.urlresolvers import reverse, reverse_lazy, resolve
from django.core.exceptions import PermissionDenied
from django.template import RequestContext
from layerindex.models import Branch, LayerItem, LayerMaintainer, LayerBranch, LayerDependency, LayerNote, Recipe, Machine, BBClass, BBAppend, RecipeChange, RecipeChangeset, ClassicRecipe
from datetime import datetime
from django.views.generic import TemplateView, DetailView, ListView
from django.views.generic.edit import CreateView, DeleteView, UpdateView
from django.views.generic.base import RedirectView
from layerindex.forms import EditLayerForm, LayerMaintainerFormSet, EditNoteForm, EditProfileForm, RecipeChangesetForm, AdvancedRecipeSearchForm, BulkChangeEditFormSet, ClassicRecipeForm, ClassicRecipeSearchForm
from django.db import transaction
from django.contrib.auth.models import User, Permission
@ -81,7 +82,7 @@ def delete_layer_view(request, template_name, slug):
raise PermissionDenied
if request.method == 'POST':
layeritem.delete()
return HttpResponseRedirect(reverse('layer_list'))
return HttpResponseRedirect(reverse('layer_list', args=('master',)))
else:
return render(request, template_name, {
'object': layeritem,
@ -89,26 +90,25 @@ def delete_layer_view(request, template_name, slug):
'cancel_url': layeritem.get_absolute_url()
})
def edit_layer_view(request, template_name, slug=None):
def edit_layer_view(request, template_name, branch='master', slug=None):
return_url = None
branchobj = Branch.objects.filter(name=branch)[:1].get()
if slug:
# Edit mode
branch = Branch.objects.filter(name=request.session.get('branch', 'master'))[:1].get()
layeritem = get_object_or_404(LayerItem, name=slug)
if layeritem.classic:
raise Http404
if not (request.user.is_authenticated() and (request.user.has_perm('layerindex.publish_layer') or layeritem.user_can_edit(request.user))):
raise PermissionDenied
layerbranch = get_object_or_404(LayerBranch, layer=layeritem, branch=branch)
layerbranch = get_object_or_404(LayerBranch, layer=layeritem, branch=branchobj)
deplistlayers = LayerItem.objects.exclude(id=layeritem.id).order_by('name')
returnto = request.GET.get('returnto', 'layer_item')
if returnto:
return_url = reverse_lazy(returnto, args=(layeritem.name,))
return_url = reverse_lazy(returnto, args=(branch, layeritem.name))
else:
# Submit mode
branch = Branch.objects.filter(name='master')[:1].get()
layeritem = LayerItem()
layerbranch = LayerBranch(layer=layeritem, branch=branch)
layerbranch = LayerBranch(layer=layeritem, branch=branchobj)
deplistlayers = LayerItem.objects.filter(classic=False).order_by('name')
if request.method == 'POST':
@ -167,7 +167,7 @@ def edit_layer_view(request, template_name, slug=None):
d = Context({
'user_name': user_name,
'layer_name': layeritem.name,
'layer_url': request.build_absolute_uri(reverse('layer_review', args=(layeritem.name,))) + '?branch=master',
'layer_url': request.build_absolute_uri(reverse('layer_review', args=(layeritem.name,))),
})
subject = '%s - %s' % (settings.SUBMIT_EMAIL_SUBJECT, layeritem.name)
from_email = settings.SUBMIT_EMAIL_FROM
@ -236,19 +236,12 @@ def bulk_change_patch_view(request, pk):
# FIXME better error handling
def _check_branch(request):
branchname = request.GET.get('branch', '')
def _check_url_branch(kwargs):
branchname = kwargs['branch']
if branchname:
if branchname == 'oe-classic':
raise Http404
branch = get_object_or_404(Branch, name=branchname)
request.session['branch'] = branch.name
def switch_branch_view(request, slug):
branch = get_object_or_404(Branch, name=slug)
request.session['branch'] = branch.name
return_url = request.META.get('HTTP_REFERER')
if not return_url:
return_url = reverse('layer_list')
return HttpResponseRedirect(return_url)
def publish(request, name):
if not (request.user.is_authenticated() and request.user.has_perm('layerindex.publish_layer')):
@ -264,27 +257,38 @@ def _statuschange(request, name, newstatus):
w.save()
return HttpResponseRedirect(w.get_absolute_url())
class RedirectParamsView(RedirectView):
def get_redirect_url(self, *args, **kwargs):
redirect_name = kwargs.pop('redirect_name')
return reverse_lazy(redirect_name, args=args, kwargs=kwargs)
class LayerListView(ListView):
context_object_name = 'layerbranch_list'
def get_queryset(self):
return LayerBranch.objects.filter(branch__name=self.request.session.get('branch', 'master')).filter(layer__status='P').order_by('layer__layer_type', 'layer__name')
_check_url_branch(self.kwargs)
return LayerBranch.objects.filter(branch__name=self.kwargs['branch']).filter(layer__status='P').order_by('layer__layer_type', 'layer__name')
def get_context_data(self, **kwargs):
context = super(LayerListView, self).get_context_data(**kwargs)
context['url_branch'] = self.kwargs['branch']
context['this_url_name'] = resolve(self.request.path_info).url_name
context['layer_type_choices'] = LayerItem.LAYER_TYPE_CHOICES
return context
class LayerReviewListView(ListView):
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
if not request.user.has_perm('layerindex.publish_layer'):
raise PermissionDenied
_check_branch(request)
return super(LayerReviewListView, self).dispatch(request, *args, **kwargs)
def get_queryset(self):
return LayerBranch.objects.filter(branch__name=self.request.session.get('branch', 'master')).filter(layer__status='N').order_by('layer__name')
return LayerBranch.objects.filter(branch__name='master').filter(layer__status='N').order_by('layer__name')
class LayerDetailView(DetailView):
model = LayerItem
@ -292,7 +296,6 @@ class LayerDetailView(DetailView):
# This is a bit of a mess. Surely there has to be a better way to handle this...
def dispatch(self, request, *args, **kwargs):
_check_branch(request)
self.user = request.user
res = super(LayerDetailView, self).dispatch(request, *args, **kwargs)
l = self.get_object()
@ -305,15 +308,18 @@ class LayerDetailView(DetailView):
return res
def get_context_data(self, **kwargs):
_check_url_branch(self.kwargs)
context = super(LayerDetailView, self).get_context_data(**kwargs)
layer = context['layeritem']
context['useredit'] = layer.user_can_edit(self.user)
layerbranch = layer.get_layerbranch(self.request.session.get('branch', 'master'))
layerbranch = layer.get_layerbranch(self.kwargs['branch'])
if layerbranch:
context['layerbranch'] = layerbranch
context['machines'] = layerbranch.machine_set.order_by('name')
context['appends'] = layerbranch.bbappend_set.order_by('filename')
context['classes'] = layerbranch.bbclass_set.order_by('name')
context['url_branch'] = self.kwargs['branch']
context['this_url_name'] = resolve(self.request.path_info).url_name
return context
class LayerReviewDetailView(LayerDetailView):
@ -323,6 +329,12 @@ class LayerReviewDetailView(LayerDetailView):
raise PermissionDenied
return super(LayerReviewDetailView, self).dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
self.kwargs['branch'] = 'master'
context = super(LayerReviewDetailView, self).get_context_data(**kwargs)
return context
def recipes_preferred_count(qs):
# Add extra column so we can show "duplicate" recipes from other layers de-emphasised
# (it's a bit crude having to do this using SQL but I couldn't find a better way...)
@ -350,9 +362,9 @@ class RecipeSearchView(ListView):
paginate_by = 50
def get_queryset(self):
_check_branch(self.request)
_check_url_branch(self.kwargs)
query_string = self.request.GET.get('q', '')
init_qs = Recipe.objects.filter(layerbranch__branch__name=self.request.session.get('branch', 'master'))
init_qs = Recipe.objects.filter(layerbranch__branch__name=self.kwargs['branch'])
if query_string.strip():
entry_query = simplesearch.get_query(query_string, ['pn', 'summary', 'description', 'filename'])
qs = init_qs.filter(entry_query).order_by('pn', 'layerbranch__layer')
@ -370,17 +382,19 @@ class RecipeSearchView(ListView):
def get_context_data(self, **kwargs):
context = super(RecipeSearchView, self).get_context_data(**kwargs)
context['search_keyword'] = self.request.GET.get('q', '')
context['url_branch'] = self.kwargs['branch']
context['this_url_name'] = resolve(self.request.path_info).url_name
return context
class DuplicatesView(TemplateView):
def get_recipes(self):
init_qs = Recipe.objects.filter(layerbranch__branch__name=self.request.session.get('branch', 'master'))
init_qs = Recipe.objects.filter(layerbranch__branch__name=self.kwargs['branch'])
dupes = init_qs.values('pn').annotate(Count('layerbranch', distinct=True)).filter(layerbranch__count__gt=1)
qs = init_qs.all().filter(pn__in=[item['pn'] for item in dupes]).order_by('pn', 'layerbranch__layer')
return recipes_preferred_count(qs)
def get_classes(self):
init_qs = BBClass.objects.filter(layerbranch__branch__name=self.request.session.get('branch', 'master'))
init_qs = BBClass.objects.filter(layerbranch__branch__name=self.kwargs['branch'])
dupes = init_qs.values('name').annotate(Count('layerbranch', distinct=True)).filter(layerbranch__count__gt=1)
qs = init_qs.all().filter(name__in=[item['name'] for item in dupes]).order_by('name', 'layerbranch__layer')
return qs
@ -389,6 +403,8 @@ class DuplicatesView(TemplateView):
context = super(DuplicatesView, self).get_context_data(**kwargs)
context['recipes'] = self.get_recipes()
context['classes'] = self.get_classes()
context['url_branch'] = self.kwargs['branch']
context['this_url_name'] = resolve(self.request.path_info).url_name
return context
class AdvancedRecipeSearchView(ListView):
@ -411,7 +427,7 @@ class AdvancedRecipeSearchView(ListView):
query = Q(**{"%s__icontains" % field: value})
else:
query = Q(**{"%s" % field: value})
queryset = Recipe.objects.filter(layerbranch__branch__name=self.request.session.get('branch', 'master'))
queryset = Recipe.objects.filter(layerbranch__branch__name='master')
layer = self.request.GET.get('layer', '')
if layer:
queryset = queryset.filter(layerbranch__layer=layer)
@ -497,6 +513,7 @@ class BulkChangeSearchView(AdvancedRecipeSearchView):
def get_context_data(self, **kwargs):
context = super(BulkChangeSearchView, self).get_context_data(**kwargs)
context['changeset'] = self.changeset
context['current_branch'] = 'master'
return context
@ -527,8 +544,9 @@ class MachineSearchView(ListView):
paginate_by = 50
def get_queryset(self):
_check_url_branch(self.kwargs)
query_string = self.request.GET.get('q', '')
init_qs = Machine.objects.filter(layerbranch__branch__name=self.request.session.get('branch', 'master'))
init_qs = Machine.objects.filter(layerbranch__branch__name=self.kwargs['branch'])
if query_string.strip():
entry_query = simplesearch.get_query(query_string, ['name', 'description'])
return init_qs.filter(entry_query).order_by('name', 'layerbranch__layer')
@ -542,6 +560,8 @@ class MachineSearchView(ListView):
def get_context_data(self, **kwargs):
context = super(MachineSearchView, self).get_context_data(**kwargs)
context['search_keyword'] = self.request.GET.get('q', '')
context['url_branch'] = self.kwargs['branch']
context['this_url_name'] = resolve(self.request.path_info).url_name
return context
@ -623,7 +643,7 @@ class RecipeDetailView(DetailView):
recipe = self.get_object()
if recipe:
appendprefix = "%s_" % recipe.pn
context['appends'] = BBAppend.objects.filter(layerbranch__branch__name=self.request.session.get('branch', 'master')).filter(filename__startswith=appendprefix)
context['appends'] = BBAppend.objects.filter(layerbranch__branch=recipe.layerbranch.branch).filter(filename__startswith=appendprefix)
return context

View File

@ -30,31 +30,6 @@
<div class="container-fluid">
<a class="brand" href="{% url frontpage %}">OpenEmbedded metadata index</a>
<ul class="nav">
{% block branch_selector %}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Branch: <b>{{ current_branch }}</b>
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
{% for branch in all_branches %}
<li><a href="{% url switch_branch branch.name %}">
{% if branch.name = current_branch %}<b>{% endif %}
{{ branch.name }}
{% if branch.short_description %}
({{ branch.short_description }})
{% endif %}
{% if branch.name = current_branch %}</b>{% endif %}
</a></li>
{% endfor %}
{% if oe_classic %}
<li><a href="{% url classic %}">OE-Classic</a></li>
{% endif %}
</ul>
</li>
{% endblock %}
</ul>
{% if user.is_authenticated %}
<div class="btn-group pull-right">
{% if perms.layerindex.publish_layer %}
@ -90,7 +65,7 @@
</a>
<ul class="dropdown-menu">
<li><a href="{% url bulk_change %}">Bulk Change</a></li>
<li><a href="{% url duplicates %}">Duplicates</a></li>
<li><a href="{% url duplicates 'master' %}">Duplicates</a></li>
</ul>
</li>
<li class="divider-vertical"></li>
@ -117,6 +92,7 @@
<div class="footer">
<a href="{% url history_list %}">change history</a>
&bull; <a href="{% url about %}">about this site</a>
&bull; <a href="http://www.openembedded.org/Layers_FAQ">FAQ</a>
</div>
{% endblock %}

View File

@ -0,0 +1,59 @@
{% extends "base.html" %}
{% load i18n %}
{% load url from future %}
{% comment %}
layerindex-web - top level page template
Copyright (C) 2013 Intel Corporation
Licensed under the MIT license, see COPYING.MIT for details
{% endcomment %}
{% block content %}
<div class="container-fluid">
<div class="row-fluid">
<div class="navbar">
<div class="navbar-inner">
<ul class="nav">
{% block branch_selector %}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Branch: <b>{{ url_branch }}</b>
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
{% for branch in all_branches %}
<li><a href="{% url this_url_name branch.name %}">
{% if branch.name = url_branch %}<b>{% endif %}
{{ branch.name }}
{% if branch.short_description %}
({{ branch.short_description }})
{% endif %}
{% if branch.name = url_branch %}</b>{% endif %}
</a></li>
{% endfor %}
{% if oe_classic %}
<li class="divider"></li>
<li><a href="{% url 'classic' %}">OE-Classic</a></li>
{% endif %}
</ul>
</li>
{% endblock %}
</ul>
<ul class="nav">
{% block navs %}{% endblock %}
</ul>
</div>
</div>
{% block content_inner %}{% endblock %}
</div>
</div>
{% endblock %}

View File

@ -9,7 +9,7 @@
{% autoescape on %}
<h2>About</h2>
<p>This website indexes layers for the <a href="http://www.openembedded.org">OpenEmbedded</a> build system, suitable for use on top of OpenEmbedded-Core and distributions based upon it, providing additional recipes, machine support and/or distro policy configuration.</p>
<p>This website indexes layers for the <a href="http://www.openembedded.org">OpenEmbedded</a> build system provided by members of the OpenEmbedded / Yocto Project community, suitable for use on top of OpenEmbedded-Core and compatible systems, providing additional recipes, machine support and/or distro policy configuration.</p>
<p>If you have a layer for use with OpenEmbedded that you wish to share with others, please <a href="{% url submit_layer %}">submit it</a>!</p>

View File

@ -81,7 +81,7 @@
<td><a href="{% url recipe recipe.id %}">{{ recipe.name }}</a></td>
<td>{{ recipe.pv }}</td>
<td>{{ recipe.short_desc }}</td>
<td><a href="{% url layer_item recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a></td>
<td><a href="{% url layer_item current_branch recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a></td>
</tr>
{% endfor %}
</tbody>

View File

@ -21,7 +21,10 @@
{% block content %}
{% autoescape on %}
<ul class="breadcrumb">
<li><a href="{% url layer_list url_branch %}">Layers</a> <span class="divider">&rarr;</span></li>
<li class="active">{{ layeritem.name }}</li>
</ul>
<div class="container-fluid">
<div class="row-fluid">
@ -33,7 +36,7 @@
{% if user.is_authenticated %}
<span class="pull-right">
{% if perms.layerindex.publish_layer or useredit %}
<a href="{% url edit_layer layeritem.name %}" class="btn">Edit layer</a>
<a href="{% url edit_layer url_branch layeritem.name %}" class="btn">Edit layer</a>
{% if layeritem.layernote_set.count = 0 %}
<a href="{% url add_layernote layeritem.name %}" class="btn">Add note</a>
{% endif %}
@ -49,7 +52,7 @@
{% if not layerbranch %}
<div class="row-fluid">
<div class="alert alert-error">
This layer does not exist for branch {{ current_branch }}.
This layer does not exist for branch {{ url_branch }}.
</div>
</div>
{% endif %}
@ -141,7 +144,7 @@
<p>The {{ layeritem.name }} layer depends upon:</p>
<ul>
{% for dep in layerbranch.dependencies_set.all %}
<li><a href="{% url layer_item dep.dependency.name %}">{{ dep.dependency.name }}</a></li>
<li><a href="{% url layer_item url_branch dep.dependency.name %}">{{ dep.dependency.name }}</a></li>
{% endfor %}
</ul>
</div> <!-- end of well -->

View File

@ -1,5 +1,6 @@
{% extends "base.html" %}
{% extends "base_toplevel.html" %}
{% load i18n %}
{% load url from future %}
{% comment %}
@ -19,7 +20,27 @@
{% autoescape on %}
<div class="row-fluid">
<div class="span9 offset1">
<div class="span12">
<div class="btn-group pull-right">
<a href="#" class="btn dropdown-toggle" data-toggle="dropdown">
Branch: <b>{{ url_branch }}</b>
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
{% for branch in all_branches %}
<li><a href="{% url this_url_name branch.name %}">
{% if branch.name = url_branch %}<b>{% endif %}
{{ branch.name }}
{% if branch.short_description %}
({{ branch.short_description }})
{% endif %}
{% if branch.name = url_branch %}</b>{% endif %}
</a></li>
{% endfor %}
</ul>
</div>
<h2>Duplicate recipes</h2>
{% if recipes %}
<p>Recipes with the same name in different layers:</p>
@ -36,10 +57,10 @@
<tbody>
{% for recipe in recipes %}
<tr {% if recipe.preferred_count > 0 %}class="muted"{% endif %}>
<td><a href="{% url recipe recipe.id %}">{{ recipe.name }}</a></td>
<td><a href="{% url 'recipe' recipe.id %}">{{ recipe.name }}</a></td>
<td>{{ recipe.pv }}</td>
<td>{{ recipe.short_desc }}</td>
<td><a href="{% url layer_item recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a></td>
<td><a href="{% url 'layer_item' url_branch recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a></td>
</tr>
{% endfor %}
</tbody>
@ -52,7 +73,7 @@
<div class="row-fluid">
<div class="span9 offset1">
<div class="span12">
<h2>Duplicate classes</h2>
{% if classes %}
<p>Classes with the same name in different layers:</p>
@ -67,8 +88,8 @@
<tbody>
{% for class in classes %}
<tr>
<td><a href="{% url class.vcs_web_url %}">{{ class.name }}</a></td>
<td><a href="{% url layer_item class.layerbranch.layer.name %}">{{ class.layerbranch.layer.name }}</a></td>
<td><a href="{{ class.vcs_web_url }}">{{ class.name }}</a></td>
<td><a href="{% url 'layer_item' 'master' class.layerbranch.layer.name %}">{{ class.layerbranch.layer.name }}</a></td>
</tr>
{% endfor %}
</tbody>

View File

@ -25,7 +25,7 @@
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save" class='btn' />
<a href="{% url layer_item form.instance.layer.name %}" class='btn'>Cancel</a>
<a href="{% url layer_item 'master' form.instance.layer.name %}" class='btn'>Cancel</a>
</form>
{% endautoescape %}

View File

@ -1,59 +0,0 @@
{% extends "base.html" %}
{% load i18n %}
{% load static %}
{% comment %}
layerindex-web - front page template
Copyright (C) 2013 Intel Corporation
Licensed under the MIT license, see COPYING.MIT for details
{% endcomment %}
<!--
{% block title_append %}{% endblock %}
-->
{% block content %}
{% autoescape on %}
<div class="hero-unit hero-evenlyspaced">
<h1>Welcome!</h1>
<p>Welcome to the OpenEmbedded metadata index. Here you can find metadata (layers, recipes and machines)
provided by members of the OpenEmbedded / Yocto Project community for use on top of OpenEmbedded-Core
and compatible systems.</p>
</div>
<div class="row">
<div class="span8">
<div class="well well-frontpage">
<h2>Finding what you need</h2>
<p>You can browse or search by layer, by recipe or by machine.</p>
<div class="frontpage-button-group">
<a href="{% url layer_list %}" class="btn btn-large btn-primary">Layers</a>
<a href="{% url recipe_search %}" class="btn btn-large btn-primary">Recipes</a>
<a href="{% url machine_search %}" class="btn btn-large btn-primary">Machines</a>
</div>
<p><small>Note that you are currently viewing
{% if current_branch = 'master' %}
the <span class="branch">master</span> branch - the latest development version of the code.
{% else %}
the <span class="branch">{{ current_branch }}</span> branch.
{% endif %}
You can change between master and release branches at any time using the branch selector on the bar at the top of the page.</small></p>
</div>
</div>
<div class="span4">
<div class="well well-frontpage">
<h2>Questions?</h2>
<p>Got some questions about layers or this website? See the <a href="http://www.openembedded.org/Layers_FAQ">FAQ</a>.</p>
</div>
</div>
</div>
{% endautoescape %}
{% endblock %}

View File

@ -1,4 +1,4 @@
{% extends "base.html" %}
{% extends "base_toplevel.html" %}
{% load i18n %}
{% load static %}
@ -16,23 +16,24 @@
{% block title_append %} - layers{% endblock %}
-->
{% block content %}
{% block navs %}
{% autoescape on %}
<li class="active"><a href="{% url layer_list url_branch %}">Layers</a></li>
<li><a href="{% url recipe_search url_branch %}">Recipes</a></li>
<li><a href="{% url machine_search url_branch %}">Machines</a></li>
{% endautoescape %}
{% endblock %}
{% block content_inner %}
{% autoescape on %}
{% if layerbranch_list %}
<div class="row-fluid">
<div class="span9 offset1">
<ul class="nav nav-tabs">
<li class="active"><a href="{% url layer_list %}">Layers</a></li>
<li><a href="{% url recipe_search %}">Recipes</a></li>
<li><a href="{% url machine_search %}">Machines</a></li>
</ul>
<div class="row-fluid">
<div class="span5">
<form id="filter-form">
<input type="text" class="input-xxlarge" id="filter" placeholder="Search layers">
<input type="text" class="input-xxlarge search-query" id="filter" placeholder="Search layers">
</form>
</div>
@ -70,7 +71,7 @@
<tbody>
{% for layerbranch in layerbranch_list %}
<tr class="layertype_{{ layerbranch.layer.layer_type }}">
<td><a href="{% url layer_item layerbranch.layer.name %}">{{ layerbranch.layer.name }}</a></td>
<td><a href="{% url layer_item url_branch layerbranch.layer.name %}">{{ layerbranch.layer.name }}</a></td>
<td>{{ layerbranch.layer.summary }}</td>
<td>{{ layerbranch.layer.get_layer_type_display }}</td>
<td class="showRollie">
@ -95,8 +96,6 @@
</tbody>
</table>
</div>
</div>
{% if is_paginated %}
{% load pagination %}

View File

@ -1,4 +1,4 @@
{% extends "base.html" %}
{% extends "base_toplevel.html" %}
{% load i18n %}
{% comment %}
@ -15,22 +15,22 @@
{% block title_append %} - machines{% endblock %}
-->
{% block content %}
{% block navs %}
{% autoescape on %}
<li><a href="{% url layer_list url_branch %}">Layers</a></li>
<li><a href="{% url recipe_search url_branch %}">Recipes</a></li>
<li class="active"><a href="{% url machine_search url_branch %}">Machines</a></li>
{% endautoescape %}
{% endblock %}
{% block content_inner %}
{% autoescape on %}
<div class="row-fluid">
<div class="span9 offset1">
<ul class="nav nav-tabs">
<li><a href="{% url layer_list %}">Layers</a></li>
<li><a href="{% url recipe_search %}">Recipes</a></li>
<li class="active"><a href="{% url machine_search %}">Machines</a></li>
</ul>
<div class="row-fluid">
<div class="input-append">
<form id="filter-form" action="{% url machine_search %}" method="get">
<form id="filter-form" action="{% url machine_search url_branch %}" method="get">
<input type="text" class="input-xxlarge" id="appendedInputButtons" placeholder="Search machines" name="q" value="{{ search_keyword }}" />
<button class="btn" type="submit">search</button>
</form>
@ -52,7 +52,7 @@
<tr>
<td><a href="{{ machine.vcs_web_url }}">{{ machine.name }}</a></td>
<td>{{ machine.description }}</td>
<td><a href="{% url layer_item machine.layerbranch.layer.name %}">{{ machine.layerbranch.layer.name }}</a></td>
<td><a href="{% url layer_item url_branch machine.layerbranch.layer.name %}">{{ machine.layerbranch.layer.name }}</a></td>
</tr>
{% endfor %}
</tbody>
@ -68,9 +68,6 @@
{% endif %}
{% endif %}
</div>
</div>
{% endautoescape %}

View File

@ -20,23 +20,18 @@
{% block content %}
{% autoescape on %}
<ul class="breadcrumb">
<li><a href="{% url layer_list recipe.layerbranch.branch.name %}">Layers</a> <span class="divider">&rarr;</span></li>
<li><a href="{% url layer_item recipe.layerbranch.branch.name recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a> <span class="divider">&rarr;</span></li>
<li class="active">{{ recipe.name }}</li>
</ul>
<div class="container-fluid">
<div class="row-fluid">
<div class="span9 offset1">
<ul class="nav nav-tabs">
<li>
<a href="{% url layer_list %}">Layer index</a>
</li>
<li><a href="{% url recipe_search %}">Recipe index</a></li>
<li class="active"><a href="#">Recipe</a></li>
</ul>
{% if recipe.layerbranch.branch.name != current_branch %}
<div class="alert alert-error">
This recipe record is for a different branch than the one you have selected. To search for the equivalent recipe on the {{ current_branch }} branch, click <a href="{% url recipe_search %}?q={{ recipe.name }}">here</a>.
</div>
{% endif %}
<div class="page-header">
<h1>{{ recipe.name }} {{ recipe.pv }}</h1>
</div>
<table class="table table-striped table-bordered">
<tbody>
@ -86,7 +81,7 @@
</tr>
<tr>
<th>Layer</th>
<td><a href="{% url layer_item recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a> ({{ recipe.layerbranch.branch.name}} branch)</td>
<td><a href="{% url layer_item recipe.layerbranch.branch.name recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a> ({{ recipe.layerbranch.branch.name}} branch)</td>
</tr>
</tbody>
</table>
@ -98,7 +93,7 @@
{% for append in appends %}
<tr>
<td>
<a href="{% url layer_item append.layerbranch.layer.name %}">{{ append.layerbranch.layer.name }}</a>
<a href="{% url layer_item append.layerbranch.branch.name append.layerbranch.layer.name %}">{{ append.layerbranch.layer.name }}</a>
</td>
<td>
<a href="{{ append.vcs_web_url }}">{{ append.filename }}</a>

View File

@ -1,4 +1,4 @@
{% extends "base.html" %}
{% extends "base_toplevel.html" %}
{% load i18n %}
{% comment %}
@ -15,22 +15,23 @@
{% block title_append %} - recipes{% endblock %}
-->
{% block content %}
{% block navs %}
{% autoescape on %}
<li><a href="{% url layer_list url_branch %}">Layers</a></li>
<li class="active"><a href="{% url recipe_search url_branch %}">Recipes</a></li>
<li><a href="{% url machine_search url_branch %}">Machines</a></li>
{% endautoescape %}
{% endblock %}
{% block content_inner %}
{% autoescape on %}
<div class="row-fluid">
<div class="span9 offset1">
<ul class="nav nav-tabs">
<li><a href="{% url layer_list %}">Layers</a></li>
<li class="active"><a href="{% url recipe_search %}">Recipes</a></li>
<li><a href="{% url machine_search %}">Machines</a></li>
</ul>
<div class="row-fluid">
<div class="input-append">
<form id="filter-form" action="{% url recipe_search %}" method="get">
<form id="filter-form" action="{% url recipe_search url_branch %}" method="get">
<input type="text" class="input-xxlarge" id="appendedInputButtons" placeholder="Search recipes" name="q" value="{{ search_keyword }}" />
<button class="btn" type="submit">search</button>
</form>
@ -54,7 +55,7 @@
<td><a href="{% url recipe recipe.id %}">{{ recipe.name }}</a></td>
<td>{{ recipe.pv }}</td>
<td>{{ recipe.short_desc }}</td>
<td><a href="{% url layer_item recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a></td>
<td><a href="{% url layer_item url_branch recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a></td>
</tr>
{% endfor %}
</tbody>
@ -70,10 +71,6 @@
{% endif %}
{% endif %}
</div>
</div>
{% endautoescape %}
{% endblock %}

View File

@ -35,7 +35,7 @@
{% if user.is_authenticated %}
<span class="pull-right">
{% if perms.layerindex.publish_layer or useredit %}
<a href="{% url edit_layer layeritem.name %}?returnto=layer_review" class="btn">Edit layer</a>
<a href="{% url edit_layer 'master' layeritem.name %}?returnto=layer_review" class="btn">Edit layer</a>
{% if layeritem.layernote_set.count = 0 %}
<a href="{% url add_layernote layeritem.name %}" class="btn">Add note</a>
{% endif %}
@ -52,13 +52,6 @@
</div> <!-- end of container-fluid -->
<div class="container-fluid">
{% if not layerbranch %}
<div class="row-fluid">
<div class="alert alert-error">
This layer does not exist for branch {{ current_branch }}.
</div>
</div>
{% endif %}
<div class="row-fluid">
{% for note in layeritem.layernote_set.all %}
<div class="alert">
@ -170,7 +163,7 @@
<td>
<ul class="unstyled">
{% for dep in layerbranch.dependencies_set.all %}
<li><a href="{% url layer_item dep.dependency.name %}">{{ dep.dependency.name }}</a></li>
<li><a href="{% url layer_item 'master' dep.dependency.name %}">{{ dep.dependency.name }}</a></li>
{% endfor %}
</ul>
</td>