Add tag views
This commit is contained in:
parent
03a10e87c3
commit
417606c214
4 changed files with 199 additions and 4 deletions
|
@ -29,6 +29,9 @@
|
||||||
<li>
|
<li>
|
||||||
<a href="{% url 'distributor-list' %}"><img class="icon" title="Distributors" src="{% static "inventory/img/distributor.svg" %}"></a>
|
<a href="{% url 'distributor-list' %}"><img class="icon" title="Distributors" src="{% static "inventory/img/distributor.svg" %}"></a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="{% url 'tag-list' %}"><img class="icon" title="Tags" src="{% static "inventory/img/tags.svg" %}"></a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{% url 'workshop-list' %}"><img class="icon" title="Workshops" src="{% static "inventory/img/workshop.svg" %}"></a>
|
<a href="{% url 'workshop-list' %}"><img class="icon" title="Workshops" src="{% static "inventory/img/workshop.svg" %}"></a>
|
||||||
</li>
|
</li>
|
||||||
|
|
118
inventory/templates/inventory/tag_detail.html
Normal file
118
inventory/templates/inventory/tag_detail.html
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
{% load static %}
|
||||||
|
|
||||||
|
{% block title %}Tag {{ tag.name }}{% endblock %}
|
||||||
|
|
||||||
|
{% block header_bar %}
|
||||||
|
<a href="{% url "tag-list" %}"><img class="icon" src="{% static "inventory/img/back.svg" %}"></a>
|
||||||
|
{{ tag.name }}
|
||||||
|
<span class="small">{{ tag.description}}</span>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block header_icons %}
|
||||||
|
{% if user.is_staff %}
|
||||||
|
<li>
|
||||||
|
<a href="{% url "admin:inventory_tag_change" object_id=tag.pk %}"><img class="icon" src="{% static "inventory/img/edit.svg" %}"></a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% if tag.workshop_set.count > 0 %}
|
||||||
|
<h3>Workshops</h3>
|
||||||
|
<table class="list">
|
||||||
|
<tbody>
|
||||||
|
{% for workshop in tag.workshop_set.all %}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="{% url 'workshop-detail' workshop.id %}" title="{{ workshop.description }}">{{ workshop.name }}</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{% if user.is_staff %}
|
||||||
|
<a class="edit" href="{% url "admin:inventory_workshop_change" object_id=workshop.pk %}"><img class="icon" src="{% static 'inventory/img/edit.svg' %}"></a>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if tag.box_set.count > 0 %}
|
||||||
|
<h3>Boxes</h3>
|
||||||
|
<table class="list">
|
||||||
|
<tbody>
|
||||||
|
{% for box in tag.box_set.all %}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="{% url 'box-detail' box.id %}" title="{{ box.description }}">{{ box.name }}</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{% if user.is_staff %}
|
||||||
|
<a class="edit" href="{% url "admin:inventory_workshop_change" object_id=box.pk %}"><img class="icon" src="{% static 'inventory/img/edit.svg' %}"></a>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if tag.distributor_set.count > 0 %}
|
||||||
|
<h3>Distributors</h3>
|
||||||
|
<table class="list">
|
||||||
|
<tbody>
|
||||||
|
{% for distributor in tag.distributor_set.all %}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="{% url 'distributor-detail' distributor.id %}" title="{{ distributor.description }}">{{ distributor.name }}</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{% if user.is_staff %}
|
||||||
|
<a class="edit" href="{% url "admin:inventory_workshop_change" object_id=distributor.pk %}"><img class="icon" src="{% static 'inventory/img/edit.svg' %}"></a>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if tag.manufacturer_set.count > 0 %}
|
||||||
|
<h3>Manufacturers</h3>
|
||||||
|
<table class="list">
|
||||||
|
<tbody>
|
||||||
|
{% for manufacturer in tag.manufacturer_set.all %}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="{% url 'manufacturer-detail' manufacturer.id %}" title="{{ manufacturer.description }}">{{ manufacturer.name }}</a>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{% if user.is_staff %}
|
||||||
|
<a class="edit" href="{% url "admin:inventory_workshop_change" object_id=manufacturer.pk %}"><img class="icon" src="{% static 'inventory/img/edit.svg' %}"></a>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if items %}
|
||||||
|
<h3>Items</h3>
|
||||||
|
{% url 'tag-detail' tag.id as this_url %}
|
||||||
|
{% include "inventory/pagination.html" with url=this_url id="items_paginator_top" param="item" paginator=items %}
|
||||||
|
{% include "inventory/item_list.html" with items=items show_manufacturer=1 show_distributor=1 %}
|
||||||
|
{% include "inventory/pagination.html" with url=this_url id="items_paginator_bottom" param="item" paginator=items %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if tag.formfactor_set.count > 0 %}
|
||||||
|
<h3>Form factors</h3>
|
||||||
|
<ul class="compact-list">
|
||||||
|
{% for formfactor in tag.formfactor_set.all %}
|
||||||
|
<li>{{ formfactor.name }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% endblock %}
|
58
inventory/templates/inventory/tag_list.html
Normal file
58
inventory/templates/inventory/tag_list.html
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
{% load static %}
|
||||||
|
{% load formatstring %}
|
||||||
|
|
||||||
|
{% block title %}Tags{% endblock %}
|
||||||
|
|
||||||
|
{% block header_bar %}
|
||||||
|
Tags
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<script>
|
||||||
|
function updateSearch(e) {
|
||||||
|
const input = document.getElementById('search');
|
||||||
|
const text = input.value.toLowerCase();
|
||||||
|
|
||||||
|
if (text.length >= 2) {
|
||||||
|
const tagcloud = document.getElementById('tagcloud');
|
||||||
|
const items = tagcloud.getElementsByTagName('li');
|
||||||
|
for(i = 0; i < items.length; i++) {
|
||||||
|
const element = items[i];
|
||||||
|
if (element.dataset.search.includes(text)) {
|
||||||
|
element.style.display = "inline-block";
|
||||||
|
} else {
|
||||||
|
element.style.display = "none";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const tagcloud = document.getElementById('tagcloud');
|
||||||
|
const items = tagcloud.getElementsByTagName('li');
|
||||||
|
for(i = 0; i < items.length; i++) {
|
||||||
|
const element = items[i];
|
||||||
|
element.style.display = "inline-block";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<form>
|
||||||
|
<label for="search">Search:</label>
|
||||||
|
<input type="text" id="search" name="search" oninput="updateSearch(event)">
|
||||||
|
<button onclick="updateSearch(event)">Search</button>
|
||||||
|
</form>
|
||||||
|
<ul class="tag-list" id="tagcloud">
|
||||||
|
{% for tag in object_list %}
|
||||||
|
<li data-search="{{ tag.name | lower }} {{ tag.description | lower }}"><a href="{% url 'tag-detail' tag.id %}" title="{{ tag.name }}">{{ tag.name }}</a></li>
|
||||||
|
{% empty %}
|
||||||
|
No tags
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
{% if user.is_staff %}
|
||||||
|
<p><a href="{% url "admin:inventory_tag_add" %}?layout=1">Create new tag...</a></p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% endblock %}
|
|
@ -1,13 +1,29 @@
|
||||||
from django.views import View
|
from django.core.paginator import Paginator
|
||||||
|
from django.db.models import Q
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.utils.decorators import method_decorator
|
from django.utils.decorators import method_decorator
|
||||||
from django.views.generic import ListView, DetailView
|
from django.views.generic import ListView, DetailView
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
from inventory.models import Tag
|
from inventory.models import Tag, Item
|
||||||
|
|
||||||
|
|
||||||
class TagView(View):
|
@method_decorator(login_required, name='dispatch')
|
||||||
pass
|
class TagView(DetailView):
|
||||||
|
context_object_name = 'tag'
|
||||||
|
queryset = Tag.objects.all().prefetch_related('workshop_set', 'box_set', 'distributor_set', 'manufacturer_set', 'formfactor_set')
|
||||||
|
|
||||||
|
def get_context_data(self, *args, object_list=None, **kwargs):
|
||||||
|
result = super().get_context_data(*args, object_list=object_list, **kwargs)
|
||||||
|
p = self.request.GET.get("item_page", 1)
|
||||||
|
direct_tags = Q(tags__in=[self.get_object()])
|
||||||
|
formfactor_tags = Q(form_factor__tags__in=[self.get_object()])
|
||||||
|
items = Item.objects.filter(direct_tags | formfactor_tags).distinct().select_related('container', 'manufacturer')
|
||||||
|
paginator = Paginator(items, getattr(settings, "PAGE_SIZE", 10))
|
||||||
|
result.update({
|
||||||
|
"items": paginator.get_page(p)
|
||||||
|
})
|
||||||
|
return result
|
||||||
|
|
||||||
@method_decorator(login_required, name='dispatch')
|
@method_decorator(login_required, name='dispatch')
|
||||||
class TagListView(ListView):
|
class TagListView(ListView):
|
||||||
|
|
Loading…
Reference in a new issue