diff --git a/default.nix b/default.nix
index a4ecad7..47ddc33 100644
--- a/default.nix
+++ b/default.nix
@@ -38,6 +38,9 @@ in
ps.markdown-icons
ps.authens
+ ps.qrcode
+ ps.pillow
+
# Django haystack is drunk
ps.setuptools
]))
diff --git a/inventory/templates/inventory/game.html b/inventory/templates/inventory/game.html
index 917c247..9b294a8 100644
--- a/inventory/templates/inventory/game.html
+++ b/inventory/templates/inventory/game.html
@@ -30,6 +30,9 @@
Emprunter ou rendre « {{ game.title }} »
+
+ Générer un QR-code
+
Description
{{ object.description|linebreaks }}
diff --git a/inventory/urls.py b/inventory/urls.py
index 29d3813..be66a52 100644
--- a/inventory/urls.py
+++ b/inventory/urls.py
@@ -1,21 +1,10 @@
from django.urls import path
-from .views import (
- InventoryView,
- CategoryListView,
- CategoryView,
- TagListView,
- TagView,
- GameListView,
- GameView,
- AddGameCommentView,
- ModifyGameCommentView,
- InventorySearchView,
- GameLoanView,
- BorrowGameView,
- ReturnGameView,
- OngoingLoansView,
- DetailLoanView,
-)
+
+from .views import (AddGameCommentView, BorrowGameView, CategoryListView,
+ CategoryView, DetailLoanView, GameListView, GameLoanView,
+ GameView, InventorySearchView, InventoryView,
+ ModifyGameCommentView, OngoingLoansView, QrCodeView,
+ ReturnGameView, TagListView, TagView)
app_name = "inventory"
@@ -39,6 +28,11 @@ urlpatterns = [
path("loans/game//", GameLoanView.as_view(), name="game_loan"),
path("loans/return//", ReturnGameView.as_view(), name="return_game"),
path("loans/borrow//", BorrowGameView.as_view(), name="borrow_game"),
+ path(
+ "qrcode/borrow//",
+ QrCodeView.as_view(url="inventory:borrow_game"),
+ name="qrcode_borrow",
+ ),
path("loans/ongoing/", OngoingLoansView.as_view(), name="ongoing_loans"),
path("loans/all/", DetailLoanView.as_view(), name="all_loans"),
]
diff --git a/inventory/views.py b/inventory/views.py
index 52d9dfa..a19b403 100644
--- a/inventory/views.py
+++ b/inventory/views.py
@@ -1,13 +1,17 @@
-from django.views.generic import TemplateView, ListView, DetailView
-from django.contrib.auth.mixins import PermissionRequiredMixin
-from haystack.generic_views import SearchView
-from haystack.forms import SearchForm
-from haystack.query import SearchQuerySet
-from django_tables2.views import SingleTableView
+import qrcode
from comments.views import AddCommentView, ModifyCommentView
-from loans.views import BorrowView, ReturnView, DetailLoanView
-from .models import Category, Tag, Game, GameComment, GameLoan
+from django.contrib.auth.mixins import PermissionRequiredMixin
+from django.http import HttpResponse
+from django.urls import reverse
+from django.views.generic import DetailView, ListView, TemplateView
+from django_tables2.views import SingleTableView
+from haystack.forms import SearchForm
+from haystack.generic_views import SearchView
+from haystack.query import SearchQuerySet
+from loans.views import BorrowView, DetailLoanView, ReturnView
+
from .forms import BorrowGameForm
+from .models import Category, Game, GameComment, GameLoan, Tag
from .tables import LoanTable, OngoingLoansTable
@@ -102,3 +106,13 @@ class DetailLoanView(PermissionRequiredMixin, SingleTableView):
table_class = LoanTable
template_name = "inventory/loans/loans_table.html"
+
+class QrCodeView(DetailView):
+ model = Game
+ url = "inventory:game" # Sensible default
+
+ def get(self, request, *args, **kwargs):
+ response = HttpResponse(content_type="image/png")
+ img = qrcode.make(reverse(self.url, kwargs={"slug": self.get_object().slug}))
+ img.save(response, "PNG")
+ return response
diff --git a/requirements.txt b/requirements.txt
index 39ec4ed..4502768 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,5 +7,6 @@ django-markdownx==4.0.5
django-tables2==2.7.0
markdown-iconfonts==3.0.0
Pillow==10.1.0
+qrcode>=7.4.2
Whoosh==2.7.4
loadcredential==1.1