si l'image est donnée par url, on la récupère sur notre serveur

This commit is contained in:
Jean-Marie Favreau 2023-11-11 21:25:26 +01:00
parent fd9afa14e9
commit 165c997838
7 changed files with 57 additions and 14 deletions

View File

@ -59,6 +59,8 @@ services:
volumes: volumes:
- ./src:/usr/src/app/ - ./src:/usr/src/app/
- ./deployment/scripts:/app/deployment/scripts/ - ./deployment/scripts:/app/deployment/scripts/
- static_files:/usr/src/app/static
- media_files:/usr/src/app/media
env_file: .env env_file: .env
depends_on: depends_on:
- db - db

View File

@ -1,10 +1,17 @@
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from django.db import models
from selenium import webdriver from selenium import webdriver
from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.options import Options
import urllib.request
from django.core.files.uploadedfile import SimpleUploadedFile
from tempfile import NamedTemporaryFile
from urllib.parse import urlparse
import os
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
import json import json
@ -40,6 +47,26 @@ class Extractor:
logger.error(e) logger.error(e)
return None return None
def guess_filename(url):
a = urlparse(url)
return os.path.basename(a.path)
def download_media(url):
# first download file
basename = Extractor.guess_filename(url)
try:
tmpfile, _ = urllib.request.urlretrieve(url)
except:
return None
# if the download is ok, then create create the corresponding file object
return SimpleUploadedFile(basename, open(tmpfile, "rb").read())
class ExtractorFacebook(Extractor): class ExtractorFacebook(Extractor):
class SimpleFacebookEvent: class SimpleFacebookEvent:
@ -164,6 +191,10 @@ class ExtractorFacebook(Extractor):
def build_event(self, url): def build_event(self, url):
from .models import Event from .models import Event
image = self.get_element("image")
local_image = None if image is None else Extractor.download_media(image)
return Event(title=self.get_element("name"), return Event(title=self.get_element("name"),
status=Event.STATUS.DRAFT, status=Event.STATUS.DRAFT,
start_day=self.get_element_datetime("start_timestamp"), start_day=self.get_element_datetime("start_timestamp"),
@ -172,6 +203,7 @@ class ExtractorFacebook(Extractor):
end_time=self.get_element_datetime("end_timestamp"), end_time=self.get_element_datetime("end_timestamp"),
location=self.get_element("event_place_name"), location=self.get_element("event_place_name"),
description=self.get_element("description"), description=self.get_element("description"),
local_image=local_image,
image=self.get_element("image"), image=self.get_element("image"),
image_alt=self.get_element("image_alt"), image_alt=self.get_element("image_alt"),
reference_urls=[url]) reference_urls=[url])

View File

@ -217,4 +217,10 @@ msgid "Text as shown to the visitors"
msgstr "Text tel que présenté aux visiteureuses" msgstr "Text tel que présenté aux visiteureuses"
msgid "Content" msgid "Content"
msgstr "Contenu" msgstr "Contenu"
msgid "Illustration (local image)"
msgstr "Illustration (image locale)"
msgid "Illustration image stored in the agenda server"
msgstr "Image d'illustration stockée sur le serveur de l'agenda"

View File

@ -107,6 +107,8 @@ class Event(models.Model):
description = models.TextField(verbose_name=_('Description'), help_text=_('General description of the event'), blank=True, null=True) description = models.TextField(verbose_name=_('Description'), help_text=_('General description of the event'), blank=True, null=True)
local_image = models.ImageField(verbose_name=_('Illustration (local image)'), help_text=_("Illustration image stored in the agenda server"), max_length=1024, blank=True, null=True)
image = models.URLField(verbose_name=_('Illustration'), help_text=_("URL of the illustration image"), max_length=1024, blank=True, null=True) image = models.URLField(verbose_name=_('Illustration'), help_text=_("URL of the illustration image"), max_length=1024, blank=True, null=True)
image_alt = models.CharField(verbose_name=_('Illustration description'), help_text=_('Alternative text used by screen readers for the image'), blank=True, null=True, max_length=1024) image_alt = models.CharField(verbose_name=_('Illustration description'), help_text=_('Alternative text used by screen readers for the image'), blank=True, null=True, max_length=1024)
@ -145,6 +147,7 @@ class Event(models.Model):
return self.status == Event.STATUS.TRASH return self.status == Event.STATUS.TRASH
class EventSubmissionForm(models.Model): class EventSubmissionForm(models.Model):
url = models.URLField(max_length=512, verbose_name=_('URL'), help_text=_("URL where this event can be found.")) url = models.URLField(max_length=512, verbose_name=_('URL'), help_text=_("URL where this event can be found."))

View File

@ -35,11 +35,11 @@
</em></p> </em></p>
{% endif %} {% endif %}
{% if event.image %} {% if event.image or event.local_image %}
<article class='illustration-small'> <article class='illustration-small'>
<img src="{{ event.image }}" alt="{{ event.image_alt }}" /> <img src="{% if event.local_image %}{{ event.local_image.url }}{% else %}{{ event.image }}{% endif %}" alt="{{ event.image_alt }}" />
</article> </article>
{% endif %} {% endif %}
<p>{{ event.description |truncatewords:20 |linebreaks }}</p> <p>{{ event.description |truncatewords:20 |linebreaks }}</p>

View File

@ -29,11 +29,11 @@
</em></p> </em></p>
{% endif %} {% endif %}
{% if event.image %} {% if event.image or event.local_image %}
<article class='illustration{% if display in "in list by day" %}-small{% endif %}'> <article class='illustration'>
<img src="{{ event.image }}" alt="{{ event.image_alt }}" /> <img src="{% if event.local_image %}{{ event.local_image.url }}{% else %}{{ event.image }}{% endif %}" alt="{{ event.image_alt }}" />
</article> </article>
{% endif %} {% endif %}
<p>{{ event.description |truncatewords:20 |linebreaks }}</p> <p>{{ event.description |truncatewords:20 |linebreaks }}</p>

View File

@ -19,9 +19,9 @@
</p> </p>
</header> </header>
{% if event.image %} {% if event.image or event.local_image %}
<article class='illustration{% if display in "in list by day" %}-small{% endif %}'> <article class='illustration'>
<img src="{{ event.image }}" alt="{{ event.image_alt }}" /> <img src="{% if event.local_image %}{{ event.local_image.url }}{% else %}{{ event.image }}{% endif %}" alt="{{ event.image_alt }}" />
</article> </article>
{% endif %} {% endif %}