Projet

Général

Profil

Development #10794

api d'abonnement et desabonnement aux categories par mail

Ajouté par Serghei Mihai il y a presque 8 ans. Mis à jour il y a environ 7 ans.

Statut:
Fermé
Priorité:
Haut
Assigné à:
Version cible:
-
Début:
02 mai 2016
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Conforme au protocole défini par la cellule "newsletter" de combo


Fichiers

Révisions associées

Révision e93ea142 (diff)
Ajouté par Serghei Mihai il y a presque 8 ans

api: newsletters retrieval endpoint (#10794)

Révision 8759c981 (diff)
Ajouté par Serghei Mihai il y a presque 8 ans

api: subscriptions management endpoint (#10794)

Historique

#1

Mis à jour par Serghei Mihai il y a presque 8 ans

Avec les tests lancés par tox pour django-1.7 et 1.8

#2

Mis à jour par Benjamin Dauvergne il y a presque 8 ans

Déjà j'utiliserai django-rest-framework sauf si tu veux redévelopper du code de validation de signature.

Pour le reste on colle trop à l'existant, donc je ne pense pas que la notion de canal soit utile, on devrait l'avoir déjà dans identifier en utilisant des schémas d'uri (tel:, mail:, etc..), et on se retrouve avec SubscriptionType et Subcription qui font la même chose. Mais c'est le futur, pour l'instant on va ignorer complètement les SMS on verra plus tard.

Il faut un seul modèle Subscription:

class Subscription(models.Model):
     category = FK(Category)
     identifier = URLField(blank=True)
     uuid = CharField(max_length=128, blank=True)

dans les appels au web-service si uuid est passé on l'enregistre, sinon on ne met rien. Lors des notifications de provisionning on pourra chercher des abonnements par uuid et éventuellement corriger les abonnements de type mailto: ou tel: en fonction. Pour l'abonnement homepage (en fait la génération d'un flux RSS) on met uuid et pas d'identifier.

Donc j'étendrai la cellule abonnement de combo pour envoyer aussi le uuid dans la query string, ensuite dans get_subscriptions j'utiliserai le queryset Subscription.objects.filter(Q(identifier="mailto:" + email)|Q(uuid=uuid)) dans tous les cas je mets homepage dans les transports (si on est abonné il n'y aucune raison de ne pas voir les news sur sa homepage) et si subscription.identifier == "mailto:" + email je renvoi aussi le transport "email". Attention à bien utiliser get_or_create(), s'il existe déjà un abonnement pour cet email mais sans uuid, on le met à jour avec l'uuid.

Dans update_subscription idem, si j'ai email je crée un abonnement avec un identifier mailto: et un uuid (si j'en ai un) et si j'ai juste homepage je ne crée un abonnement qu'avec uuid, si aucun transport je supprime toutes les abonnements ayant cet email ou cet uuid pour la catégorie concernée.

#4

Mis à jour par Benjamin Dauvergne il y a presque 8 ans

mobile et mail ne sont pas des identifiants de scheme d'URL valides, j'enlèverai complètement le fichier channels.py, j'ignorerai complètement qu'on pourrait un jour envoyer des SMS et je mettrai en dur les deux transports qui existent vraiment, soit "homepage" et "email".

class NewslettersView(APIView):
    def get(self, request):
        newsletters = []
        transports = [{'id': 'email', 'text': _('Email')}, {'id': 'homepage', 'text': _('Homepage')}]
        for c in Category.objects.all():
            newsletter = {'id': str(c.pk), 'text': c.name, 'transports': transports}
            newsletters.append(newsletter)
        return Response({'data': newsletters})

Si email alors identifier = "mailto:" + email (on met ce code en dur dans update_subscriptions), voilà tout.

def update_subscriptions(self, category_id, transports, email=None, uuid=None):
    uuid = uuid or u''
    identifier = u'mailto:' + (email or '')
    try:
        cat = Category.objects.get(pk=category_id)
    except Category.DoesNotExist:
        return

    subcriptions = cat.subcription_set

    if email:
        if 'email' in transports:
            subscriptions.get_or_create(identifier=identifier, uuid=uuid)
            if uuid:  # delete simple other email subscriptions
                subscriptions.exclude(uuid=uuid).filter(identifier=identifier).delete()
        else:
            subscriptions.filter(identifier=identifier).delete()
    if uuid:
        if 'homepage' in transports:
            subscriptions.get_or_create(uuid=uuid)
        else:  # delete simple homepage subscriptions                                                                                                                           
            subscriptions.filter(identifier='', uuid=uuid).delete()

Il faudrait un index unique sur (category, identifier, uuid) sinon les get_or_create() vont foirer. Il faudrait mettre le décorateur @atomic sur cette méthode.

#5

Mis à jour par Serghei Mihai il y a presque 8 ans

Benjamin Dauvergne a écrit :

mobile et mail ne sont pas des identifiants de scheme d'URL valides, j'enlèverai complètement le fichier channels.py, j'ignorerai complètement qu'on pourrait un jour envoyer des SMS et je mettrai en dur les deux transports qui existent vraiment, soit "homepage" et "email".

J'imaginais les classes dans channels.py avec ses méthodes send qui implementerait chacune son mode d'envoie, mais ok, partons sans pour l'instant

#6

Mis à jour par Benjamin Dauvergne il y a presque 8 ans

Non mort à l'abstraction.

#8

Mis à jour par Benjamin Dauvergne il y a presque 8 ans

Le champ channel sur Broadcast et AnnounceForm ne m'a plus l'air utile non plus, pour l'instant on broadcast vers des mails et c'est tout.

#9

Mis à jour par Serghei Mihai il y a presque 8 ans

  • Fichier 0002-api-subscriptions-management-endpoint-10794.patch ajouté

Yep, je le vire dans le 0002

#10

Mis à jour par Serghei Mihai il y a presque 8 ans

  • Fichier 0002-api-subscriptions-management-endpoint-10794.patch supprimé
#12

Mis à jour par Serghei Mihai il y a presque 8 ans

  • Statut changé de En cours à Résolu (à déployer)
commit d0250b73c4ac2687e6e7dc27baeb261ce2f76559
Author: Serghei Mihai <smihai@entrouvert.com>
Date:   Mon May 2 15:32:52 2016 +0200

    api: subscriptions management endpoint (#10794)
#13

Mis à jour par Serghei Mihai il y a environ 7 ans

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF