1+ import os
2+
13from django .db import models
24from django .utils .translation import gettext_lazy as _
3-
45from base .models import Content
6+ from content .mixin import GeneratePreviewMixin
7+ from pdf2image import convert_from_path , convert_from_bytes
8+ from PIL import Image
9+ from pdf2image .exceptions import (
10+ PDFInfoNotInstalledError ,
11+ PDFPageCountError ,
12+ PDFSyntaxError
13+ )
14+
15+ from django .conf import settings
516
617
718class YTVideoContent (models .Model ):
@@ -15,6 +26,9 @@ class Meta:
1526 content = models .OneToOneField (Content , verbose_name = _ ("Content" ), on_delete = models .CASCADE , primary_key = True )
1627 url = models .URLField (verbose_name = _ ("Video URL" ))
1728
29+ def generate_preview (self ):
30+ return
31+
1832 @property
1933 def id (self ):
2034 return self .url .split ("=" )[1 ]
@@ -39,8 +53,42 @@ class Meta:
3953 def __str__ (self ):
4054 return f"{ self .content } : { self .image } "
4155
56+ def generate_preview (self ):
57+ # TODO generate small image previews
58+ return
59+
60+
61+ class PdfContent (models .Model , GeneratePreviewMixin ):
62+ TYPE = "Pdf"
63+ DESC = _ ("Pdf" )
64+
65+ class Meta :
66+ verbose_name = _ ("Pdf Content" )
67+ verbose_name_plural = _ ("Pdf Contents" )
68+
69+ content = models .OneToOneField (Content , verbose_name = _ ("Content" ), on_delete = models .CASCADE , primary_key = True )
70+ pdf = models .FileField (verbose_name = _ ("Pdf" ), upload_to = 'uploads/contents/%Y/%m/%d/' )
71+ source = models .TextField (verbose_name = _ ("Source" ))
72+ license = models .CharField (verbose_name = _ ("License" ), blank = True , max_length = 200 )
73+
74+ def generate_preview (self ):
75+ preview_folder = 'uploads/previews/'
76+ # Check if Folder exists
77+ if not os .path .exists (os .path .join (settings .MEDIA_ROOT ,preview_folder )):
78+ os .makedirs (os .path .join (settings .MEDIA_ROOT ,preview_folder ))
79+ base_filename = os .path .splitext (os .path .basename (self .pdf .name ))[0 ] + '.jpg'
80+ # get images for every page
81+ pages = convert_from_path (self .pdf .path , last_page = 2 )
82+ # save first page to disk
83+ pages [0 ].save (os .path .join (settings .MEDIA_ROOT ,preview_folder , base_filename ))
84+ return os .path .join (preview_folder , base_filename )
85+
86+ def __str__ (self ):
87+ return f"{ self .content } : { self .pdf } "
88+
4289
4390CONTENT_TYPES = {
4491 YTVideoContent .TYPE : YTVideoContent ,
4592 ImageContent .TYPE : ImageContent ,
93+ PdfContent .TYPE : PdfContent
4694}
0 commit comments