Skip to content
Snippets Groups Projects
Commit bf7b36ff authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Merge branch 'feature/printers' into 'main'

Setup printer stuff

See merge request !3
parents d30d9733 6518b0f2
No related branches found
No related tags found
1 merge request!3Setup printer stuff
Pipeline #71634 canceled
{# -*- engine:django -*- #}
{% extends "core/base.html" %}
{% load i18n rules material_form any_js %}
{% load render_table from django_tables2 %}
{% block browser_title %}{% blocktrans %}Card printers{% endblocktrans %}{% endblock %}
{% block page_title %}{% blocktrans %}Card printers{% endblocktrans %}{% endblock %}
{% block content %}
{% has_perm 'core.create_cardprinter_rule' user person as can_create_person %}
{% if can_create_person %}
<a class="btn green waves-effect waves-light" href="{% url 'create_card_printer' %}">
<i class="material-icons left iconify" data-icon="mdi:plus"></i>
{% trans "Register new card printer" %}
</a>
{% endif %}
{% render_table table %}
{% endblock %}
{% load i18n %}
<table>
<tr>
<th>{% trans "Name" %}</th>
<td>{{ printer.name }}</td>
</tr>
<tr>
<th>{% trans "Location" %}</th>
<td>{{ printer.location|default:"–" }}</td>
</tr>
<tr>
<th>{% trans "Status" %}</th>
<td>{% include "kort/printer/status.html" %}</td>
</tr>
</table>
\ No newline at end of file
{% load i18n %}
<span class="chip white-text {{ printer.status_color }}" title="{{ printer.status_text }}">
<i class="material-icons left iconify" data-icon="{{ printer.status_icon }}"></i>
{{ printer.status_label }}
</span>
\ No newline at end of file
from django.urls import path
from . import views
from . import api, views
urlpatterns = [
path("test", views.TestPDFView.as_view(), name="test_pdf"),
......@@ -13,5 +13,41 @@ urlpatterns = [
name="generate_card_pdf",
),
path("cards/<int:pk>/deactivate/", views.CardDeactivateView.as_view(), name="deactivate_card"),
path("cards/<int:pk>/print/", views.CardPrintView.as_view(), name="print_card"),
path("cards/<int:pk>/delete/", views.CardDeleteView.as_view(), name="delete_card"),
path("printers/", views.CardPrinterListView.as_view(), name="card_printers"),
path("printers/create/", views.CardPrinterCreateView.as_view(), name="create_card_printer"),
path("printers/<int:pk>/", views.CardPrinterDetailView.as_view(), name="card_printer"),
path("printers/<int:pk>/edit/", views.CardPrinterEditView.as_view(), name="edit_card_printer"),
path(
"printers/<int:pk>/delete/",
views.CardPrinterDeleteView.as_view(),
name="delete_card_printer",
),
path(
"printers/<int:pk>/config/",
views.CardPrinterConfigView.as_view(),
name="card_printer_config",
),
path("api/v1/printers/", api.CardPrinterDetails.as_view(), name="api_card_printer"),
path(
"api/v1/printers/<int:pk>/status/",
api.CardPrinterUpdateStatus.as_view(),
name="api_card_printer_status",
),
path(
"api/v1/printers/<int:pk>/jobs/next/",
api.GetNextPrintJob.as_view(),
name="api_get_next_print_job",
),
path(
"api/v1/jobs/<int:pk>/status/",
api.CardPrintJobUpdateStatusView.as_view(),
name="api_update_job_status",
),
path(
"api/v1/jobs/<int:pk>/chip_number/",
api.CardPrintJobSetChipNumberView.as_view(),
name="api_set_chip_number",
),
]
import json
from django.contrib import messages
from django.db.models import Count, Q
from django.http import HttpRequest, HttpResponse
from django.shortcuts import redirect, render
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse, reverse_lazy
from django.utils.translation import gettext as _
from django.views import View
......@@ -10,10 +13,10 @@ from django_tables2 import SingleTableView
from reversion.views import RevisionMixin
from rules.contrib.views import PermissionRequiredMixin
from aleksis.apps.kort.forms import CardForm
from aleksis.apps.kort.models import Card
from aleksis.apps.kort.tables import CardTable
from aleksis.core.mixins import AdvancedCreateView, AdvancedDeleteView
from aleksis.apps.kort.forms import CardForm, CardPrinterForm, PrinterSelectForm
from aleksis.apps.kort.models import Card, CardPrinter, PrintStatus
from aleksis.apps.kort.tables import CardPrinterTable, CardTable
from aleksis.core.mixins import AdvancedCreateView, AdvancedDeleteView, AdvancedEditView
from aleksis.core.util.celery_progress import render_progress_page
from aleksis.core.views import RenderPDFView
......@@ -31,7 +34,16 @@ class TestPDFView(RenderPDFView):
return context
class CardListView(PermissionRequiredMixin, RevisionMixin, SingleTableView):
class PrinterSelectMixin:
def get_context_data(self, **kwargs):
print("Called and used?")
context = super().get_context_data(**kwargs)
context["printers"] = CardPrinter.objects.all()
context["printer_form"] = PrinterSelectForm()
return context
class CardListView(PermissionRequiredMixin, RevisionMixin, PrinterSelectMixin, SingleTableView):
"""List view for all cards."""
permission_required = "core.view_cards_rule"
......@@ -75,7 +87,31 @@ class CardDeactivateView(PermissionRequiredMixin, RevisionMixin, SingleObjectMix
return redirect(self.success_url)
class CardDetailView(PermissionRequiredMixin, RevisionMixin, DetailView):
class CardPrintView(PermissionRequiredMixin, RevisionMixin, SingleObjectMixin, View):
"""View used to create a print job for a card."""
permission_required = "core.delete_card_rule"
model = Card
success_url = reverse_lazy("cards")
def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:
self.object = self.get_object()
printer = self.request.GET.get("printer")
printer = get_object_or_404(CardPrinter, pk=printer)
self.object.print_card(printer)
messages.success(
request,
_(
"The print job for the card {} on the printer {} has been created successfully."
).format(self.object.person, printer.name),
)
return redirect(self.success_url)
class CardDetailView(PermissionRequiredMixin, RevisionMixin, PrinterSelectMixin, DetailView):
permission_required = "core.view_card_rule"
model = Card
template_name = "kort/card/detail.html"
......@@ -110,3 +146,84 @@ class CardGeneratePDFView(PermissionRequiredMixin, RevisionMixin, SingleObjectMi
button_url=redirect_url,
button_icon="credit_card",
)
class CardPrinterListView(PermissionRequiredMixin, RevisionMixin, SingleTableView):
"""List view for all card printers."""
permission_required = "core.view_cardprinters_rule"
template_name = "kort/printer/list.html"
model = CardPrinter
table_class = CardPrinterTable
def get_queryset(self):
return CardPrinter.objects.all().annotate(
jobs_count=Count(
"jobs", filter=~Q(jobs__status__in=[PrintStatus.FINISHED, PrintStatus.FAILED])
)
)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
CardPrinter.check_online_status_for_all()
return context
class CardPrinterCreateView(PermissionRequiredMixin, RevisionMixin, AdvancedCreateView):
"""View used to create a card printer."""
permission_required = "core.create_cardprinter_rule"
template_name = "kort/printer/create.html"
form_class = CardPrinterForm
model = CardPrinter
success_message = _("The card printer has been created successfully.")
def get_success_url(self):
return reverse("card_printer", args=[self.object.pk])
class CardPrinterEditView(PermissionRequiredMixin, RevisionMixin, AdvancedEditView):
"""View used to edit a card printer."""
permission_required = "core.edit_cardprinter_rule"
template_name = "kort/printer/edit.html"
form_class = CardPrinterForm
model = CardPrinter
success_message = _("The card printer has been changed successfully.")
def get_success_url(self):
return reverse("card_printer", args=[self.object.pk])
class CardPrinterDeleteView(PermissionRequiredMixin, RevisionMixin, AdvancedDeleteView):
"""View used to delete a card printer."""
permission_required = "core.delete_cardprinter_rule"
success_url = reverse_lazy("card_printers")
template_name = "kort/printer/delete.html"
model = CardPrinter
success_message = _("The card printer has been deleted successfully.")
class CardPrinterDetailView(PermissionRequiredMixin, RevisionMixin, DetailView):
permission_required = "core.view_cardprinter_rule"
model = CardPrinter
template_name = "kort/printer/detail.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
self.object.check_online_status()
return context
class CardPrinterConfigView(PermissionRequiredMixin, RevisionMixin, SingleObjectMixin, View):
permission_required = "core.view_cardprinter_rule"
model = CardPrinter
def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse:
self.object = self.get_object()
response = HttpResponse(
json.dumps(self.object.generate_config()), content_type="application/json"
)
response["Content-Disposition"] = f'attachment; filename="{self.object.config_filename}"'
return response
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment