mirror of
git://git.yoctoproject.org/layerindex-web.git
synced 2025-07-19 20:59:01 +02:00
Support reversed other distro recipe list / filtering
Enable "reversing" the comparison, so you can see which recipes on the OE side match up (or don't) with the other distro. The filtering for this is a bit awkward, since we don't have an actual foreign key for the link, hence the hairiness of the code. Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
This commit is contained in:
parent
5c56e16a49
commit
8ef315c6bf
|
@ -872,28 +872,10 @@ class RecipeDetailView(DetailView):
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
class ClassicRecipeLinkWrapper:
|
class LinkWrapper:
|
||||||
def __init__(self, queryset):
|
def __init__(self, queryset):
|
||||||
self.queryset = queryset
|
self.queryset = queryset
|
||||||
|
|
||||||
# This function is required by generic views, create another proxy
|
|
||||||
def _clone(self):
|
|
||||||
return ClassicRecipeLinkIterator(self.queryset._clone(), **self.kwargs)
|
|
||||||
|
|
||||||
def _annotate(self, obj):
|
|
||||||
recipe = None
|
|
||||||
vercmp = 0
|
|
||||||
if obj.cover_layerbranch and obj.cover_pn:
|
|
||||||
rq = Recipe.objects.filter(layerbranch=obj.cover_layerbranch).filter(pn=obj.cover_pn)
|
|
||||||
if rq:
|
|
||||||
recipe = rq.first()
|
|
||||||
if obj.pv and recipe.pv:
|
|
||||||
obj_ver = parse_version(obj.pv)
|
|
||||||
recipe_ver = parse_version(recipe.pv)
|
|
||||||
vercmp = ((recipe_ver > obj_ver) - (recipe_ver < obj_ver))
|
|
||||||
setattr(obj, 'cover_recipe', recipe)
|
|
||||||
setattr(obj, 'cover_vercmp', vercmp)
|
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
for obj in self.queryset:
|
for obj in self.queryset:
|
||||||
self._annotate(obj)
|
self._annotate(obj)
|
||||||
|
@ -916,6 +898,49 @@ class ClassicRecipeLinkWrapper:
|
||||||
else:
|
else:
|
||||||
return len(self.queryset)
|
return len(self.queryset)
|
||||||
|
|
||||||
|
class ClassicRecipeLinkWrapper(LinkWrapper):
|
||||||
|
# This function is required by generic views, create another proxy
|
||||||
|
def _clone(self):
|
||||||
|
return ClassicRecipeLinkWrapper(self.queryset._clone(), **self.kwargs)
|
||||||
|
|
||||||
|
def _annotate(self, obj):
|
||||||
|
recipe = None
|
||||||
|
vercmp = 0
|
||||||
|
if obj.cover_layerbranch and obj.cover_pn:
|
||||||
|
rq = Recipe.objects.filter(layerbranch=obj.cover_layerbranch).filter(pn=obj.cover_pn)
|
||||||
|
if rq:
|
||||||
|
recipe = rq.first()
|
||||||
|
if obj.pv and recipe.pv:
|
||||||
|
obj_ver = parse_version(obj.pv)
|
||||||
|
recipe_ver = parse_version(recipe.pv)
|
||||||
|
vercmp = ((recipe_ver > obj_ver) - (recipe_ver < obj_ver))
|
||||||
|
setattr(obj, 'cover_recipe', recipe)
|
||||||
|
setattr(obj, 'cover_vercmp', vercmp)
|
||||||
|
|
||||||
|
class ClassicRecipeReverseLinkWrapper(LinkWrapper):
|
||||||
|
def __init__(self, queryset, branch):
|
||||||
|
self.queryset = queryset
|
||||||
|
self.branch = branch
|
||||||
|
|
||||||
|
# This function is required by generic views, create another proxy
|
||||||
|
def _clone(self):
|
||||||
|
return ClassicRecipeReverseLinkWrapper(self.queryset._clone(), **self.kwargs)
|
||||||
|
|
||||||
|
def _annotate(self, obj):
|
||||||
|
recipe = None
|
||||||
|
vercmp = 0
|
||||||
|
rq = ClassicRecipe.objects.filter(layerbranch__branch__name=self.branch).filter(cover_layerbranch=obj.layerbranch).filter(cover_pn=obj.pn)
|
||||||
|
if rq:
|
||||||
|
recipe = rq.first()
|
||||||
|
if obj.pv and recipe.pv:
|
||||||
|
obj_ver = parse_version(obj.pv)
|
||||||
|
recipe_ver = parse_version(recipe.pv)
|
||||||
|
vercmp = ((recipe_ver > obj_ver) - (recipe_ver < obj_ver))
|
||||||
|
setattr(obj, 'cover_recipe', recipe)
|
||||||
|
setattr(obj, 'cover_vercmp', vercmp)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class ClassicRecipeSearchView(RecipeSearchView):
|
class ClassicRecipeSearchView(RecipeSearchView):
|
||||||
def render_to_response(self, context, **kwargs):
|
def render_to_response(self, context, **kwargs):
|
||||||
# Bypass the redirect-to-single-instance behaviour of RecipeSearchView
|
# Bypass the redirect-to-single-instance behaviour of RecipeSearchView
|
||||||
|
@ -930,7 +955,10 @@ class ClassicRecipeSearchView(RecipeSearchView):
|
||||||
oe_layer = self.request.GET.get('oe_layer', None)
|
oe_layer = self.request.GET.get('oe_layer', None)
|
||||||
has_patches = self.request.GET.get('has_patches', '')
|
has_patches = self.request.GET.get('has_patches', '')
|
||||||
needs_attention = self.request.GET.get('needs_attention', '')
|
needs_attention = self.request.GET.get('needs_attention', '')
|
||||||
|
qreversed = self.request.GET.get('reversed', '')
|
||||||
init_qs = ClassicRecipe.objects.filter(layerbranch__branch__name=self.kwargs['branch']).filter(deleted=False)
|
init_qs = ClassicRecipe.objects.filter(layerbranch__branch__name=self.kwargs['branch']).filter(deleted=False)
|
||||||
|
filtered = False
|
||||||
|
cover_null = False
|
||||||
if cover_status:
|
if cover_status:
|
||||||
if cover_status == '!':
|
if cover_status == '!':
|
||||||
init_qs = init_qs.filter(cover_status__in=['U', 'N', 'S'])
|
init_qs = init_qs.filter(cover_status__in=['U', 'N', 'S'])
|
||||||
|
@ -938,13 +966,18 @@ class ClassicRecipeSearchView(RecipeSearchView):
|
||||||
init_qs = init_qs.exclude(cover_status__in=['U', 'N', 'S'])
|
init_qs = init_qs.exclude(cover_status__in=['U', 'N', 'S'])
|
||||||
else:
|
else:
|
||||||
init_qs = init_qs.filter(cover_status=cover_status)
|
init_qs = init_qs.filter(cover_status=cover_status)
|
||||||
|
filtered = True
|
||||||
|
if cover_status in ['U', '!']:
|
||||||
|
cover_null = True
|
||||||
if cover_verified:
|
if cover_verified:
|
||||||
init_qs = init_qs.filter(cover_verified=(cover_verified=='1'))
|
init_qs = init_qs.filter(cover_verified=(cover_verified=='1'))
|
||||||
|
filtered = True
|
||||||
if category:
|
if category:
|
||||||
if category == "''" or category == '""':
|
if category == "''" or category == '""':
|
||||||
init_qs = init_qs.filter(classic_category='')
|
init_qs = init_qs.filter(classic_category='')
|
||||||
else:
|
else:
|
||||||
init_qs = init_qs.filter(classic_category__icontains=category)
|
init_qs = init_qs.filter(classic_category__icontains=category)
|
||||||
|
filtered = True
|
||||||
if oe_layer:
|
if oe_layer:
|
||||||
init_qs = init_qs.filter(cover_layerbranch__layer=oe_layer)
|
init_qs = init_qs.filter(cover_layerbranch__layer=oe_layer)
|
||||||
if has_patches.strip():
|
if has_patches.strip():
|
||||||
|
@ -952,11 +985,13 @@ class ClassicRecipeSearchView(RecipeSearchView):
|
||||||
init_qs = init_qs.filter(patch__isnull=False).distinct()
|
init_qs = init_qs.filter(patch__isnull=False).distinct()
|
||||||
else:
|
else:
|
||||||
init_qs = init_qs.filter(patch__isnull=True)
|
init_qs = init_qs.filter(patch__isnull=True)
|
||||||
|
filtered = True
|
||||||
if needs_attention.strip():
|
if needs_attention.strip():
|
||||||
if needs_attention == '1':
|
if needs_attention == '1':
|
||||||
init_qs = init_qs.filter(needs_attention=True)
|
init_qs = init_qs.filter(needs_attention=True)
|
||||||
else:
|
else:
|
||||||
init_qs = init_qs.filter(needs_attention=False)
|
init_qs = init_qs.filter(needs_attention=False)
|
||||||
|
filtered = True
|
||||||
if query_string.strip():
|
if query_string.strip():
|
||||||
order_by = (Lower('pn'), 'layerbranch__layer')
|
order_by = (Lower('pn'), 'layerbranch__layer')
|
||||||
|
|
||||||
|
@ -969,6 +1004,7 @@ class ClassicRecipeSearchView(RecipeSearchView):
|
||||||
qs2 = init_qs.filter(entry_query).order_by(*order_by)
|
qs2 = init_qs.filter(entry_query).order_by(*order_by)
|
||||||
|
|
||||||
qs = list(utils.chain_unique(qs0, qs1, qs2))
|
qs = list(utils.chain_unique(qs0, qs1, qs2))
|
||||||
|
filtered = True
|
||||||
else:
|
else:
|
||||||
if 'q' in self.request.GET:
|
if 'q' in self.request.GET:
|
||||||
qs = init_qs.order_by(Lower('pn'), 'layerbranch__layer')
|
qs = init_qs.order_by(Lower('pn'), 'layerbranch__layer')
|
||||||
|
@ -977,7 +1013,34 @@ class ClassicRecipeSearchView(RecipeSearchView):
|
||||||
# won't actually want that (if they do they can just hit the search button
|
# won't actually want that (if they do they can just hit the search button
|
||||||
# with no query string)
|
# with no query string)
|
||||||
return Recipe.objects.none()
|
return Recipe.objects.none()
|
||||||
return ClassicRecipeLinkWrapper(qs)
|
if qreversed:
|
||||||
|
init_rqs = Recipe.objects.filter(layerbranch__branch__name='master')
|
||||||
|
if oe_layer:
|
||||||
|
init_rqs = init_rqs.filter(layerbranch__layer=oe_layer)
|
||||||
|
all_values = []
|
||||||
|
if filtered:
|
||||||
|
if isinstance(qs, list):
|
||||||
|
values = []
|
||||||
|
for item in qs:
|
||||||
|
if item.cover_layerbranch and item.cover_pn:
|
||||||
|
values.append((item.cover_layerbranch.id, item.cover_pn))
|
||||||
|
else:
|
||||||
|
values = qs.filter(cover_layerbranch__isnull=False).filter(cover_pn__isnull=False).values_list('cover_layerbranch__id', 'cover_pn').distinct()
|
||||||
|
if cover_null:
|
||||||
|
all_values = ClassicRecipe.objects.filter(layerbranch__branch__name=self.kwargs['branch']).filter(deleted=False).filter(cover_layerbranch__isnull=False).filter(cover_pn__isnull=False).values_list('cover_layerbranch__id', 'cover_pn').distinct()
|
||||||
|
else:
|
||||||
|
values = None
|
||||||
|
rqs = init_rqs.order_by(Lower('pn'), 'layerbranch__layer')
|
||||||
|
if filtered:
|
||||||
|
items = []
|
||||||
|
for item in rqs:
|
||||||
|
recipe_values = (item.layerbranch.id, item.pn)
|
||||||
|
if (cover_null and recipe_values not in all_values) or (recipe_values in values):
|
||||||
|
items.append(item)
|
||||||
|
return ClassicRecipeReverseLinkWrapper(items, self.kwargs['branch'])
|
||||||
|
return ClassicRecipeReverseLinkWrapper(rqs, self.kwargs['branch'])
|
||||||
|
else:
|
||||||
|
return ClassicRecipeLinkWrapper(qs)
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super(ClassicRecipeSearchView, self).get_context_data(**kwargs)
|
context = super(ClassicRecipeSearchView, self).get_context_data(**kwargs)
|
||||||
|
@ -991,6 +1054,7 @@ class ClassicRecipeSearchView(RecipeSearchView):
|
||||||
searched = False
|
searched = False
|
||||||
search_form = ClassicRecipeSearchForm()
|
search_form = ClassicRecipeSearchForm()
|
||||||
context['compare'] = self.request.GET.get('compare', False)
|
context['compare'] = self.request.GET.get('compare', False)
|
||||||
|
context['reversed'] = self.request.GET.get('reversed', False)
|
||||||
context['search_form'] = search_form
|
context['search_form'] = search_form
|
||||||
context['searched'] = searched
|
context['searched'] = searched
|
||||||
return context
|
return context
|
||||||
|
|
|
@ -54,6 +54,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<tr><td><label class="checkbox"><input type="checkbox" name="compare" {% if compare %}checked{% endif %}></input>Show comparison</label></td></tr>
|
<tr><td><label class="checkbox"><input type="checkbox" name="compare" {% if compare %}checked{% endif %}></input>Show comparison</label></td></tr>
|
||||||
|
<tr><td><label class="checkbox"><input type="checkbox" name="reversed" {% if reversed %}checked{% endif %}></input>Reversed</label></td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<button class="btn" type="submit">Search</button>
|
<button class="btn" type="submit">Search</button>
|
||||||
|
@ -64,7 +65,19 @@
|
||||||
<table class="table table-striped table-bordered recipestable">
|
<table class="table table-striped table-bordered recipestable">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
{% if compare %}
|
{% if reversed %}
|
||||||
|
<th>Recipe name</th>
|
||||||
|
<th>OE Layer</th>
|
||||||
|
<th>Version</th>
|
||||||
|
<th class="span7">Description</th>
|
||||||
|
<th>Section</th>
|
||||||
|
<th class="span5">Status</th>
|
||||||
|
{% if branch.name == 'oe-classic' %}
|
||||||
|
<th>Covering recipe</th>
|
||||||
|
{% else %}
|
||||||
|
<th>Covering package</th>
|
||||||
|
{% endif %}
|
||||||
|
{% elif compare %}
|
||||||
{% if branch.name == 'oe-classic' %}
|
{% if branch.name == 'oe-classic' %}
|
||||||
<th>Recipe name</th>
|
<th>Recipe name</th>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
@ -95,7 +108,15 @@
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for recipe in recipe_list %}
|
{% for recipe in recipe_list %}
|
||||||
<tr {% if recipe.preferred_count > 0 %}class="muted"{% endif %}>
|
<tr {% if recipe.preferred_count > 0 %}class="muted"{% endif %}>
|
||||||
{% if compare %}
|
{% if reversed %}
|
||||||
|
<td><a href="{% url 'recipe' recipe.id %}">{{ recipe.name }}{% if recipe.needs_attention %} <i class="icon-exclamation-sign" data-toggle="tooltip" title="Needs attention"></i>{% endif %}</a></td>
|
||||||
|
<td><a href="{% url 'layer_item' 'master' recipe.layerbranch.layer.name %}">{{ recipe.layerbranch.layer.name }}</a></td>
|
||||||
|
<td>{{ recipe.pv }}</td>
|
||||||
|
<td>{{ recipe.short_desc }}</td>
|
||||||
|
<td>{{ recipe.section }}</td>
|
||||||
|
<td>{% if recipe.cover_recipe %}{{ recipe.cover_recipe.get_cover_status_display }}{% endif %}</td>
|
||||||
|
<td>{% if recipe.cover_recipe %}<a href="{% url 'comparison_recipe' recipe.cover_recipe.id %}">{% endif %}{{ recipe.cover_recipe.pn }}{% if recipe.cover_recipe %}</a>{% endif %}</td>
|
||||||
|
{% elif compare %}
|
||||||
<td><a href="{% url 'comparison_recipe' recipe.id %}">{{ recipe.name }}{% if recipe.needs_attention %} <i class="icon-exclamation-sign" data-toggle="tooltip" title="Needs attention"></i>{% endif %}</a></td>
|
<td><a href="{% url 'comparison_recipe' recipe.id %}">{{ recipe.name }}{% if recipe.needs_attention %} <i class="icon-exclamation-sign" data-toggle="tooltip" title="Needs attention"></i>{% endif %}</a></td>
|
||||||
<td>{{ recipe.pv|truncatechars:10 }}</td>
|
<td>{{ recipe.pv|truncatechars:10 }}</td>
|
||||||
<td>{% if recipe.patch_set.exists %}{{ recipe.patch_set.count }}{% endif %}</td>
|
<td>{% if recipe.patch_set.exists %}{{ recipe.patch_set.count }}{% endif %}</td>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user