Projet

Général

Profil

Development #10639

cellule générique remontée info json

Ajouté par Frédéric Péters il y a environ 8 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
13 avril 2016
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Codée en cours de formation Strasbourg; à reprendre de manière sérieuse.

@register_cell_class
class JsonCell(CellBase):
    title = models.CharField(_('Title'), max_length=150, blank=True)
    url = models.URLField(_('URL'), blank=True)
    template_string = models.TextField(_('Template'), blank=True, null=True)

    template_name = 'combo/json-cell.html'

    class Meta:
        verbose_name = _('JSON Feed')

    def is_visible(self, user=None):
        return bool(self.url) and super(JsonCell, self).is_visible(user=user)

    def get_cell_extra_context(self, context):
        context = super(JsonCell, self).get_cell_extra_context(context)
        cache_key = hashlib.md5(self.url).hexdigest()
        feed_content = cache.get(cache_key)
        if not feed_content:
            feed_response = requests.get(self.url)
            if feed_response.status_code == 200:
                feed_content = feed_response.content
                cache.set(cache_key, feed_content, 600)
        if feed_content:
            context['data'] = json.loads(feed_content)
        return context

    def render(self, context):
        cache_key = hashlib.md5(self.url).hexdigest()
        feed_content = cache.get(cache_key)
        if not context.get('synchronous') and feed_content is None:
            raise NothingInCacheException()
        context.update(self.get_cell_extra_context(context))
        tmpl = Template(self.template_string)
        return tmpl.render(context)

Fichiers

Révisions associées

Révision 0820f887 (diff)
Ajouté par Frédéric Péters il y a environ 7 ans

general: add new json content cell (#10639)

Historique

#1

Mis à jour par Thomas Noël il y a plus de 7 ans

Le retour des blurps. Je dirais qu'il manque :
  • la signature automatique de l'URL si c'est un site du cercle de confiance hobo
  • le paramétrage du délai de cache, parce que 10min c'est long
  • la possibilité de poser un NameID ou email dans l'URL : des variables dans URL ? (ou bien une case à cocher "add nameid in querystring")
#2

Mis à jour par Frédéric Péters il y a plus de 7 ans

la signature automatique de l'URL si c'est un site du cercle de confiance hobo

C'est le cas automatiquement avec from combo.utils import requests.

le paramétrage du délai de cache, parce que 10min c'est long

Ok pour avoir un paramètre là-dessus; les dix minutes ici ça vient juste du copié/collé de FeedCell, et comme à la formation il s'agissait d'afficher les horaires des piscines, c'était bien assez.

la possibilité de poser un NameID ou email dans l'URL : des variables dans URL ? (ou bien une case à cocher "add nameid in querystring")

Un <select> avec comme possibilités : appel anonyme, appel avec l'adresse email de l'usager, appel avec l'identifiant de l'usager ? (ici aussi, pour les piscines, c'était pas vraiment une question).

Aussi, j'ajouterais une sélection dynamique du nom du template, pour un retour en fanfare de http://doc.entrouvert.org/portail-citoyen/dev/ , i.e. si c'est du json avec une clé data, si dedans il y a title/url(/description) comme attributs, alors on prend combo/json-list-cell.html, s'il y a des clés data et columns on prend combo/json-table-cell.html, et ainsi de suite pour d'autres formats qu'on "normaliserait". Liberté laissée bien sûr d'overrider ça en posant un slug et un tempate custom.

#3

Mis à jour par Frédéric Péters il y a environ 7 ans

Un <select> avec comme possibilités : appel anonyme, appel avec l'adresse email de l'usager, appel avec l'identifiant de l'usager ?

J'ai laissé ça sur le côté, me disant aussi qu'on allait prochainement pouvoir se mettre à gérer [email] ou [name_id] dans les URL.

#4

Mis à jour par Frédéric Péters il y a environ 7 ans

Pour que la signature ait bien lieu il faut explicitement passer remote_service='auto', patch adapté.

#5

Mis à jour par Thomas Noël il y a environ 7 ans

je dirais :
  • ajouter un accept: application/json lors de l'appel
  • ne mettre en cache que si le json.loads n'a pas explosé
  • gérer les err!=0 (bon, ça pourrait être dans un patch plus tard, mais sinon déjà renommer json-no-content-cell.html en json-error-cell.html)
  • retirer le debug dans json-cell.html
  • virer le template_name = 'combo/json-cell.html' parce que y'a la property ensuite

voilà

#6

Mis à jour par Frédéric Péters il y a environ 7 ans

gérer les err!=0 (bon, ça pourrait être dans un patch plus tard, mais sinon déjà renommer json-no-content-cell.html en json-error-cell.html)

J'ai pris l'option de ne rien faire de particulier, à voir à l'usage si c'est intéressant de gérer ça de manière unifiée ou si ça sera mieux géré depuis le template même.

retirer le debug dans json-cell.html

En fait ce template ne devrait pas se trouver être utilisé, il devrait toujours y avoir un vrai template basé sur le slug; en attendant garder le résultat en commentaire peut être un tout petit peu utile quand même.

#7

Mis à jour par Thomas Noël il y a environ 7 ans

Ack

#8

Mis à jour par Frédéric Péters il y a environ 7 ans

  • Statut changé de En cours à Résolu (à déployer)
commit 0820f8870e2e6e386e4f8b6676059047a91db1e4
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Fri Feb 10 08:32:58 2017 +0100

    general: add new json content cell (#10639)
#9

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF