drupal2spip_lal/drupal2spip_lal/base/convert.py

90 lines
2.8 KiB
Python
Raw Normal View History

from datetime import datetime
from django.utils.timezone import make_aware, now
from drupal2spip_lal.drupal import models as drupal
from drupal2spip_lal.spip import models as spip
# Questions
# - quelle utilisation des rubriques ?
# - quelle hiérarchie des mots clés ?
# - autobr sélectif ?
def convert_timestamp(timestamp):
return make_aware(datetime.fromtimestamp(timestamp))
def sanitarize_html(html):
# FIXME: bs4
return html
def convert_node(node, update=False):
"""
Le point d'entrée fonctionnel c'est les Urls.
On se base donc dessus pour vérifier si l'import
est à faire ou pas ou encore à upgrader.
"""
node_urls = drupal.UrlAlias.objects.filter(src='node/{}'.format(node.pk))
spip_urls = spip.Urls.objects.filter(
type='article', url__in=list(node_urls.values_list('dst', flat=True))
)
spip_urls.count()
if spip_urls.exists() and (
sorted(spip_urls.values_list('url', flat=True))
!= sorted(node_urls.values_list('dst', flat=True))
or len(set(spip_urls.values_list('id_objet', flat=True))) != 1
):
# incohérence dans les urls
raise NotImplementedError
article = None
article_attributes = {
'date': convert_timestamp(node.published_revision.timestamp),
'date_modif': convert_timestamp(node.changed),
'date_redac': convert_timestamp(node.created),
'descriptif': sanitarize_html(node.published_revision.teaser),
'maj': convert_timestamp(node.changed),
'statut': 'publie' if node.status else 'prepa',
'texte': sanitarize_html(node.published_revision.body),
'titre': node.title,
}
if not spip_urls.exists():
article = spip.Articles.objects.create(**article_attributes)
urls = [
spip.Urls(
id_objet=article.pk,
url=node_url.dst,
date=convert_timestamp(node.created),
)
for node_url in node_urls
]
spip.Urls.objects.bulk_create(urls)
print('Article {} created from node {}.'.format(article.pk, node.pk))
elif update:
article = spip.Articles(
pk=spip_urls.last().id_objet, **article_attributes
)
article.save()
print('Article {} updated from node {}.'.format(article.pk, node.pk))
if article:
user_attributes = {
'nom': node.user.name,
'email': node.user.mail,
'en_ligne': convert_timestamp(node.user.access),
'maj': convert_timestamp(node.user.created),
}
auteur, _ = spip.Auteurs.objects.update_or_create(
login=node.user.name, defaults=user_attributes
)
spip.AuteursLiens.objects.update_or_create(
auteur=auteur, id_objet=article.pk, objet='article'
)