Start Component pages

This commit is contained in:
Mario Hüttel 2021-11-09 16:35:11 +01:00
parent 323e857aa5
commit ed733b8bb7
6 changed files with 112 additions and 7 deletions

View File

@ -182,6 +182,13 @@ class Component(models.Model):
def get_qr_code(self): def get_qr_code(self):
qrdata = '[comp_uuid]' + str(self.id) qrdata = '[comp_uuid]' + str(self.id)
return qrdata return qrdata
def get_total_amount(self):
stocks = Stock.objects.filter(component=self)
sum = stocks.aggregate(Sum('amount'))['amount__sum']
if sum is None:
sum = 0
return sum
class ComponentParameter(models.Model): class ComponentParameter(models.Model):

View File

@ -7,6 +7,7 @@ urlpatterns = [
path('stocks/', parts_views.StockView.as_view(), name='parts-stocks'), path('stocks/', parts_views.StockView.as_view(), name='parts-stocks'),
path('logout/', parts_views.logout_view, name='logout'), path('logout/', parts_views.logout_view, name='logout'),
path('login/', parts_views.login_view, name='login'), path('login/', parts_views.login_view, name='login'),
path('changepw/', parts_views.ChangePasswordView.as_view(), name='parts-change-pw'), path('changepw/', parts_views.ChangePasswordView.as_view(), name='change-pw'),
path('stocks/<slug:uuid>', parts_views.StockViewDetail.as_view(), name='parts-stocks-detail'), path('stocks/<slug:uuid>/', parts_views.StockViewDetail.as_view(), name='parts-stocks-detail'),
path('components/<slug:uuid>/', parts_views.ComponentDetailView.as_view(), name='parts-components-detail'),
] ]

View File

@ -11,7 +11,7 @@ from django.views import View
import django.forms as forms import django.forms as forms
from django.views.generic import TemplateView, DetailView from django.views.generic import TemplateView, DetailView
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from .models import Storage, Stock from .models import Storage, Stock, Component, Distributor, Manufacturer, Package
from .qr_parser import QrCodeValidator from .qr_parser import QrCodeValidator
from django.core.paginator import Paginator from django.core.paginator import Paginator
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
@ -66,8 +66,6 @@ class ChangePasswordView(LoginRequiredMixin, BaseTemplateMixin, TemplateView):
return context return context
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
if 'submit-change-pw' not in request.POST: if 'submit-change-pw' not in request.POST:
return super().post(request, *args, **kwargs) return super().post(request, *args, **kwargs)
@ -137,6 +135,22 @@ class ComponentView(LoginRequiredMixin, BaseTemplateMixin, TemplateView):
template_name = 'parts/components.html' template_name = 'parts/components.html'
base_title = 'Components' base_title = 'Components'
navbar_selected = 'Components' navbar_selected = 'Components'
default_page_size = 10
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
comp_page_num = self.request.GET.get('comp_page', default=1)
pkg_page_num = self.request.GET.get('pkg_page', default= 1)
comp_paginator = Paginator(Component.objects.all(), self.default_page_size)
pkg_paginator = Paginator(Package.objects.all(), self.default_page_size)
context['components'] = comp_paginator.get_page(comp_page_num)
context['packages'] = pkg_paginator.get_page(pkg_page_num)
return context
class StockView(LoginRequiredMixin, BaseTemplateMixin, TemplateView): class StockView(LoginRequiredMixin, BaseTemplateMixin, TemplateView):
template_name = 'parts/stocks.html' template_name = 'parts/stocks.html'
@ -364,4 +378,21 @@ class StockViewDetail(LoginRequiredMixin, BaseTemplateMixin, DetailView):
elif 'submit-add-stock' in request.POST: elif 'submit-add-stock' in request.POST:
return self.handle_add_stock_post(request, **kwargs) return self.handle_add_stock_post(request, **kwargs)
return super().post(request, *args, **kwargs) return super().post(request, *args, **kwargs)
class ComponentDetailView(LoginRequiredMixin, BaseTemplateMixin, DetailView):
template_name = 'parts/components-detail.html'
model = Component
pk_url_kwarg = 'uuid'
base_title = ''
navbar_selected = 'Components'
def get_context_data(self, **kwargs):
self.base_title = 'Component / '+self.object.name
context = super().get_context_data(**kwargs)
context['component'] = self.object
return context

