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 là 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' )