Skip to content

Commit 1ffb4cf

Browse files
committed
refactor gsmap moel.save() to don't use signals, fixes save screenshot don't save bug
1 parent 85c860a commit 1ffb4cf

File tree

1 file changed

+43
-52
lines changed

1 file changed

+43
-52
lines changed

django/gsmap/models.py

Lines changed: 43 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -199,20 +199,6 @@ def create_screenshot_file(self, is_thumbnail=False):
199199
)
200200
return screenshot_file
201201

202-
def save(self, *args, **kwargs):
203-
def test_exists(pk):
204-
if list(self.__class__.objects.filter(pk=pk)):
205-
new_id = create_slug_hash_6()
206-
test_exists(new_id)
207-
else:
208-
return pk
209-
210-
if self._state.adding:
211-
self.id = create_slug_hash_6()
212-
self.id = test_exists(self.id)
213-
214-
super().save(*args, **kwargs)
215-
216202
def image_twitter(self):
217203
if bool(self.screenshot):
218204
return get_thumbnail(
@@ -235,53 +221,58 @@ def __str__(self):
235221
else:
236222
return self.title
237223

224+
def save(self, *args, **kwargs):
225+
def test_exists(pk):
226+
if list(self.__class__.objects.filter(pk=pk)):
227+
new_id = create_slug_hash_6()
228+
test_exists(new_id)
229+
else:
230+
return pk
231+
232+
if self._state.adding:
233+
self.id = create_slug_hash_6()
234+
self.id = test_exists(self.id)
235+
236+
if self.data:
237+
storage = OverwriteStorage()
238+
if self.permission is int(SnapshotPermission.PUBLIC):
239+
self.create_meta(storage)
240+
else:
241+
storage.delete(f'snapshot-meta/{self.id}.html')
242+
243+
super().save(*args, **kwargs)
238244

239-
@receiver(post_save, sender=Snapshot)
240-
def save_screenshot_handler(sender, **kwargs):
241-
instance = kwargs.get('instance')
245+
if hasattr(settings, 'SAVE_SCREENSHOT_ENABLED') and settings.SAVE_SCREENSHOT_ENABLED is True:
246+
self.create_screenshot()
242247

243-
def save_screenshot():
244-
post_save.disconnect(save_screenshot_handler, sender=Snapshot)
248+
super().save(*args, **kwargs)
249+
250+
def create_screenshot(self):
245251
# only create snapshot if data changed
246-
if instance.data_changed([
252+
if self.data_changed([
247253
'data', 'screenshot_generated', 'thumbnail_generated'
248-
]) or not bool(instance.thumbnail_generated):
249-
if not 'resources' in instance.data:
250-
return
251-
try:
252-
# disconnect to break save recursive loop
253-
post_save.disconnect(save_screenshot_handler, sender=Snapshot)
254-
screenshot_file = instance.create_screenshot_file()
255-
thumbnail_file = instance.create_screenshot_file(is_thumbnail=True)
256-
instance.screenshot_generated = screenshot_file
257-
instance.thumbnail_generated = thumbnail_file
258-
instance.save()
259-
finally:
260-
# always reconnect signal
261-
post_save.connect(save_screenshot_handler, sender=Snapshot)
262-
263-
def save_meta(storage):
254+
]) or not bool(self.thumbnail_generated):
255+
print('resources', 'resources' in self.data)
256+
if not 'resources' in self.data:
257+
raise ValueError('no resources key in data')
258+
259+
screenshot_file = self.create_screenshot_file()
260+
thumbnail_file = self.create_screenshot_file(is_thumbnail=True)
261+
self.screenshot_generated = screenshot_file
262+
self.thumbnail_generated = thumbnail_file
263+
264+
def create_meta(self, storage):
264265
domain = Site.objects.get_current().domain
265266
proto = 'https' if settings.USE_HTTPS else 'http'
266267
meta = f'''
267-
<meta property="og:title" content="{instance.title_data}">
268-
<meta property="og:description" content="{instance.description_data}">
268+
<meta property="og:title" content="{self.title_data}">
269+
<meta property="og:description" content="{self.description_data}">
269270
<meta property="og:type" content="website">
270-
<meta property="og:url" content="{proto}://{domain}{instance.get_absolute_url()}">
271-
<meta property="og:image" content="{proto}://{domain}/{instance.image_facebook()}">
272-
<meta name="twitter:image" content="{proto}://{domain}/{instance.image_twitter()}">
271+
<meta property="og:url" content="{proto}://{domain}{self.get_absolute_url()}">
272+
<meta property="og:image" content="{proto}://{domain}/{self.image_facebook()}">
273+
<meta name="twitter:image" content="{proto}://{domain}/{self.image_twitter()}">
273274
'''
274-
storage.save(f'snapshot-meta/{instance.id}.html', ContentFile(meta))
275-
276-
if hasattr(settings, 'SAVE_SCREENSHOT_ENABLED') and settings.SAVE_SCREENSHOT_ENABLED is True:
277-
save_screenshot()
278-
279-
if instance.data:
280-
storage = OverwriteStorage()
281-
if instance.permission is int(SnapshotPermission.PUBLIC):
282-
save_meta(storage)
283-
else:
284-
storage.delete(f'snapshot-meta/{instance.id}.html')
275+
storage.save(f'snapshot-meta/{self.id}.html', ContentFile(meta))
285276

286277

287278
class Workspace(models.Model):

0 commit comments

Comments
 (0)