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

Add configuration for card printer

parent ab9c4e66
No related branches found
No related tags found
1 merge request!3Setup printer stuff
Pipeline #61758 passed
...@@ -34,6 +34,7 @@ class CardPrinterSerializer(serializers.ModelSerializer): ...@@ -34,6 +34,7 @@ class CardPrinterSerializer(serializers.ModelSerializer):
"status_icon", "status_icon",
"status_text", "status_text",
"last_seen_at", "last_seen_at",
"cups_printer",
) )
......
...@@ -2,7 +2,7 @@ from django import forms ...@@ -2,7 +2,7 @@ from django import forms
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django_select2.forms import ModelSelect2Widget from django_select2.forms import ModelSelect2Widget
from material import Layout from material import Fieldset, Layout
from aleksis.apps.kort.models import Card, CardPrinter from aleksis.apps.kort.models import Card, CardPrinter
...@@ -24,9 +24,14 @@ class CardForm(forms.ModelForm): ...@@ -24,9 +24,14 @@ class CardForm(forms.ModelForm):
class CardPrinterForm(forms.ModelForm): class CardPrinterForm(forms.ModelForm):
layout = Layout(
Fieldset(_("Generic attributes"), "name", "location", "description"),
Fieldset(_("Printer settings"), "cups_printer"),
)
class Meta: class Meta:
model = CardPrinter model = CardPrinter
fields = ["name", "location", "description"] fields = ["name", "location", "description", "cups_printer"]
class PrinterSelectForm(forms.Form): class PrinterSelectForm(forms.Form):
......
# Generated by Django 3.2.12 on 2022-03-19 19:18
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('kort', '0007_auto_20220315_1957'),
]
operations = [
migrations.AddField(
model_name='cardprinter',
name='cups_printer',
field=models.CharField(blank=True, max_length=255, verbose_name='CUPS printer'),
),
migrations.AlterField(
model_name='cardprintjob',
name='printer',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='jobs', to='kort.cardprinter', verbose_name='Printer'),
),
migrations.AlterField(
model_name='cardprintjob',
name='status',
field=models.CharField(choices=[('registered', 'Registered'), ('in_progress', 'In progress'), ('finished', 'Finished'), ('failed', 'Failed')], default='registered', max_length=255, verbose_name='Status'),
),
]
from datetime import timedelta
from typing import Any, Union from typing import Any, Union
from django.conf import settings from django.conf import settings
...@@ -77,6 +78,9 @@ class CardPrinter(ExtensibleModel): ...@@ -77,6 +78,9 @@ class CardPrinter(ExtensibleModel):
related_name="card_printers", related_name="card_printers",
) )
# Settings
cups_printer = models.CharField(max_length=255, verbose_name=_("CUPS printer"), blank=True)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.oauth2_application: if not self.oauth2_application:
application = OAuthApplication( application = OAuthApplication(
...@@ -122,6 +126,21 @@ class CardPrinter(ExtensibleModel): ...@@ -122,6 +126,21 @@ class CardPrinter(ExtensibleModel):
"""Return the filename for the printer client configuration.""" """Return the filename for the printer client configuration."""
return f"card-printer-config-{self.pk}.json" return f"card-printer-config-{self.pk}.json"
def check_online_status(self):
if (
self.status
not in (CardPrinterStatus.NOT_REGISTERED.value, CardPrinterStatus.OFFLINE.value)
and self.last_seen_at
):
if self.last_seen_at < timezone.now() - timedelta(minutes=1):
self.status = CardPrinterStatus.OFFLINE.value
self.save()
@classmethod
def check_online_status_for_all(cls):
for printer in cls.objects.all():
printer.check_online_status()
class Meta: class Meta:
verbose_name = _("Card printer") verbose_name = _("Card printer")
verbose_name_plural = _("Card printers") verbose_name_plural = _("Card printers")
......
...@@ -163,6 +163,11 @@ class CardPrinterListView(PermissionRequiredMixin, RevisionMixin, SingleTableVie ...@@ -163,6 +163,11 @@ class CardPrinterListView(PermissionRequiredMixin, RevisionMixin, SingleTableVie
) )
) )
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): class CardPrinterCreateView(PermissionRequiredMixin, RevisionMixin, AdvancedCreateView):
"""View used to create a card printer.""" """View used to create a card printer."""
...@@ -205,6 +210,11 @@ class CardPrinterDetailView(PermissionRequiredMixin, RevisionMixin, DetailView): ...@@ -205,6 +210,11 @@ class CardPrinterDetailView(PermissionRequiredMixin, RevisionMixin, DetailView):
model = CardPrinter model = CardPrinter
template_name = "kort/printer/detail.html" 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): class CardPrinterConfigView(PermissionRequiredMixin, RevisionMixin, SingleObjectMixin, View):
permission_required = "core.view_cardprinter_rule" permission_required = "core.view_cardprinter_rule"
......
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