add choosit newletters gateway (via register)

This commit is contained in:
Thomas NOËL 2013-06-18 17:53:11 +02:00
parent 30afd0a35d
commit d8c316bfba
4 changed files with 132 additions and 2 deletions

View File

@ -1,11 +1,19 @@
from django.contrib import admin
from .models import ChoositSMSGateway
from .models import ChoositSMSGateway, ChoositRegisterGateway, ChoositRegisterNewsletter
class ChoositSMSGatewayAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('title',)}
list_display = ['title', 'slug', 'description', 'key',
'default_country_code']
admin.site.register(ChoositSMSGateway, ChoositSMSGatewayAdmin)
class ChoositRegisterGatewayAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('title',)}
admin.site.register(ChoositRegisterGateway, ChoositRegisterGatewayAdmin)
admin.site.register(ChoositRegisterNewsletter)

View File

@ -0,0 +1,72 @@
import requests
import json
import hashlib
class ChoositRegisterWS(object):
def __init__(self, url, key):
self.url = url
self.key = key
def categories(self):
return requests.post(self.url, data={'action': 'read'}).json()
def create(self, newsletter, email):
return requests.post(self.url, data={'action': 'create', 'email': email,
'newsletter': newsletter, 'hash': hashlib.sha1(self.key+email).hexdigest()
}).json()
def delete(self, newsletter, email):
return requests.post(self.url, data={'action': 'delete', 'email': email,
'newsletter': newsletter, 'hash': hashlib.sha1(self.key+email).hexdigest()
}).json()
def update(self, subscriptions, email):
'''Returns { 'email': 'bdauvergne@entrouvert.com',
'hash': 'ab60e5e1b226561092c082ca73a2ad9ee4527c7b',
'status': 'ok'}
or
{ 'email': 'bdauvergne@entrouvert.com',
'hash': 'ab60e5dgd34543543',
'status': 'nok',
'error': 'error message'}
'''
if isinstance(subscriptions, basestring):
subscriptions = subscriptions.split(',')
params = {
'action': 'update',
'email': email,
'hash': hashlib.sha1(self.key+email).hexdigest()
}
for i, subscription in enumerate(subscriptions):
params['subscriptions[%d]'% i] = subscription
res = requests.post(self.url, data=params)
print res.request.body
return res.json()
def subscriptions(self, email):
'''Returns { 'email': 'johndoe@example.com',
'hash': 'ef787...',
'newsletters': { '1': 'newsletter 1', ... },
'subscriptions': [ '1' ] }
'''
return requests.post(self.url, data={'action': 'read', 'email': email,
'hash': hashlib.sha1(self.key+email).hexdigest()}).json()
def newsletters(self, categories):
params = {'action': 'read_newsletters'}
for i, categorie in enumerate(categories):
params['categories[%d]' % i] = categorie
return requests.post(self.url, data=params).json()
if __name__ == '__main__':
import sys
# ne fonctionne que depuis lantana
# examples:
# python choosit.py 'https://emailingeco.montpellier-agglo.com/ws/index.php' mykey subscriptions 'bdauvergne@entrouvert.com'
# python choosit.py 'https://emailingeco.montpellier-agglo.com/ws/index.php' mykey update '315,316' 'bdauvergne@entrouvert.com'
ws = ChoositRegisterWS(sys.argv[1], sys.argv[2])
func = getattr(ws, sys.argv[3])
import pprint
pprint.pprint(func(*sys.argv[4:]))

View File

@ -6,6 +6,10 @@ import json
from django.db import models
from passerelle.messages.models import MessageGateway
from passerelle.register.models import RegisterGateway
from .choosit import ChoositRegisterWS
class ChoositError(Exception):
pass
@ -50,3 +54,48 @@ class ChoositSMSGateway(MessageGateway):
raise ChoositError(output['error'].encode('utf-8'))
return { 'message': output.get('result') }
class ChoositRegisterNewsletter(models.Model):
name = models.CharField(max_length=16)
description = models.CharField(max_length=128, blank=True)
def __unicode__(self):
return u'%s: %s' % (self.name, self.description or u'<unnamed>')
class ChoositRegisterGateway(RegisterGateway):
url = models.CharField(max_length=200)
key = models.CharField(max_length=64)
newsletters = models.ManyToManyField(ChoositRegisterNewsletter,
blank=True)
def get_list(self, user):
reg = ChoositRegisterWS(self.url, self.key)
ws = reg.subscriptions(email=user or '')
newsletters = ws['newsletter']
subscriptions = ws['subscriptions']
filters = dict([(n.name, n.description) for n in self.newsletters.all()])
if filters:
for name in newsletters.copy():
if name not in filters:
del newsletters[name]
elif filters[name]:
newsletters[name] = filters[name]
ret = []
for id, name in newsletters.items():
newsletter = {
'name': id,
'description': name,
'transports': { 'available': ['mail'] }
}
if id in subscriptions:
newsletter['transports']['defined'] = ['mail']
ret.append(newsletter)
return ret
def post(self, user, data):
pass

View File

@ -5,3 +5,4 @@ django-model-utils
SOAPpy
phpserialize
mako
requests