summaryrefslogtreecommitdiff
path: root/ishtar_common/models.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2019-02-25 18:07:15 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2019-04-24 19:38:57 +0200
commit9937ed0dc9779d505633585a2fad2403b89c5b7f (patch)
tree068c7b4348f5fe28d4ab4ec50bbc1c3dbbf89271 /ishtar_common/models.py
parent959471fcc4a1a8d39aab9202eb88816be14e90b2 (diff)
downloadIshtar-9937ed0dc9779d505633585a2fad2403b89c5b7f.tar.bz2
Ishtar-9937ed0dc9779d505633585a2fad2403b89c5b7f.zip
Manage generation of QR codes
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r--ishtar_common/models.py60
1 files changed, 51 insertions, 9 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index 9dd90de65..5e81e80a0 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -28,6 +28,7 @@ from jinja2 import TemplateSyntaxError
import json
import logging
import os
+import pyqrcode
import re
import shutil
import tempfile
@@ -45,9 +46,11 @@ from django.contrib.contenttypes.models import ContentType
from django.contrib.gis.db import models
from django.contrib.postgres.fields import JSONField
from django.contrib.postgres.search import SearchVectorField, SearchVector
+from django.contrib.sites.models import Site
from django.core.cache import cache
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.core.files.uploadedfile import SimpleUploadedFile
+from django.core.files import File
from django.core.serializers import serialize
from django.core.urlresolvers import reverse, NoReverseMatch
from django.core.validators import validate_slug
@@ -1008,7 +1011,15 @@ def get_image_path(instance, filename):
return instance._get_image_path(filename)
-class ImageModel(models.Model):
+class ImageContainerModel(object):
+ def _get_image_path(self, filename):
+ return u"{}/{}".format(self._get_base_image_path(), filename)
+
+ def _get_base_image_path(self):
+ return u"upload"
+
+
+class ImageModel(models.Model, ImageContainerModel):
image = models.ImageField(upload_to=get_image_path, blank=True, null=True,
max_length=255, help_text=max_size_help())
thumbnail = models.ImageField(
@@ -1021,12 +1032,6 @@ class ImageModel(models.Model):
class Meta:
abstract = True
- def _get_image_path(self, filename):
- return u"{}/{}".format(self._get_base_image_path(), filename)
-
- def _get_base_image_path(self):
- return u"upload"
-
def has_changed(self, field):
if not self.pk:
return True
@@ -1566,6 +1571,40 @@ class FixAssociated(object):
setattr(item, subkey, new_value)
+class QRCodeItem(models.Model, ImageContainerModel):
+ qrcode = models.ImageField(upload_to=get_image_path, blank=True, null=True,
+ max_length=255)
+
+ class Meta:
+ abstract = True
+
+ def generate_qrcode(self, request=None, secure=True, tmpdir=None):
+ url = self.get_absolute_url()
+ site = Site.objects.get_current()
+ if request:
+ scheme = self.request.scheme
+ else:
+ if secure:
+ scheme = "https"
+ else:
+ scheme = "http"
+ url = scheme + "://" + site.domain + url
+ qr = pyqrcode.create(url, version=settings.ISHTAR_QRCODE_VERSION)
+ tmpdir_created = False
+ if not tmpdir:
+ tmpdir = tempfile.mkdtemp("-qrcode")
+ tmpdir_created = True
+ filename = tmpdir + os.sep + 'qrcode.png'
+ qr.png(filename, scale=settings.ISHTAR_QRCODE_SCALE)
+ self.qrcode.save(
+ "qrcode.png", File(open(filename, 'rb')))
+ self.skip_history_when_saving = True
+ self._no_move = True
+ self.save()
+ if tmpdir_created:
+ shutil.rmtree(tmpdir)
+
+
class DocumentItem(object):
@property
def images(self):
@@ -1738,6 +1777,7 @@ class BaseHistorizedItem(DocumentItem, FullSearch, Imported, JsonData,
All historized items are searchable and have a data json field.
"""
IS_BASKET = False
+ SHOW_URL = None
EXTERNAL_ID_KEY = ''
EXTERNAL_ID_DEPENDENCIES = []
HISTORICAL_M2M = []
@@ -1906,9 +1946,11 @@ class BaseHistorizedItem(DocumentItem, FullSearch, Imported, JsonData,
return values
def get_show_url(self):
+ show_url = self.SHOW_URL
+ if not show_url:
+ show_url = 'show-' + self.__class__.__name__.lower()
try:
- return reverse('show-' + self.__class__.__name__.lower(),
- args=[self.pk, ''])
+ return reverse(show_url, args=[self.pk, ''])
except NoReverseMatch:
return