22import string
33from enum import IntFlag
44import requests
5+ import os
56from django .utils import timezone
67from django .db .models .signals import post_save
78from django .dispatch import receiver
1112from django .contrib .sites .models import Site
1213from django .utils .html import format_html
1314from django .conf import settings
15+ from django .core .files .base import ContentFile
16+ from django .core .files .storage import FileSystemStorage
1417from sortedm2m .fields import SortedManyToManyField
15- from sorl .thumbnail import ImageField
18+ from sorl .thumbnail import ImageField , get_thumbnail
1619from gsuser .models import User
1720
1821
22+ class OverwriteStorage (FileSystemStorage ):
23+ def get_available_name (self , name , max_length = None ):
24+ # If the filename already exists, remove it as if it was a true file system
25+ if self .exists (name ):
26+ os .remove (os .path .join (settings .MEDIA_ROOT , name ))
27+ return name
28+
29+
1930class Municipality (models .Model ):
2031 class Meta :
2132 verbose_name_plural = 'municipalities'
@@ -146,8 +157,9 @@ def thumbnail(self):
146157
147158 def get_absolute_link (self ):
148159 domain = Site .objects .get_current ().domain
160+ proto = 'https' if settings .USE_HTTPS else 'http'
149161 return format_html (
150- f'<a href="//{ domain } { self .get_absolute_url ()} " target="_blank">'
162+ f'<a href="{ proto } : //{ domain } { self .get_absolute_url ()} " target="_blank">'
151163 f'{ domain } { self .get_absolute_url ()} </a>'
152164 )
153165 get_absolute_link .short_description = "Snapshot Url"
@@ -205,9 +217,10 @@ def __str__(self):
205217
206218@receiver (post_save , sender = Snapshot )
207219def save_screenshot_handler (sender , ** kwargs ):
220+ instance = kwargs .get ('instance' )
221+
208222 def save_screenshot ():
209223 post_save .disconnect (save_screenshot_handler , sender = Snapshot )
210- instance = kwargs .get ('instance' )
211224 # only create snapshot if data changed
212225 if instance .data_changed ([
213226 'data' , 'screenshot_generated' , 'thumbnail_generated'
@@ -225,9 +238,27 @@ def save_screenshot():
225238 finally :
226239 # always reconnect signal
227240 post_save .connect (save_screenshot_handler , sender = Snapshot )
241+
242+ def save_meta (storage ):
243+ domain = Site .objects .get_current ().domain
244+ proto = 'https' if settings .USE_HTTPS else 'http'
245+ meta = f'''name="og:title" content="{ instance .title } "
246+ name="og:url" content="{ instance .get_absolute_link ()} "
247+ name="og:image" content="{ proto } ://{ domain } /{ instance .image_facebook ()} "
248+ name="twitter:image" content="{ proto } ://{ domain } /{ instance .image_twitter ()} "
249+ '''
250+ storage .save (f'snapshot-meta/{ instance .id } .html' , ContentFile (meta ))
251+
228252 if hasattr (settings , 'SAVE_SCREENSHOT_ENABLED' ) and settings .SAVE_SCREENSHOT_ENABLED is True :
229253 save_screenshot ()
230254
255+ if instance .screenshot :
256+ storage = OverwriteStorage ()
257+ if instance .permission is int (SnapshotPermission .PUBLIC ):
258+ save_meta (storage )
259+ else :
260+ storage .delete (f'snapshot-meta/{ instance .id } .html' )
261+
231262
232263class Workspace (models .Model ):
233264 class Meta :
@@ -246,9 +277,10 @@ class Meta:
246277 snapshots = SortedManyToManyField (Snapshot )
247278
248279 def get_absolute_link (self ):
280+ proto = 'https' if settings .USE_HTTPS else 'http'
249281 domain = Site .objects .get_current ().domain
250282 return format_html (
251- f'<a href="//{ domain } { self .get_absolute_url ()} " target="_blank">'
283+ f'<a href="{ proto } : //{ domain } { self .get_absolute_url ()} " target="_blank">'
252284 f'{ domain } { self .get_absolute_url ()} </a>'
253285 )
254286 get_absolute_link .short_description = "Workspace Url"
@@ -257,7 +289,6 @@ def get_absolute_url(self):
257289 first_id = self .snapshots .all ().first ().id
258290 return f'/{ self .id } /{ first_id } /'
259291
260-
261292 def save (self , * args , ** kwargs ):
262293 def test_exists (pk ):
263294 if self .__class__ .objects .filter (pk = pk ):
0 commit comments