View File

@ -36,6 +36,7 @@
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle text-primary" id="navbar-user-dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">{{ base.navbar.username }}</a> <a href="#" class="nav-link dropdown-toggle text-primary" id="navbar-user-dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">{{ base.navbar.username }}</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbar-user-dropdown"> <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbar-user-dropdown">
<li><a class="dropdown-item" href="{% url 'change-pw' %}">Change Password</a></li>
<li><a class="dropdown-item" href="{% url 'logout' %}">Logout</a></li> <li><a class="dropdown-item" href="{% url 'logout' %}">Logout</a></li>
<li><a class="dropdown-item" href="{% url 'api-root' %}">REST API</a></li> <li><a class="dropdown-item" href="{% url 'api-root' %}">REST API</a></li>
{% if base.navbar.show_admin %} {% if base.navbar.show_admin %}

View File

@ -0,0 +1,8 @@
{% extends 'base.html' %}
{% block content %}
<div class="container">
Meow
{{component}}
</div>
{% endblock content %}

View File

@ -1,5 +1,62 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% block content %} {% block content %}
<h1>Components</h1> <div class="container">
<div class="row">
<div class="col-md">
<h2>Components</h2>
<div class="list-group">
{% for comp in components %}
<a href="{% url 'parts-components-detail' uuid=comp.id %}" class="text-decoration-none">
<li class="list-group-item list-group-item-action d-flex align-items-center">
<div class="flex-shrink-0">
{% if comp.get_resolved_image %}
<img src="{{comp.get_resolved_image}}" style="max-width:64px;max-height:64px;" alt="{{ comp.name }}" class="mr-3">
{% else %}
{% load static %}
<img src="{% static 'css/icons/card-image.svg' %}" style="width:64px;max-height:64px;" alt="{{ comp.name }}" class="mr-3">
{% endif %}
</div>
<div class="flex-grow-1 ms-3">
<h6 class="mt-0 text-primary">{{ comp.name }}</h6>
{% if comp.package %}
Package: {{comp.package}}<br>
{% endif %}
{% if comp.manufacturer %}
Manufacturer: {{comp.manufacturer}}
{% endif %}
</div>
<span class="badge bg-primary rounded-pill">{{comp.get_total_amount}}</span>
</li>
</a>
{% endfor %}
</div>
{% include 'paginator.html' with paginator=components get_param='comp_page' aria_label='Component Page Navigation' %}
</div>
<div class="col-md">
<h2>Packages</h2>
{% for pkg in packages %}
<li class="list-group-item list-group-item-action d-flex align-items-center">
<div class="flex-shrink-0">
{% if pkg.image %}
<img src="{{pkg.image.url}}" style="max-width:64px;max-height:64px;" alt="{{ pkg.name }}" class="mr-3">
{% else %}
{% load static %}
<img src="{% static 'css/icons/card-image.svg' %}" style="width:64px;max-height:64px;" alt="{{ pkg.name }}" class="mr-3">
{% endif %}
</div>
<div class="flex-grow-1 ms-3">
<h6 class="mt-0 text-primary">{{ pkg.name }}</h6>
{% if pkg.smd %}
SMD Package<br>
{% endif %}
Pin Count: {{pkg.pin_count}}
</div>
</li>
{% endfor %}
</div>
{% include 'paginator.html' with paginator=packages get_param='pkg_page' aria_label='Package Page Navigation' %}
</div>
</div>
</div>
{% endblock content %} {% endblock content %}